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

时间:2014-04-27 23:04:16

标签: php jquery ajax json

我已经遍布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返回值时。

1 个答案:

答案 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();
}