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

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

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

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

我实际上想要完成的事情:

  1. 我希望能够发出一个ajax请求说和ID,然后获取所有ID的相应数据,(包装在Json中 – 至少我认为它需要……)。
  2. 使用ajax脚本,我希望能够将返回的相应数据保存到html文件中的输入字段。

我还想知道尝试将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中的输入字段。

编辑:最后发现我与Majid讨论的问题是SQL查询。 key需要包含在`字符中。

在执行查询并且结果集在$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指出添加的标题

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

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

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

使用error_reporting(E_ALL); ini_set(“display_errors”,1);

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

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

(或者,你可以json_encode()整个$rows数组,而不是每个$row如果你想要整个表回来。)

此外,如果您在PHP中使用字符串索引的数组json_encode() ,则可以按名称而不是索引来读取Javascript中的属性。 您已经解决了在PHP中命名密钥的问题,然后切换回尝试通过Javascript中基于0的索引引用它们。 你可以选择一种方式,但你只能选一种!