Php 将PDO与bindParam一起使用时返回的JSON数据未定义
我到处都在想办法解决这个问题。我使用jQuery的Php 将PDO与bindParam一起使用时返回的JSON数据未定义,php,jquery,ajax,json,Php,Jquery,Ajax,Json,我到处都在想办法解决这个问题。我使用jQuery的ajax方法发送一些表单数据,并使用PDO根据表单输入准备和返回数据。我在准备好的语句中有一个参数,它取自表单数据,并使用PDObindParam方法设置 使用表单数据,我得到的json数据是未定义的。如果我硬编码字符串参数而不是使用表单数据,那么我将返回我要查找的数据。我回显了我传入的变量的确切值和类型,它与硬编码字符串相同。我已尝试显式设置编码,以确保它也是utf8 这就是我的php的样子(EDIT:includes-execute方法,它包
ajax
方法发送一些表单数据,并使用PDO根据表单输入准备和返回数据。我在准备好的语句中有一个参数,它取自表单数据,并使用PDObindParam
方法设置
使用表单数据,我得到的json数据是未定义的。如果我硬编码字符串参数而不是使用表单数据,那么我将返回我要查找的数据。我回显了我传入的变量的确切值和类型,它与硬编码字符串相同。我已尝试显式设置编码,以确保它也是utf8
这就是我的php的样子(EDIT:includes-execute方法,它包含在我的代码中,但最初在文章中被忽略):
还有ajax:
$("document").ready(function() {
$("form").submit(function(e) {
e.preventDefault();
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "get-endorsements.php",
success: function(data) {
console.log(data[0]);
console.log(data[1]);
}
})
})
});
如果我定期提交表单只是为了查看回显的json编码的结果,那么无论是使用硬编码字符串还是表单数据,我都会得到相同的结果——它的形式如下:
[{"key1":"value1","key2":"value2"},{"key1":"value3","key2":"value4"}].
但是,在使用formdata变量时,通过ajax返回的数据是未定义的,我不明白为什么这会产生不同
解决方案:
$("form").submit(function(e) {
e.preventDefault();
var data = $(this).serialize();
console.log(data);
$.ajax({
type: "POST",
//contentType: "application/json; charset=utf-8",
dataType: "json",
data: data,
url: "get-endorsements.php",
success: function(data) {
console.log(data[0]);
console.log(data[1]);
}
})
})
必须通过$.ajax
(谢谢@David SkyMesh)传入数据,并且不设置contentType(因为这是传递到服务器的数据的contentType,而不是接收到的数据)。当我在表单上使用标准POST方法而不是通过Ajax测试PHP返回值时,我认为数据仅通过变量b/c可用,这让我感到非常困惑。我认为您丢失了:
$results->execute()
以前
$results=$statement->fetchAll()
好的,很抱歉在清理我的故障排除代码时被切断了。我更新了我的帖子。你是否使用Chrome开发者工具/Firebug/Fiddler检查了实际的HTTP响应?它返回html/文本,所以我在php中添加了一个标题,将内容类型设置为json。虽然没有更改结果,但我的数据仍然未定义。@Nicolek Anderson我是在想象什么,还是您从未将要发布的表单数据(即:要JSONified的数据结构)传递到
.ajax(…)
?我看到了配置属性、URL和回调,但没有数据?所以你是说它只有在使用bindParm时才是未定义的,但在使用harcoded时才有效?
$("form").submit(function(e) {
e.preventDefault();
var data = $(this).serialize();
console.log(data);
$.ajax({
type: "POST",
//contentType: "application/json; charset=utf-8",
dataType: "json",
data: data,
url: "get-endorsements.php",
success: function(data) {
console.log(data[0]);
console.log(data[1]);
}
})
})
$endorsers = array();
// Takes in the values from checkbox form data
foreach($_POST as $k => $v) {
if($v == 'on') {
$endorsers[] = $k;
}
}
// Set variable to first checkbox value
$endorser = $endorsers[0];
try {
$connection = new PDO('mysql:host=localhost;dbname=*****;charset=utf8', $username, $password);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $connection->prepare('SELECT DISTINCT c.name AS cand_name, e.name AS end_name FROM candidates c JOIN end_cand ec ON (ec.end_id = c.id) JOIN endorsements e ON (e.abbrev = :endorser)');
$statement->bindParam(':endorser', $endorser, PDO::PARAM_STR);
$results->execute();
$results = $statement->fetchAll();
if (isset($results)) {
echo json_encode($results);
} else {
$error = array('error_message' => 'Sorry, Charlie');
echo json_encode($error);
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}