Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP设备在fetch_all()和fetch_array()之间获取结果_Php_Oop_Mysqli - Fatal编程技术网

PHP设备在fetch_all()和fetch_array()之间获取结果

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

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);

调用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
中有什么内容?