【问题标题】:e-mail field cannot be verified while the firstname and lastname works like charm当名字和姓氏像魅力一样工作时,无法验证电子邮件字段
【发布时间】:2013-03-05 18:00:25
【问题描述】:

我是 PHP 新手,我正在尝试创建一个系统,用户将在其中添加名字、姓氏和电子邮件地址。基本上我要做的是验证电子邮件是否已经存在于数据库中。

已经工作了几个小时,但它不起作用。但是当我尝试验证名字和姓氏时,它们都有效。

但是对于电子邮件字段...代码无法比较是否存在重复值。数据库中有很多重复的电子邮件 ID,但代码会忽略它并插入值:/。同时,如果我尝试验证重复的名字和姓氏,它可以工作

请帮忙:(

$firstname=$_POST['firstname'];
$lastname=$_POST['lastname'];
$email=$_POST['email'];
$firstname= stripslashes($firstname);
$lastname= stripslashes($lastname);
$email= stripslashes($email);
$host="localhost";
$user="root";
$pass="";
$db="site";
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db,$link);
$test="SELECT * FROM email_list WHERE email = '$email' ";   

$select=mysql_query($test);
if(mysql_num_rows($select)>0)       
{
    echo "Email already exists".$email."<br>";
    echo "Please enter another email";
}
else
{
    $query="INSERT into email_list (first_name, last_name, email) values ('$firstname', '$lastname', '$email')";
    mysql_query($query);
    echo "values entered" .$firstname. "<br>". $lastname. "<br>". $email;   
}

【问题讨论】:

  • 不确定这是否是问题所在,但请尝试WHERE email='$email' 而不是WHERE email = '$email'
  • 不鼓励在 PHP 中使用 mysql_* 函数,而建议使用 PDOMySQLi (find out why)。
  • 嗨。您能否在您的数据库定义中发布 - CREATE TABLE email_list (...) 命令?

标签: php mysql sql email-validation


【解决方案1】:

我将“$email”变量括在括号中,它对我有用。

$test= "SELECT Password FROM persons WHERE Email=('$email')";

【讨论】:

    【解决方案2】:

    一切看起来都还不错,但请检查您在数据库中定义的电子邮件长度,如果它与您发送的电子邮件匹配,请尝试在您的表单上打印正在接受的电子邮件。喜欢

    Print $email ;
    

    我会建议你将“mysql”的所有名称更改为“mysqli”

    【讨论】:

      【解决方案3】:

      我非常同意那个指出应该避免使用 mysql_query 和 mysql 的人(也因为他们迟早会弃用它)。你想切换到 MySQLi 或其他任何东西。这就是说,您不是在检查错误。与数据库的连接是否失败?你永远不会知道。 $test 会失败吗?你也永远不会知道。 尝试使用“or die()”进行调试(N.B.: 或 die(); 强烈建议不要使用!但是,如果它没有在生产中使用它就足够了)。

      mysql_select_db($db,$link) or die("cannot open db");
      $select=mysql_query($test) or die ("cannot select the email");
      

      编辑:要检查电子邮件是否在数据库中,您可能需要一个函数来执行此操作。或者,如果您不想将其放入函数中,请尝试以这种方式编辑

      $test="SELECT * FROM email_list WHERE email = '$email' ";   
      $select=mysql_query($test);
      if(mysql_num_rows($select)!=0) //different from 0   
      {
          echo "Email already exists".$email."<br>";
          echo "Please enter another email";
      }
      

      我希望这会有所帮助。

      【讨论】:

      • 我相信他的意思是他的代码可以工作并保存记录,但会一遍又一遍地保存同一封电子邮件。也就是说,他的查询和代码是正常的,否则就无法插入新条目。恕我直言
      • 解决了!我的愚蠢错误:(我输入的电子邮件地址比我为电子邮件字段分配的值长:(所以电子邮件会自动缩短:(
      【解决方案4】:

      基本调试步骤:

      1. mysql_query() 可以失败。你不测试它。测试一下:

        $select=mysql_query($test);
        if(!$select){
            die(mysql_error());
        }
        
      2. 如果mysql_num_rows() 永远不会大于零,您应该找出它是什么:

        var_dump(mysql_num_rows($select));
        

        此功能不适用于所有可能的配置。

      3. 您运行 SELECT 查询?你对结果集不好奇吗?抓取并打印所有行。

      另外:

      • SQL 比SELECT * FROM table 多。如果要数数,可以在SQL中数数:

        SELECT COUNT(*) AS dupes FROM email_list
        
      • 您使用的 MySQL 扩展将在下一个主要 PHP 版本发布时被删除。

      • 我在外面看到stripslashes()magic quotes 功能令人讨厌、无用且已弃用。

      • 确保您阅读并理解How to prevent SQL injection in PHP?

      【讨论】:

      • 谢谢我想通了!!!这是一个愚蠢的错误!电子邮件字段是 email_filed varchar(20),而插入的电子邮件地址比那个长,因此它会自动被修剪并且不会验证:P 抱歉给各位带来麻烦,但感谢您的努力!再次感谢:)
      • @himalayageek - 电子邮件列必须是 VARCHAR(254)
      【解决方案5】:

      首先,您可以从下面的 cmets 中看到您的问题 mysql_* 不再被推荐。如果您喜欢程序方法,请尝试使用 mysqli_* 函数,但这不是重点。

      您上面的代码似乎没有任何明显的错误,但是将原始输入插入数据库是一件危险的事情 - 您应该(至少)更改您的 INSERT 和 SELECT 语句,以便所有文本输入都包含在 mysql_real_escape_string()功能。 然后 select 语句将如下所示:

      "SELECT * FROM email_list WHERE email = '".mysql_real_escape_string($email)."' ";
      

      这不会改变您的代码的行为,它只会确保如果有人在 $email 字段中输入废话,它将被保存为输入的内容(不会使您的代码崩溃)或者如果他们试图“破解”(注入) 你的 mysql 查询他们不会成功。

      我在这里猜测(因为我没有太多信息可以使用)email_list 表中的 email 字段太短 - 并且可能只保存任何输入的电子邮件地址的前 16 个字符 - 这反过来也不会帮助您确定电子邮件地址是否存在,因为您正在将输入的 joe@test.comjoe@test.c 进行比较(如果您的 @ 987654327@字段被定义为char(10)

      【讨论】:

      • 谢谢我想通了!!!这是一个愚蠢的错误!电子邮件字段是 email_filed varchar(20),而插入的电子邮件地址比那个长,因此它会自动被修剪并且不会验证:P 抱歉给各位带来麻烦,但感谢您的努力!再次感谢:)
      • @himalayageek 你好。没问题 :) 如果您的问题已解决,您是否会接受其中一个答案作为您的解决方案(您最喜欢的答案左侧的“粗”符号)以“关闭”这个问题以及是否有任何答案帮助您,您可以为它投票以表示感谢:)。干杯:)
      猜你喜欢
      • 2019-03-03
      • 2020-10-24
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多