如何:正确使用PHP将数据编码为JSON格式,并使用jquery / ajax请求数据
我正在尝试创建各种地址簿。
我可以成功连接到数据库并使用php脚本插入数据。
我甚至设法显示我的表行的json编码数据,但我不知道我是否做得对。
我实际上想要完成的事情:
- 我希望能够发出一个ajax请求说和ID,然后获取所有ID的相应数据,(包装在Json中 – 至少我认为它需要……)。
- 使用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。
再次,我想要完成的事情:
- 我希望能够发出一个ajax请求说和ID,然后获取所有ID的相应数据,(包装在Json中 – 至少我认为它需要……)。
- 使用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的索引引用它们。 你可以选择一种方式,但你只能选一种!