如何在PHP中检查MySQL数据库中的值是否存在?

3
我是一个新手PHP程序员,想要编写一个脚本来检查我的MySQL数据库中是否存在邮件地址。数据库名称为"Fily_Registrations",表名为"users",值称为"email"。因此,如果一个邮件地址"hi@all.com"存在于我的数据库中,并且我调用php脚本的网址为"http://path/to/php.php?email=hi@all.com",则应该输出"YES",如果不存在,则应该输出"NO"。
以下是我目前的代码,但它总是输出"NO":
<?php

$email = $_GET["email"];
$DataBase = "Fily_Registrations";
mysql_connect("server", "username", "password") or die(mysql_error());
mysql_select_db($DataBase) or die(mysql_error());
$string = sprintf("SELECT '$DataBase' FROM users WHERE email = '$email'");
$query = msql_query($string);
if($query == false) {
     echo("No");
} else {
    echo("Yes");
}
?>

有人知道如何解决这个问题吗?


可以使用mysql_num_rows($query)函数来获取查询结果的行数,如果为0则表示没有数据,否则就有数据。 - Abhik Chakraborty
代码非常容易受攻击。这里存在多个攻击向量:您正在使用未带参数的sprintf()函数,并将用户定义的值插入查询中而没有对它们进行转义。 - Linus Kleen
1
你的查询语法似乎有问题。 应该是 SELECT [column_name] FROM [table_name] WHERE [condition] 而不是 SELECT [db_name] FROM [table_name] WHERE [condition] - TranQ
3个回答

5
如果数据库名称为Fily_Registrations,则查询语句是错误的。请尝试以下内容:
$email = mysql_real_escape($_GET["email"]);
$DataBase = "Fily_Registrations";
mysql_connect("server", "username", "password") or die(mysql_error());
mysql_select_db($DataBase) or die(mysql_error());
$query = "SELECT * FROM users WHERE email = '{$email}'";
$result = mysql_query($query);
echo (mysql_num_rows($result) == 0) ? 'NO' : 'YES';

如果查询不正确,mysql_query会返回false。首先阅读http://pl1.php.net/mysql_query,并考虑使用PDO (http://pl1.php.net/pdo)而不是普通的mysql_query。


谢谢,这个答案有效。我会查看你的链接! - David Gölzhäuser

0

你的代码应该像这样:

<?php

$email = $_GET["email"];
$DataBase = "Fily_Registrations";
mysql_connect("server", "username", "password") or die(mysql_error());
mysql_select_db($DataBase) or die(mysql_error());
$string = mysql_real_escape("SELECT * FROM users WHERE email = '$email'");
$query = msql_query($string);
if($query) {
     echo mysql_num_rows($query) > 0 ? "YES" : "NO";
} else {
    echo("====some error===");
}
?>

mysql_num_rows:http://pt1.php.net/manual/zh/function.mysql-num-rows.php mysql_real_escape:http://pt2.php.net/mysql_real_escape_string


一个好的回答应该解决这个问题。请这样做。不要只是复制粘贴原帖中的代码并进行更正。相反,明确地提示mysql_num_rows()并告诉他/她它的重要性。 - Linus Kleen

0

目前还不是非常安全,但已经有所改善。

  • 使用mysql_real_escape检查电子邮件中的不安全引号。但是不要过于信任这个想法,可能需要进行一些额外的正则表达式检查。
  • 准备好的语句不允许在参数内部执行隐藏的mysql代码。

    $email = mysql_real_escape($_GET["email"]);
    try {
     $connect = new PDO("mysql:host=server;dbname=Fily_Registrations;port=3306", "user", "password");
    }catch(PDOException $e) {
      print "错误信息: " . $e->getMessage();
      die();
    }
    
    $q= "SELECT * FROM users WHERE email = :EMAIL";
    $statement = $connect->prepare($q);
    $status = $statement->execute(array(":EMAIL"=>$email));
    
    if (($status) && ($statement->rowCount() > 0))
    {
      echo "是";
    } else {
      echo "否";
    }
    

敬启者,卡里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接