mysql_num_rows() 期望参数 1 为资源,布尔值在检查成功后给出

mysql_num_rows() expects parameter 1 to be resource, boolean given AFTER checking success

我有问题'mysql_num_rows() expects parameter 1 to be resource, boolean given'

我意识到这意味着查询失败了。但是,我首先进行检查以查看查询是否成功,如果在该查询中,我收到此错误。我不确定如果查询失败,为什么我会首先进入 if?我也尝试回显查询并粘贴到 phpmyadmin 中,它运行成功..

代码如下:

$checkloginEmp = "CALL login('".$Email."','".$Password."', '".$NotificationID."', '".$Token."', @numRowsParam, @userIDParam);";
                //echo $checkloginEmp;

                if ($check = mysql_query($checkloginEmp)){
                    //echo $check;

                    if(mysql_num_rows($check) == 1) {
                       //retrieve info. issue points to here
                       $status= 'OK';
                       $message= null;
                    }
                    else{
                       $status= 'Not OK';
                       $message= "Invalid email/pass combination";
                    }
                 }

问题中的代码似乎试图 return 来自存储过程的结果集。

(如果该过程不是 return 结果集,那么我们没有理由使用 mysql_num_rows。)

为了 return 来自过程的结果集,必须通过调用 mysql_connect 时的 client_flags 参数启用 CLIENT_MULTI_STATEMENTS 选项。该选项由标志值 65536.

启用

如果没有该选项,就不可能 return 来自存储过程的结果集。

警告:

打开启用多个语句的连接会为应用程序的整个 NASTINESS 敞开大门,这些应用程序 易受攻击SQL 注入.


备注:

是否有必要 return 来自存储过程的结果集?您需要多行 returned,还是可以使用 OUT 过程参数 return 标量值?

正如我在之前的评论中指出的那样,此代码使用的是 已弃用 接口。新开发应使用 mysqliPDO.

并且在 SQL 文本中包含潜在的不安全值会使应用程序 易受攻击 SQL 注入


编辑

Q: @spencer7593 绑定参数到存储过程不安全?您能否举例说明攻击如何成功?

答:那是另一个问题。

示例代码没有“绑定参数”。它将 PHP 变量的值合并到 SQL 语句的文本中。 (我们在代码示例中看不到的是这些值是否已被正确转义。如果没有看到,我将假设他们没有被正确转义,因为那是我们看到的最常见的模式;并且因为它是 更安全 假设。我们 假设 这些值是不安全的,直到证明它们是' t.

有关 SQL 注入的攻击向量和利用示例,我推荐 OWASP 项目。 https://www.owasp.org/index.php/SQL_Injection.

如果您启用允许多个语句 运行 的选项(如果您要 return 来自存储过程的结果集,这是您需要的,这里是一个值的示例,我们可能尝试通过 $Token

fee', @fi, @fo); DROP TABLE users; --

Little Bobby Tables Exploits of a Mom XKCD https://xkcd.com/327/