【发布时间】:2019-08-03 18:37:16
【问题描述】:
PHP 无法拆分这两种获取类型,我正在尝试构建一个安全的登录脚本...如果我删除 //Login checker 部分,代码运行良好,当我删除 //Security 部分时,其他代码运行也很好,但是当我尝试同时运行它时,它会显示这个错误:
Fatal error: Uncaught Error: Call to a member function fetch_all() on bool in xxxFilenamexxx.php://Number of line points to fetch_all() row
stack trace:
#0 {main}
thrown in xxxFilenamexxx.php//Same line number
这是我的代码:
//Login checker
$loginTrySql = "CALL tryLogUserIn('$typedUsername', '$typedPassword', '".$_SERVER['REMOTE_ADDR']."');";
$loginTryResult = $conn->query($loginTrySql);
if ($loginTryResult->num_rows == 1) {
$data["statusi"] = 1;
$data["tries"] = 0;
//data to fetch for log in
} else {
//Security part
$data["statusi"] = 2;
$checkUserSql = "CALL securityCheck('$typedUsername', '$typedPassword', '".$_SERVER['REMOTE_ADDR']."', @tries_number);";
$conn->query($checkUserSql);
$checkUserSql = "SELECT @tries_number AS tries";
$checkUserResult = $conn->query($checkUserSql);
$securityRow = $checkUserResult->fetch_all(MYSQLI_ASSOC);
$data["tries"] = $securityRow[0]['tries'];
}
echo json_encode($data);
【问题讨论】:
-
这似乎是错误的逻辑,并且可能是可注入的。如果你同时有 2 个执行,
@tries_number不会被另一个执行覆盖吗? -
通过使用存储过程,默认语法是这样的,你给一个参数来保存一个输出,然后在数据库响应后给那个参数一个值,你可以使用它......问题不是同时执行2次吗,理论上和实践上你可以同时执行2次以上,但问题是我提到的函数fetch_all()不接受!
-
布尔值意味着
$checkUserResult执行失败,因此使用错误报告。 php.net/manual/en/mysqli.error.php -
我编写了报告代码,现在它显示如下: 错误消息:命令不同步;您现在无法运行此命令。比它显示上一个错误...
-
我正在考虑以一种方式尝试它:执行第一个sql,而不是关闭连接并再次打开第二部分sql的连接,我不知道这是否会影响运行时间?跨度>