Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将PDO与bindParam一起使用时返回的JSON数据未定义_Php_Jquery_Ajax_Json - Fatal编程技术网

Php 将PDO与bindParam一起使用时返回的JSON数据未定义

Php 将PDO与bindParam一起使用时返回的JSON数据未定义,php,jquery,ajax,json,Php,Jquery,Ajax,Json,我到处都在想办法解决这个问题。我使用jQuery的ajax方法发送一些表单数据,并使用PDO根据表单输入准备和返回数据。我在准备好的语句中有一个参数,它取自表单数据,并使用PDObindParam方法设置 使用表单数据,我得到的json数据是未定义的。如果我硬编码字符串参数而不是使用表单数据,那么我将返回我要查找的数据。我回显了我传入的变量的确切值和类型,它与硬编码字符串相同。我已尝试显式设置编码,以确保它也是utf8 这就是我的php的样子(EDIT:includes-execute方法,它包

我到处都在想办法解决这个问题。我使用jQuery的
ajax
方法发送一些表单数据,并使用PDO根据表单输入准备和返回数据。我在准备好的语句中有一个参数,它取自表单数据,并使用PDO
bindParam
方法设置

使用表单数据,我得到的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();
}