mysql_num_rows():提供的参数不是有效的MySQL结果资源(唯一)

时间:2012-07-12 20:40:19

标签: php mysql

基本上我从表单中提取四个变量的值,然后使用这些值作为WHERE语句从数据库中的表中进行选择。我这里只提供了我的代码片段,因为我已经验证了正确的值是从表单到有问题的变量,并且代码工作得很好,当我只检查时,它会移过if语句到我的else语句中groupid和memberid。

groupid是一个4位数字。 memberid是一个3位数字。 name是像John A. Smith这样的全名 和dob是一个像1900-10-31

的日期

我正在尝试运行的查询如下。在我收到MySQL错误后,它会显示消息“成员不存在”。我在这里错过了什么?

$qry="SELECT * FROM members WHERE groupid = $groupid AND memberid = $memberid AND   membername = $name AND memberdob = $dob";
$result=mysql_query($qry);

if(mysql_num_rows($result) == 0)
    {
    echo "Member does not exist";
    }
 else  {....

3 个答案:

答案 0 :(得分:2)

$qry="SELECT * FROM members 
      WHERE groupid = $groupid 
      AND memberid = $memberid
      AND membername = '$name'
      AND memberdob = '$dob'";

membernamememberdob

周围加上引号

答案 1 :(得分:2)

  

groupid是一个4位数字。 memberid是一个3位数字。 name是像John A. Smith这样的全名,dob的日期是1900-10-31

这就是你的想法。黄金法则:never trust any input from user

如果你想坚持使用mysql扩展,那么首先要用mysql_real_escape_string清理输入。其次,引用传递给查询的变量。所以,而不是

$qry = "... WHERE groupid = $groupid ...";

DO

$qry = "... WHERE groupid = '" . mysql_real_escape_string($groupid) . "'...";

在您的情况下,查询失败的最可能原因是$name变量。它包含空格。空间是查询中断的位置。引用变量将解决问题:

$qry = "SELECT *
        FROM members
        WHERE groupid = '" . mysql_real_escape_string($groupid) . "'
        AND memberid = '" . mysql_real_escape_string($memberid) . "'
        AND membername = '" . mysql_real_escape_string($name) . "'
        AND memberdob = '" . mysql_real_escape_string($dob) . "'";

此外,通过错误处理改进查询执行。简单的例子:

$result = mysql_query($qry) or die('Invalid query: ' . mysql_error());

这将返回详细的错误描述,这将有助于您确定根本原因。

对于不鼓励的mysql扩展的推荐替代方案:请阅读PHP手册中的Choosing an API

答案 2 :(得分:1)

如果不了解应用程序的整个上下文,我将假设从表单中检索变量后会正确处理。

如果字符串字段没有正确用引号括起来,那么它通常会抱怨字符串字段。 可能是从表单中正确检索了$ name和$ memberdob,但是根本不会将其传递给查询。 尝试将您的查询更改为以下内容:

$qry="SELECT * FROM members WHERE 
      groupid = $groupid AND memberid = $memberid AND
      membername = '$name' AND memberdob = '$dob'";