我的jQuery帖子请求有问题:
$.post(
'http://localhost/***/ajax_bdd-change.php',
{'id': _id, 'id_key': id_key, 'table': table, 'data': data})
.fail(function(jqXHR, textStatus, errorThrown){
alert('Erreur: '+jqXHR.responseText);
})
.done(function(data){
alert($(data).text());
});
我的PHP:
<?php
$id = json_decode($_POST['id']);
$id_key = json_decode($_POST['id_key']);
$table = json_decode($_POST['table']);
$data = json_decode($_POST['data']);
foreach ($_POST as $k=>$v) {
unset($_POST[$k]);
}
$rlt = array(
'erreur' => false,
'request' => 'none'
);
$tmp = 0;
$request = 'UPDATE '.$table.' SET';
foreach ($data as $target => $value) {
if ($tmp++>0)
$request = $request.',';
$request = $request.' '.$target.' = "'.$value.'"';
}
$request = $request.' WHERE '.$id_key.' LIKE "'.$id.'"';
$rlt['request'] = $request;
require('BDD_connexion.php');
if (!$rlt_bdd = mysqli_query($link, $request)){
$rlt['erreur'] = 'Erreur: Update not done';
}
$link->close();
echo json_encode($rlt);
exit();
?>
每次运行我的代码时,它都遵循相同的路径:
.fail()
我试图强制php失败,那时,jQuery正确运行done(函数)。
.done()
我尝试过很多东西,例如强制每个php字符串变量使用UTF8编码。
我甚至试图强加一个像json_encode('hello world');
经过多次测试后,似乎是我之前的信息:
解释一下可能有用:
- 我的javascript位于
laod()
php页面内。所以它必须具有如下结构:
- main.php --jQuery - &gt;
load
(second.php到div
)
- second.php --jQuery - &gt;
$.post
(ajax_bdd-change.php)- ajax_bdd-change.php --return
$rlt
- &gt; second.php(jQuery part)我没有提及它,因为我觉得不合适。
是这个问题的原因。我在没有.load
的新html页面上通过帖子尝试调用我的php,它运行正常。
答案 0 :(得分:1)
如果服务器上没有发生任何问题,响应代码应为200
。
根据您所做的观察,很有可能响应代码不是200
。还要注意,jQuery或任何其他框架都不知道在服务器上编写的自定义代码是否是连贯执行的。通常,客户的唯一指示是response code
。
jQuery source
答案 1 :(得分:0)
首先,您必须决定在AJAX查询中是否需要JSON,如下所示:
$.ajax({
url: 'http://localhost/***/ajax_bdd-change.php',
dataType: 'json', //EXPLICITLY SET THIS TO JSON
cache: false,
type: "POST",
data: {
id : _id,
id_key : id_key,
table : table,
data : data
},
success: function (data, textStatus, jqXHR) {
if(data){
alert("DATA CAME BACK AS JSON...");
console.log(data);
// YOU REALLY DON'T WANT TO DO THIS: $(data).text()
// THE .text() METHOD IS FOR THE DOM AND YOU ARE IN READING MODE TOO
// data SHOULD CONTAIN THESE: request AND erreur
// SO YOU CAN EITHER CHECK THE SQL OR THE ERROR LIKE SO:
// I WOULD PREFER USING console.log(data.request)
alert(data.request);
alert(data.erreur);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Erreur: '+jqXHR.responseText);
},
complete: function (jqXHR, textStatus) {
//DO SOMETHING HERE IF YOU WISH TO
}
});
这是您的PHP代码:
<?php
$id = isset($_POST['id']) ? htmlspecialchars(trim($_POST['id'])) : null;
$id_key = isset($_POST['id_key']) ? htmlspecialchars(trim($_POST['id_key'])) : null;
$table = isset($_POST['table']) ? htmlspecialchars(trim($_POST['table'])) : null;
$data = isset($_POST['data']) ? htmlspecialchars(trim($_POST['data'])) : null;
foreach ($_POST as $k=>$v) {
unset($_POST[$k]);
}
$rlt = array(
'erreur' => false,
'request' => 'none'
);
$updateSQL = 'UPDATE '. $table . ' SET ';
if($data){
foreach ($data as $target => $value) {
$updateSQL .= ' ' . $target . ' = "' . $value . '", ';
}
$updateSQL = rtrim($updateSQL, ", ");
// LIKE CLAUSE IS NOT SO FUNKY HERE: DO YOU WANT TO DO "EQUALS"?
// ' WHERE ' . $id_key . ' = "' . $id. '"';
$condition = ' WHERE ' . $id_key . ' LIKE "' . $id. '"';
$request = $updateSQL . $condition;
$rlt['request'] = $request;
require('BDD_connexion.php');
if (!$rlt_bdd = mysqli_query($link, $request)){
$rlt['erreur'] = 'Erreur: Update not done';
}
$link->close();
}
die( json_encode($rlt) );
希望这有点接近...
答案 2 :(得分:0)
试试这个:
// Javascript
var params = {
id: _id,
id_key: id_key,
table: table,
data: data
};
// explicitely tells javascript you're expecting json response
// with this $.post shortcut
$.post('url', params, function(data) {
//console.log(data)
if (data.erreur) {
// Error occured
} else {
// no error
}
}, 'json');
// PHP
<?php
// You don't need to json_decode the $_POST data, but you can sanitize or
// perform any validation check if you want
$id = $_POST['id'];
$id_key = $_POST['id_key'];
$table = $_POST['table'];
$data = $_POST['data'];
// Your process here
echo json_encode($rlt);
exit;
希望这有帮助。
答案 3 :(得分:0)
我找到了解决方案。
实际上,我的代码更复杂,jQuery .post
是在jQuery DialogBox的脚本部分内的.submit
<form>
内完成的。
所以表单在php响应之前完成提交,当时这个数据库有一个数据库查询。
在解决方案中,我只使用 .click
更改此提交,并且当我从服务器返回响应时,我会手动关闭。