PHP设备在fetch_all()和fetch_array()之间获取结果
PHP无法拆分这两种获取类型,我正在尝试构建一个安全的登录脚本。。。如果我删除//Login checker部分,代码运行良好,当我删除//Security部分时,其他代码也运行良好,但当我尝试同时使用这两个部分运行时,会显示以下错误:PHP设备在fetch_all()和fetch_array()之间获取结果,php,oop,mysqli,Php,Oop,Mysqli,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_a
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);
调用bool上的成员函数fetch_all()
意味着调用->fetch_all(…)
的对象实际上是一个布尔变量
这就是$checkUserResult
——它可以是布尔值false
,并且从未在代码中签入
您应该检查:
$checkUserResult = $conn->query($checkUserSql);
if ($checkUserResult === false) {
handle_error_somehow("Error is: " . $conn->error);
} else {
$securityRow = $checkUserResult->fetch_all(MYSQLI_ASSOC);
...
}
此外,如果您在每次$conn->query
之后检查错误,您可能会发现那里到底发生了什么
顺便说一句,将原始用户输入插入到SQL中一点也不安全!请至少执行转义字符串:
$checkUserSql = "CALL securityCheck('" . $conn->real_escape_string($typedUsername)
. "', '" . $mysqli->real_escape_string($typedPassword)
. "', '" . $mysqli->real_escape_string($_SERVER['REMOTE_ADDR'])
. "', @tries_number);";
这似乎是错误的逻辑,而且可能是可注射的。如果同时有两次执行,
@trys\u number
不会被另一次执行覆盖吗?通过使用存储过程,默认语法如下,您指定一个保存输出的参数,然后在数据库响应后为该参数指定一个值,供您使用。。。问题不在于同时有2次执行,在理论和实践中,一次可以执行2次以上的执行,但问题在于我提到的fetch_all()函数不接受它!布尔值意味着,$checkUserResult
无法执行,因此请对此使用错误报告。我编写了用于报告的代码,现在它显示以下内容:错误消息:命令不同步;现在无法运行此命令。然后它显示了前面的错误…我正在考虑以某种方式尝试它:执行第一个sql,而不是关闭连接,然后再次打开sql第二部分的连接,我不知道这是否会影响运行时间?有两个sql语句,如果我删除其中一个,另一个就可以了。。。我做了mysqli real escape string,这样做更安全,我不知道,也许有什么建议…谢谢btwSo,什么错误文本,当它不起作用时?就像我提到的,如果我只删除$loginTrySql或$checkUserSql,它就像一个符咒一样工作没有错误,但我需要它们在一起,而不是我提到的Tooo显示的错误…谢谢,@Dharman,但您最好在OP中说明这一点。在我的示例中,我只是快速尝试解决这个问题,您认为应该使用参数化查询。但在本例中,转义就足够了,因为所有值都用作引号中的字符串。转义是不够的,当转义值作为数值常量放置时,没有引号。@Flamubeqiraj那么,您能告诉我们查询中的错误是什么吗?$conn->query()
返回的false
之后,$conn->error
中有什么内容?