如何:正确使用PHP将数据编码为JSON格式,并使用jquery / ajax请求数据

时间:2014-01-31 23:23:15

标签: php jquery ajax json mysqli

我正在尝试创建各种地址簿。

我可以成功连接到数据库并使用php脚本插入数据。

我甚至设法显示我的表行的json编码数据,但我不知道我是否做得对。

我实际想要完成的任务:

  1. 我希望能够发出一个ajax请求说明和ID,然后取回所有该ID的相应数据,(包装在Json中 - 至少我认为它需要......)。
  2. 使用ajax脚本,我希望能够将返回的相应数据保存到html文件中的输入字段。
  3. 我还想知道尝试将HTML返回到ajax调用是否更好,并将数据输入到html输入字段中?

    到目前为止,我的成功有限,但到目前为止我已经有了......

    我有一个数据库连接脚本:

    $host = "localhost";
    $user = "user";
    $pass = "pass";
    $db = "data_base";
    
    $mysqli = new mysqli($host, $user, $pass, $db);
    
    if($mysqli->connect_error) 
     die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
    
    return $mysqli;
    

    包含以下列的mysql ISAM DB:

        id, user, pass, nickname, address, facebook, twitter, linkedin, youtube
        ID should be unique
        User is an index
        Pass is an index
        nickname is an index
        address is primary - though its possible that id should be...
        Facebook, Twitter, Linkedin, and Youtube are all indexes. 
    

    注意:我很乐意改变索引,主要等等,因为有人认为合适......

    已编辑!**现在是我的查询页面:

    error_reporting(E_ALL); ini_set("display_errors", 1);
    include 'db/dbcon.php';
    //Start connection with SQL
    $q = "SELECT * FROM `cfaddrbook` WHERE key = '111111'";
    $res = $mysqli->query($q) or trigger_error($mysqli->error."[$q]");
    $array = array(); // initialize
    while($row = $res->fetch_array(MYSQLI_BOTH)) {
    $array[] = array(
    'key' => $row[0],
    'username' => $row[1],
    // ... continue like this
    );
    }
    header('Content-Type: application/json');
    echo json_encode($array);
    $res->free();
    $mysqli->close();
    

    现在,上面的脚本似乎运行正常。至少它在浏览器中加载php页面时显示正常。

    但是当我用这个脚本进行ajax调用时:

    $(document).ready(function(){ 
    $.ajax({
            type: "POST",
            url: "queries.php",
            dataType: 'json',
            data: "",
            cache: false,
            success: function(result)
                {
                    var cfkey = result[0];
                    var user = result[1];
                    alert("cfkey:" + cfkey + "user:" + user);
                }
        });
    });
    

    加载此代码后,chrome控制台会指出服务器返回错误500。

    再次,我想要完成的任务:

    1. 我希望能够发出一个ajax请求说明和ID,然后取回所有该ID的相应数据,(包装在Json中 - 至少我认为它需要......)。
    2. 使用ajax脚本,我希望能够将返回的相应数据保存到html中的输入字段。
    3. 修改 最后发现我与Majid讨论的问题是SQL查询。 key需要包含在`characters。

4 个答案:

答案 0 :(得分:1)

执行查询后结果集在$res中可用时,您可以构建阵列,不需要单独的foreach:

$array = array(); // initialize
while($row = $res->fetch_array(MYSQLI_BOTH)) {
  $array[] = array(
    'id'       => $row[0],
    'username' => $row[1],
    'password' => $row[2],
    'nick'     => $row[3],
    'addr'     => $row[4],
    'facebook' => $row[5],
    'twitter'  => $row[6],
    'linkedin' => $row[7],
    'youtube'  => $row[8]
  );
}
header('Content-Type: application/json');
echo json_encode($array);

另请注意,这样,您的json将拥有密钥,因此要使用密钥,您应该更改:

success: function(result) {
  var cfkey = result[0];
  var user = result[1];
  alert("cfkey:" + cfkey + "user:" + user);
}

success: function(result) {
  var cfkey = result.id;
  var user = result.username;
  alert("cfkey:" + cfkey + "user:" + user);
}

或者只是做

$.getJSON('queries.php', {cfkey: $("#cfkey").val()}, function(result) {
  // we have multiple results
  $.each(result, function(i,r) {
    console.log("cfkey:" + r.key + "user:" + r.username);
  });
});

编辑:@amurrell指出添加标题

答案 1 :(得分:0)

我相信你期望query.php返回json(到你的ajax),因此你需要在queries.php中使用内容头类型!

header('Content-Type: application/json');

答案 2 :(得分:0)

您需要更多有用的错误消息。尝试在代码的开头添加以下行。

的error_reporting(E_ALL);  ini_set(“display_errors”,1);

答案 3 :(得分:0)

您输出JSON的脚本正在编写几个有效的JSON字符串(每个数据库行一个),但它们不会添加到有效的JSON文件中。 JSON文件应该代表一个JSON对象。

如果要传递ID并返回一个数据库行,则必须将该ID添加到AJAX调用的data部分,并修改queries.php以从其{{1}传递该ID数组进入MySQL查询的$_POST部分。然后,您只输出一个JSON编码的对象而不是多个,这将是一个有效的JSON文件。

(或者,如果您想要整个表格,则可以单独WHERE整个json_encode()数组,而不是每个$rows数组。)

另外,如果您在PHP中使用$row字符串索引数组,则按名称而不是索引在Javascript中读取其属性。您已经遇到了在PHP中命名密钥的麻烦,然后切换回尝试通过Javascript中基于0的索引引用它们。你可以选择一种方式,但你只能选一种!