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

Posted

技术标签:

【中文标题】如何:正确使用PHP将数据编码成JSON格式,并通过jquery/ajax请求数据【英文标题】:How to: Properly use PHP to encode data into JSON format, and request the data with jquery/ajax 【发布时间】:2014-02-24 20:19:09 【问题描述】:

我正在尝试创建一个地址簿。

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

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

我真正想要实现的目标:

    我希望能够对 say 和 ID 发出 ajax 请求,然后取回该 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。

再说一遍,我要完成的工作:

    我希望能够对 say 和 ID 发出 ajax 请求,然后取回该 ID 的所有相应数据(包装在 Json 中 - 至少我认为它需要......)。 通过ajax脚本,我希望能够将返回的对应数据保存到html中的输入字段中。

编辑: 最后发现我和 Majid 讨论的问题是 SQL 查询。 需要的键需要用`字符包裹。

【问题讨论】:

您在连接脚本中缺少",在$pass 之后。 当我拿出我的真实密码将代码粘贴到这里时,这是一个拼写错误。我服务器上的实际代码实际上有 $pass = "password";在 php 代码中正确说明。不过谢谢! 【参考方案1】:

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

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

【讨论】:

我在“include”行下添加了它,控制台再次返回500错误(对于ajax查询)。我是不是加错地方了? 你应该把它放在包含之前。在header 的PHP 手册中,它说: 请记住,必须在发送任何实际输出之前调用header(),无论是通过普通HTML 标记、文件中的空白行还是从PHP 发送。使用 include 或 require 函数或其他文件访问函数读取代码并在调用 header() 之前输出空格或空行是一个非常常见的错误。使用单个 PHP/HTML 文件时也存在同样的问题。 它现在位于包含行的上方。仍然没有区别。【参考方案2】:

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

error_reporting(E_ALL); ini_set("display_errors", 1);

【讨论】:

添加了这个,现在它只是给出了一堆导致脚本中断的 php 错误。【参考方案3】:

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

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

(或者,如果您想恢复整个表,您可以json_encode() 整个$rows 数组而不是单独的每个$row。)

另外,如果您在 PHP 中json_encode() 一个字符串索引数组,那么您在 javascript 中按名称而不是按索引读取它的属性。您已经经历了在 PHP 中命名键的麻烦,然后切换回尝试通过它们在 Javascript 中的基于 0 的索引来引用它们。您可以选择一种方式或其他方式,但您只能选择一种方式!

【讨论】:

您的回复几乎就是我想要完成的。请您详细说明第 1 段、第 2 段和第 3 段吗? 所以,全部...如果你将data 设置为 id : 1 ,那么在PHP 中$_POST['id'] 将是1。不过现在,只需将 MySQL 查询硬编码为 SELECT * FROM cfaddrbook WHERE id = 1(尽管选择一个现有的 id 号),您就会看到您得到了有效的 JSON。在您的成功处理程序中,将result[0] 更改为result.id 并将result[1] 更改为result.username,它应该按照您想要的方式工作。您应该能够通过更多的实验从那里弄清楚。祝你好运! 在添加 WHERE id = 1 行后,在我的情况下,WHERE key = 111111,它会吐出很多错误。如果我采取这种方式,显示 php 页面时不会再出现错误。 另外,在 URL 后添加 &username 仍然会显示所有 JSON 数据,而不是与其对应的特定数据。所以我想知道当数据被传递回ajax查询时,它是否找不到它的请求?【参考方案4】:

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

【讨论】:

很棒的建议!但是,输入代码后,php给了我: 编辑过多!对不起。这表明我该睡觉了! "PHP 解析错误:语法错误,意外的 ',' in /file/... 第 8 行 @user3259138,是的,我的代码有错误,最后一次编辑应该可以正常工作;) 代码:包括'db/dbcon.php'; //用SQL开始连接 $q = "SELECT * FROM cfaddrbook"; $res = $mysqli->query($q) 或 trigger_error($mysqli->error."[$sql]"); $数组 = 数组(); // 初始化 while($row = $res->fetch_array(MYSQLI_BOTH)) $array[]['id'] = $row[0], $array[]['username'] = $row[1], // ... 像这样继续 echo json_encode($array); $结果->免费(); $mysqli->close();

以上是关于如何:正确使用PHP将数据编码成JSON格式,并通过jquery/ajax请求数据的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 PHP 将 MySQL 对象编码为 JSON?

如何在PHP中返回Json数据

php数组转换成json格式后汉字怎么就被解析成字母了啊

PHP json 编码 - 格式错误的 UTF-8 字符,可能编码不正确

使用 PHP 的正确 JSON 格式

如何正确运用PHP json