$ .ajax()不接受php数组

时间:2013-08-09 06:00:55

标签: jquery ajax pdo

我正在使用ajax从表(mysql)返回结果。 Ajax调用是使用jquery进行的。 使用PDO访问数据库。

PHP

    function fetchQuestions() {
            $database = "answerMe";  // the name of the database.
            $server = "127.0.0.1";  // server to connect to.
            $db_user = "name";  // mysql username to access the database with.
            $db_pass = "password";  // mysql password to access the database with.
            $table = "questions";
            $result = "";

            try {
              $testh = new PDO ("mysql:host=$server;dbname=$database", $db_user, $db_pass);
              $testh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
              $testh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
              $sql = "select COUNT(*) from questions";
              $pstatement = $testh->prepare($sql);
              $success = $pstatement->execute();
              $num = $pstatement->fetchColumn();
              $sql = "select * from $table";
              $pstatement = $testh->prepare($sql);
              $success = $pstatement->execute();
              print("Fetch all of the remaining rows in the result set:\n");
              $result = $pstatement->fetchAll(PDO::FETCH_COLUMN, 1);
              return $result;
            }
            catch(PDOException $e)
            {
              echo "Following error was encountered <br />";
              echo $e->getMessage();
            }
    }
    $function = $_POST['function'];    
    $response = array();
    $data = "";

    switch($function) {
             .
             .
             .      

             case('recData'):
                //$qs = array('w','k');
                $qs = fetchQuestions();
                $response['records'] = $qs;
                    break;
    }    
    echo json_encode($response);

Jquery(ajax部分)

    function AjaxReq(){
            this.sendSuccess = false;
            this.recSuccess = false;
            this.send = sendData;
            this.rec = recData;
    }
    .
    .
    .
    function recData() {
            $.ajax({
               type: "POST",
               url: "ajax.php",
               data: {  'function': 'recData',
                                    },
               dataType: "json",

               success: function(data){
                       alert('rec succeeded');
                       this.recSuccess = true;
                       for(var i = 0; i < data.records.length; ++i) {
                                    $("#details").append(data.records[i]);
                            }
               },
            });
    }

Jquery(调用ajax)

    $(document).ready(function(){
            var reqTest = new AjaxReq();
            $("#done").bind('click',function(){
                    reqTest.rec();
            });
    });

在PHP代码中,例如'recData',如果我取消注释// $ qs = array('w','k');,我得到结果。

这让我得出结论,也许$ qs可能不是一个数组。但是使用is_array(),它被证明是另外的。

我尽力将不相关的代码放在这里。任何帮助,将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:1)

我按照sscce中的说明修改了您的代码。您应该避免使用Try / Catch块,除非您要处理捕获的异常,例如,如果数据库已关闭。

$database = "answerMe";  // the name of the database.
$server = "127.0.0.1";  // server to connect to.
$db_user = "name";  // mysql username to access the database with.
$db_pass = "password";  // mysql password to access the database with.
$testh = new PDO ("mysql:host=$server;dbname=$database", $db_user, $db_pass);
$testh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$testh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "select * from $table";
$pstatement = $testh->prepare($sql);
$success = $pstatement->execute();
$result = $pstatement->fetchAll(PDO::FETCH_COLUMN, 1);
var_dump($result); 

var_dump($result)转储有关变量的信息。 如果结果是必需的,您可以随时逐步添加功能测试。

修改 假设结果令人满意。

  1. var_dump($result)更改为echo json_encode($result)
  2. header('Content-Type: application/json')
  3. 之后添加<?php
  4. 将代码保存在ajaxtest.php
  5. 使用以下代码显示JSON(使用getJSON
  6. 如果结果令人满意地纳入您自己的代码
  7. 代码

    $(document).ready(function() {
        $.getJSON('ajaxtest.php', function(data) {
            $.each(data, function(i, item) {
                $('#result').append('<p>' + data[i].records + '</p>');
            });
        });   
    });
    

    编辑2 不要使用$sql = "select * from $table",而应使用$sql = "select `records` from $table"。这将消除需要使用fetchColumn()fetchColumn(1)检索第2列而不是第1列

答案 1 :(得分:0)

尝试使用此javascript var_dump库来调试您的数据响应。 https://github.com/kvz/phpjs/blob/master/functions/var/var_dump.js

答案 2 :(得分:0)

以下行中的print语句产生了问题。

    $success = $pstatement->execute();
    print("Fetch all of the remaining rows in the result set:\n");
    $result = $pstatement->fetchAll(PDO::FETCH_COLUMN, 1);

插入JSON的编码并创造了所有麻烦。删除它可以解决问题。

Ajax调用必须始终伴随错误处理程序以帮助调试。

    error: function(xhr, textStatus, errorThrown) {
            alert('An error occurred! ' + ( errorThrown ? errorThrown :
            xhr.status ));