【问题标题】:How to check if value exists in MySQL Database in PHP?如何在 PHP 中检查 MySQL 数据库中是否存在值?
【发布时间】:2014-01-11 16:56:25
【问题描述】:

我是 PHP 新手,但我喜欢创建一个脚本来检查电子邮件是否在我的 MySQL 数据库中,数据库名称是 "Fily_Registrations",表是“用户”,值称为 "email"。所以基本上如果我的数据库中存在电子邮件"hi@all.com",并且我调用像"http://path/to/php.php?email=hi@all.com" 这样的php 脚本,它应该回显"YES",如果它不存在,它应该回显"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 则没有其他数据?
  • 代码很容易受到攻击。这里有多个攻击向量:您使用不带参数的sprintf() 并将用户定义的值插入到查询中而不转义它们。
  • 您的查询语法似乎有问题。它应该是 SELECT [column_name] FROM [table_name] WHERE [condition] 而不是 SELECT [db_name] FROM [table_name] WHERE [condition]

标签: php mysql database


【解决方案1】:

如果数据库是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。

【讨论】:

  • 谢谢,这个答案有效。我会看看你的链接!
【解决方案2】:

你的代码应该是这样的:

<?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/en/function.mysql-num-rows.php mysql_real_escape:http://pt2.php.net/mysql_real_escape_string

【讨论】:

  • 一个好的答案应该可以解决这个问题。请这样做。并且不要只是复制并粘贴 OP 的代码并进行更正。相反,明确暗示mysql_num_rows()并告诉他/她它的重要性。
【解决方案3】:

还不是超级安全,但更好。

  • 使用 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 "Error!: " . $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 "YES";
    } else {
      echo "NO";
    }
    

兄弟, 卡里

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2013-04-12
    • 1970-01-01
    • 2010-10-24
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多