【问题标题】:Catch an Ajax Query POST error doesn't work捕获 Ajax 查询 POST 错误不起作用
【发布时间】:2021-10-22 20:15:03
【问题描述】:

我编写了一些代码,使用 JQuery 和 PHP 将数据输入到我的 sql 数据库中,并且可以正常工作。 但是我需要Ajax请求的错误块在数据库服务器离线、sql抛出错误或者应该有错误的时候执行。

问题是,ajax 请求的错误块永远不会被执行。永远只是成功的障碍。不管是sql查询错误还是数据库服务器离线。

我已经尝试过使用失败块和 jQuery.$.get() 但这也不起作用。但我还是更喜欢 ajax 请求。

到目前为止,我已经编写了以下代码:

//JavaScript-function to insert data into a database. The parameter is an SQL-INSERT statement.
function insertIntoDatabase(sqlQuery)
{
    var result;

    $.ajax({
        type: "POST",
        url: "../../general/clientHelper.php",
        data: {sql: sqlQuery},
        async: false,
        error: function()
        {
            if(sqlQuery.split(" ")[0] != "INSERT") console.log("SQL-Query is not an INSERT statement");
            result = false;
        },
        success: function()
        {
            result = true;
        }
    });
    
    return result;
}
<?php

//clientHelper.php - Insert data into the database.

if(isset($_POST['sql'])) insertIntoDatabase($_POST['sql']);
function insertIntoDatabase($sqlQuery)
{
    $ip = "10.10.10.1";
    $port = 3306;
    $username = "candidate";
    $password = "candidate";
    $dbname = "cqtsdb";

    $connection = new mysqli($ip, $username, $password, $dbname, $port);
    $connection->query($sqlQuery);
    $connection->close();
    
    exit();
}
?>

我现在不知道该怎么办:/请帮助

【问题讨论】:

  • 在发出 AJAX 请求之前为什么不检查 sqlQuery 的值?
  • error: 回调仅在 HTTP 错误而非 PHP 错误时执行。
  • 最好只将数据发送到后端,并在后端创建sql查询,您的实际代码很容易受到攻击,任何用户都可以向后端发送任何sql查询,想象一下@ 987654327@ 然后 DELETE FROM some_table ,...
  • 永远不要在服务器端接受 SQL 查询。我的意思是——你为什么要这样做?所以@yassinefikri 说了什么。另外,请使用准备好的语句(参见php.net/manual/de/mysqli.quickstart.prepared-statements.php)和检查错误(参见php.net/manual/de/mysqli.error.php)。

标签: php jquery ajax


【解决方案1】:

更新:

我发现如果我向成功函数添加一个参数,如果发生了错误,它会填充错误文本。如果一切正确,则文本只是“”。所以我不需要做任何事情,只需要检查它:)

success: function(data)
{
    if(data == "") result = true; 
    else  result = false;
}

【讨论】:

    【解决方案2】:

    查看查询结果,如果成功则返回某个值给ajax如1,如果不成功则返回0。 然后在 ajax 成功函数中检查该值并相应地显示一条消息或您想做的任何事情。

    我使用过程式 PHP,我就是这样做的

    function leave($msg, $conn, $type){
        //$msg is the message I want to display to the user.
        //$type is the query result type I explained above.
        //$conn is to close the connection.
        echo json_encode(array(
            "msg" => $msg,
            "type" => $type
        ));
        mysqli_close($conn);
        exit();
    }
    

    这样调用这个函数

    $result = mysqli_query($conn, $query);
        if ($result) {
            leave('done', $conn, 1);
        } else {
            leave('something went wrong', $conn, 0);
        }
    

    像这样检查值:

    ...
    success: function (response) {
          if(response.type == 1){
              // do smth
          }
          else if(repsonse.type == 0){
              // do another thing
          }
        },
    ...
    

    【讨论】:

    • 感谢您的回答!你的建议是个好主意,但我在实施它时遇到了一些问题。但后来偶然我想出了一个非常简单的解决方案。如果你想看看如何,我已经发布了答案。
    • 很高兴它有帮助。
    猜你喜欢
    • 2017-08-30
    • 2011-02-19
    • 2021-10-06
    • 2019-03-02
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多