Ajax POST 成功,但 sql 查询未运行

Posted

技术标签:

【中文标题】Ajax POST 成功,但 sql 查询未运行【英文标题】:Ajax POST success, but sql query not running 【发布时间】:2019-08-25 21:13:16 【问题描述】:

我有一个可以工作的 ajax jQuery post。或者至少,我认为可以(我收到成功消息并在浏览器中查看 POST 数据)但更新数据库的 SQL 查询不起作用。

-----------------POST 请求的函数----------

var  examenid=examenid;
var checked=checked;

$.ajax
(
  type:'post',
   url:'updatecheckbox.php',
   data:examenid: examenid,
         checked: checked
      ,
  success:function(msg)
  
      //if i set a message here, the message is displayed.
  

--------更新checkbox.php文件------------------------ -

 <?php
        // set defaults 
        $checkDigitaal;
        $checked = true;
        $examenid = '0';

        //open connection to database
        $link = new mysqli("127.0.0.1","root","","sprint");
        if (!$link) 
        
        echo "Error: Unable to connect to MySQL." . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
            exit;
        

    //check if the POST value is set
           if(isset($_POST['examenid'])) $examenid = $_POST['examenid'];
           if(isset($_POST['checked'])) $checked = $_POST['checked'];

        if($checked)$checkDigitaal = 0;
        else$checkDigitaal = 1;

        //update query database
        $query="update examen set digitaal='$checkDigitaal' where examenid='$examenid'";  //your query

        if ($result = $link->query($query)) 
        
                /* free result set */
            $result->free();
           

        mysqli_close($link);
 ?>

我希望更新查询运行并将数据库中的数字设置为 0 或 1。但是现在什么都没有发生。

提前致谢。

【问题讨论】:

我所做的是 echo json_encode("something to check like $checked")。看看实际发生了什么然后在我的 ajax console.log(msg) 中成功。 必须声明"Your sql code is vulnerable to SQL injection" 警告。使用prepared statement 而不是将用户提供的数据嵌入到您的 sql 中。 正如@RamRaider 所说,您不应该在现实生活中使用此代码。您可以检查 SQL 更新是否更新了数据库: if ($result = $link->query($query)) echo "Record updated successfully"; else echo "更新记录出错:" . mysqli_error($链接); 感谢 RamRaider “您的 sql 代码易受 SQL 注入攻击”的警告。我知道它会改变这一点。 在“调试”中添加了@nologin 代码 echo "Record updated successfully $checkDigitaal $examenid" 我收到了 succesfull 0 0 消息,所以没有设置变量(这就是我不设置的原因)在数据库中看不到更新) 【参考方案1】:

PHP 代码不会将任何值返回/回显给 ajax 回调,因此 success 函数可能会被欺骗 - 使用 PHP 中的操作结果逻辑来确定返回的内容。

下面是一个示例,说明如何使用 ajax 回调的响应消息实现 stored procedures...未测试

$.ajax(
    type:'post',
    url:'updatecheckbox.php',
    data:
        examenid: examenid,
        checked: checked
    ,
    success:function(msg)
        //if i set a message here, the message is displayed.
        console.info(msg)
    ,
    error:function(err)
        console.warn(err);
    
);



<?php

        $result = false;
        $checked = true;


        $link = new mysqli("127.0.0.1","root","","sprint");
        $examenid = filter_input( INPUT_POST, 'examenid', FILTER_SANITIZE_NUMBER_INT );
        $checked = filter_input( INPUT_POST, 'checked', FILTER_SANITIZE_NUMBER_INT );

        $checkDigitaal = $checked==1 ? 1 : 0;



        $sql='update `examen` set digitaal=? where examenid=?';
        $stmt=$link->prepare( $sql );

        if( $stmt && $examenid )
            $stmt->bind_param( 'ii', $checkDigitaal, $examenid );
            $result = $stmt->execute();
            $stmt->free_result();
            $stmt->close();
        

        $link->close();

        /* send appropriate message based upon query result */
        exit( $result ? 'happy' : 'sad' );
?>

【讨论】:

使用返回而不是退出 return 与函数一起使用,而 exit 通常用于在该点终止操作 exit 恕我直言,用于返回有关操作成功的状态代码 (-1, 1) 并中断脚本运行过程。不知道它也“返回:)”字符串。我不开发没有功能;) 来自 PHP 手册:exit — Output a message and terminate the current script【参考方案2】:

我修改了几行代码,请检查是否有效

-----------------POST 请求的函数----------

var  examenid=examenid;
var checked=checked;

$.ajax(
        type:'post',
        url:'updatecheckbox.php',
        data:"examenid": examenid, "checked": checked,
         success:function(msg)
          //if i set a message here, the message is displayed.     
     );

--------更新checkbox.php文件------------------------ -

<?php
        // set defaults 
        $checkDigitaal;
        $checked = true;
        $examenid = 0;

        //open connection to database
        $link = new mysqli("127.0.0.1","root","","sprint");
        if (!$link) 
        
        echo "Error: Unable to connect to MySQL." . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
            exit;
        

    //check if the POST value is set
           if(isset($_POST['examenid'])) $examenid = $_POST['examenid'];
           if(isset($_POST['checked'])) $checked = $_POST['checked'];

        if($checked)$checkDigitaal = 0;
        else$checkDigitaal = 1;

        //update query database
        $query="update examen set digitaal=$checkDigitaal where examenid=$examenid";  //your query

        if ($result = $link->query($query)) 
        
                /* free result set */
            $result->free();
           

        mysqli_close($link);
 ?>

【讨论】:

如果 digitalaal 和 exmenid 是数字,你是对的。也许这个提示更像是一个评论而不是一个答案? 由于我的观点,我不允许发表评论,所以我只能通过评论提供帮助 给你建设性的反馈: - 我缺少解释或句子你的改变是关于什么的(-> sql 语句中的错误类型)。 - 不要复制/粘贴整个代码。更新的行就足够了,答案更易读(更短)。

以上是关于Ajax POST 成功,但 sql 查询未运行的主要内容,如果未能解决你的问题,请参考以下文章

我的 AJAX 查询未正确验证

POST成功但数据未出现在控制器中[重复]

未使用 MVC 从 Json Result 获取 Ajax 成功方法中的 LINQ 连接查询结果,但结果显示正确

jquery ajax 脚本运行成功但导致错误

Ajax 错误回调未针对 iPhone 触发

成功查询后未显示成功消息,但表单数据仍然发送到DB