【问题标题】:php check if a value is in a sql database [duplicate]php检查一个值是否在sql数据库中[重复]
【发布时间】:2013-01-18 15:42:01
【问题描述】:

可能重复:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select

//define variable to check the number of rows where the sql query is true to find out if the username or password are already in use
$EmailCheck = mysql_query("SELECT `Email` FROM `Customer` WHERE `Email` = '$RegCusEmail'");
$UserCheck = mysql_query("SELECT `Username` FROM `Customer` WHERE `Username` = '$RegCusUser'");

//checks if emails in use
if (mysql_num_rows($EmailCheck) != 0)
{
  echo '<p id="error">The Email address you have entered is already in use.<p>';
}

//checks if username is in use
elseif (mysql_num_rows($UserCheck) != 0)
{
  echo '<p id="error">The username you have entered is already in use.<p>';
}

上面的代码应该在数据库中搜索注册人的电子邮件和用户名,如果它们已经存在,则告诉用户使用不同的,但是当我使用它时出现此错误?

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in (file directory) on line 56 
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in (file directory) on line 62

【问题讨论】:

  • 像本网站上的 6 kazjillion 其他问答一样,带有完全相同的错误消息:您的查询失败,您盲目地假设它们成功,现在它们已经失败,您没有需要清理的错误处理混乱。
  • 请不要使用mysql_* 函数编写新代码。它们不再维护,社区已经开始deprecation process。看到 red box 了吗?相反,您应该了解prepared statements 并使用PDOMySQLi
  • 我在 phpmyadmin 中检查了查询,它的工作原理是测试它们是否工作的有效方法,或者如果可以,我是否需要修复它们?
  • @user1990909 你确实连接到数据库对吗?我没有看到您在哪里连接和/或选择了正确的数据库。我知道这可能只是一个 sn-p 所以你可能在这里省略了它,但我只是在检查你是否确实在实际代码中连接到了数据库。

标签: php sql registration


【解决方案1】:

1) 使用 PDO:

//connection
$host =     "localhost";
$user =     "someuser";
$pass =     "somepass";
$database = "db_name";

$db = new PDO("mysql:host=$host;dbname=$database", $user, $pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) or die("Connection error!");

$query = 'SELECT Customer.Email FROM Customer WHERE Customer.Email = :RegCusEmail';
$params = array(':RegCusEmail' => $RegCusEmail);

$result = db_query($query,$params);

if($result == false)
{
  //do stuff..
}


function db_query($q,$p = array())
{
    global $db;

    if($stmt = $db->prepare($query))
    {

        if(count($p) > 0)
        {
            foreach ($p as $key => $value) {
                $stmt->bindParam($key,$value);
            }
        }

        $stmt->execute();
        $resulSet = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if(count($resulSet) > 0)
        {
            return true; // exists
        }
        else
        {
            return false; // does not exist
        }

    }

}

2) 验证电子邮件地址和电子邮件服务器

function isValidEmail ($email)
{
    if ($isemail=filter_var($email, FILTER_VALIDATE_EMAIL))
    {
        if(list($email,$domain) = explode('@',$email))
        {
            if(!getmxrr ($domain,$mxhosts)) 
            { 
                return FALSE; 
            }
            else 
            { 
                return TRUE; 
            }
        }
        else
        {
            return FALSE;
        }
    }
    else
    { 
    return FALSE; 
    } 

}

【讨论】:

    【解决方案2】:

    您似乎忘记了连接到数据库,或者数据库中的详细信息可能不正确。遇到查询错误时,最好进行调试 通过结束您的查询 die (mysql_error()) 作为错误处理方法,如下所示:

    mysql_query("SELECT Email FROM Customer WHERE Email = '$RegCusEmail'") or die (mysql_error());

    得到一个正确的错误。

    【讨论】:

    • 谢谢早点评论了,忘记了。
    • @user1990909 你用mysql_error()检查查询吗?
    【解决方案3】:

    如果您使用的是 5.2 或更高版本,那么简单

     function checkEmail( $EmailCheck ){
        return filter_var( $EmailCheck, FILTER_VALIDATE_EMAIL );
      }
    

    显然添加错误处理..

    【讨论】:

      【解决方案4】:

      改为检查结果:

      if ( ! is_resource( $EmailCheck ) || mysql_num_rows( $EmailCheck ) != 0 )
      

      但是检查mysql_error(),你的查询可能有错误!

      【讨论】:

        猜你喜欢
        • 2017-11-24
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 2021-10-10
        • 2020-07-31
        • 1970-01-01
        相关资源
        最近更新 更多