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 标量值?
正如我在之前的评论中指出的那样,此代码使用的是 已弃用 接口。新开发应使用 mysqli 或 PDO.
并且在 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/
我有问题'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 标量值?
正如我在之前的评论中指出的那样,此代码使用的是 已弃用 接口。新开发应使用 mysqli 或 PDO.
并且在 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/