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 查询未运行的主要内容,如果未能解决你的问题,请参考以下文章