0

我是 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;   
}
4

5 回答 5

0

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

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

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

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

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

于 2013-03-17T09:47:22.543 回答
0

基本调试步骤:

  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()外面。魔术引号功能令人讨厌,无用且已弃用。

  • 确保您阅读并理解如何防止 PHP 中的 SQL 注入?.

于 2013-03-17T09:47:28.733 回答
0

我非常同意指出应该避免使用 mysql_query 和 mysql 的人(也因为他们迟早会弃用它)。你想切换到 MySQLi 或其他任何东西。这就是说,您不是在检查错误。与数据库的连接是否失败?你永远不会知道。会 $test失败吗?你也永远不会知道。尝试使用“ or die()”进行调试(NB: 或 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";
}

我希望这有帮助。

于 2013-03-17T09:48:10.647 回答
0

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

Print $email ;

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

于 2016-07-16T20:08:43.740 回答
0

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

$test= "SELECT Password FROM persons WHERE Email=('$email')";
于 2016-07-16T19:55:20.960 回答