我已经遍布stackoverflow试图解决这个问题。我正在使用jQuery的ajax
方法发送一些表单数据,而PDO则根据表单输入准备和返回数据。我在预准备语句中有一个参数,它取自表单数据,并使用PDO bindParam
方法设置。
使用表单数据,我得到的json数据是未定义的。如果我硬编码字符串参数而不是使用表单数据,我会找回我正在寻找的数据。我已经回显了我传入的变量的确切值和类型,它与硬编码字符串相同。我已经尝试明确设置编码以确保它也是utf8。
这就是我的php看起来的样子(编辑:包括执行方法,它包含在我的代码中,但最初在帖子中被遗漏了):
$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);
$statement->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();
}
和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"}].
使用表单数据变量时,通过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
变量b / c可用,当然,当我在表单上使用标准post方法而不是通过Ajax测试PHP返回值时。
答案 0 :(得分:0)
我想你输了:
$结果 - >执行();
前
$ results = $ statement-> fetchAll();
$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();
}