PHP multi_query页面渲染失败

时间:2018-06-30 08:05:22

标签: php mysql mysqli sql-injection mysql-error-1064

早上好

had some problems yesterday并得到了帮助,不幸的是,尽管只丢失了一个小细节,我的应用仍无法100%地完成我想要的工作。

考虑到一种情况,我想进行SQL注入以删除数据库,并在发生这种情况时呈现PHP页面。一切工作正常,直到我希望进行渲染-即使执行注入并且在检查MySQL时删除了DB,MySQL仍然没有渲染。问题可能是由于multi_query的使用不正确。代码中的注释中有更多详细信息。

public interface APIService {
 @FormUrlEncoded
 @GET("/products?page=1")
 Call<List<DataModelProducts>> getProducts(@Field("parameter") String  
 parameter,@Field("value") String value);
}

任何有帮助的想法将不胜感激!

1 个答案:

答案 0 :(得分:1)

包含another.php的代码块永远不会运行,因为SHOW DATABASES查询失败。

我测试了您的代码并添加了一些错误报告:

if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) {
    if($result->num_rows == 0) {
        include("another.php");
    }
} else {
    echo "Error: {$conn->error}\n";
}

我明白了:

  

错误:命令不同步;您现在不能运行此命令

当已经执行过的SQL查询仍有要提取的结果时,您将无法运行另一SQL查询。即使您使用store_result()来获取结果集,也只能获取当前结果集。您使用的mulit_query()会产生多个结果集。您必须先处理所有结果集,直到next_result()循环结束,然后才能开始新查询。

这里的另一课是,您尝试query()multi_query()prepare()execute()后,应始终检查并报告错误


这里是一个示例:您必须等到处理完最后一个结果之后,才能运行另一个查询。这意味着之后$conn->next_result()上的循环完成了。

if(isset($_POST["button_two"])){
    $username = $_POST['username'];
    $password = $_POST['password'];

    if($conn->multi_query("SELECT id FROM users WHERE username = '$username' OR password = '$password'"))
    {
        do {
            if ($result = $conn->store_result()) {
                while ($row = $result->fetch_row()) {
                    // DISPLAY RESULTS FROM QUERY
                }
            }
            $result->free();
        } while ($conn->next_result());

        // CAN'T START ANOTHER QUERY UNTIL AFTER THE NEXT_RESULT LOOP IS DONE
        if ($result = $conn->query("SHOW DATABASES LIKE 'mydatabase'")) {
            if($result->num_rows == 0) {
            include("another.php");
        }
    }
}