【问题标题】:Return MySQL data in JSON format以 JSON 格式返回 MySQL 数据
【发布时间】:2017-02-24 10:23:11
【问题描述】:

在使用 JSON/PHP 时,我是个新手。我一直试图根据这个答案让它工作。

How to generate .json file with PHP?

我正在尝试查询 MySQL 数据库以将其以 JSON 格式输出,而无需将其写入新文件 I.E. file.json 因为我正在提取动态数据。我可以创建一个创建 json 数组的脚本,但是我需要 JSON 格式的输出。我在下面的示例链接中使用的脚本连接到数据库,但是它没有填充数据。它只是给了我这个输出。我添加了数据库连接检查以检查脚本是否连接到数据库。

连接成功{"streamers":[]}

这是我目前正在使用的代码。有没有人可以告诉我我缺少什么并且可以改进。出于安全原因删除了数据库信息。

<?php

header('Content-type:application/json;charset=utf-8');

//Make connection to database
$db=new PDO('mysql:dbname=streamdb;host=localhost;','root','');  

// Check connection
if ($db->connect_error) {
    die("Connection failed: " . $db->connect_error);
} 
echo "Connected successfully";

//Prepare the query for analyzing    
$sql=$db->prepare('select * from maintable'); 

$response = array();
$streamers = array();
$result=mysql_query($sql);
while($sql=mysql_fetch_array($result)) 
{ 
$displayname=$row['DisplayName']; 
$streamkey=$row['StreamKey']; 

$streamers[] = array('DisplayName'=> $displayname, 'StreamKey'=> $streamkey);

} 

$response['streamers'] = $streamers;

echo stripslashes(json_encode($response));

?>

-谢谢!

【问题讨论】:

  • 在发送 JSON 标头时不能回显 JSON 和纯文本。它是格式错误的 JSON。
  • 不要使用stripslashes,json_encode() 会为你处理。
  • 看起来你的“$row”变量没有在任何地方初始化。应该是:while($row=...)

标签: php mysql json


【解决方案1】:

首先,仅使用PDO。没有 mysql_* 函数。

那么你的代码应该是这样的:

$pdo = new PDO('mysql:host=...', 'username', 'password', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
$result = $pdo->query('SELECT DisplayName, StreamKey FROM ...');
$rows = $result->fetchAll(PDO::FETCH_ASSOC);
header('Content-Type: application/json;charset=utf-8');
echo json_encode(['streamers' => $rows],
        JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

PDO::ERRMODE_EXCEPTION 将 PDO 设置为将所有错误作为异常抛出,因此可以以简单且一致的方式处理它们。

PDO::FETCH_ASSOC 设置 fetchAll() 以将行作为数组返回,其中列名用作数组键。

json_encode() 将负责生成有效的 JSON 输出。由于您没有将 JSON 嵌入到 HTML 中,因此不需要转义斜杠,我们会将其很好地缩进以便于调试。

【讨论】:

  • 感谢您的建议。我试了一下,它似乎正在工作。你能告诉我这看起来格式是否正确吗? livestormsmedia.com/livestormchasing/api/streaming/json.php 我需要进行一些小调整,因为我只需要显示某些信息。使用您的解决方案,我怎样才能只提取某些数据?
  • 看起来不错。要仅提取某些数据,请在 SQL 查询中枚举它们(更新答案)。
  • 非常感谢您的指导和有用的解释。似乎工作得很好!
【解决方案2】:

正如我在评论中所说,问题可能是“$row”没有初始化。应该是:

while($row=mysql_fetch_array($result))

另外,您使用了与 PDO 不兼容的 mysql_ 函数。您应该使用$db-&gt;query 完成您的请求。

当你询问建议时,我可能会给你一个我使用的技巧。

我认为仅检索一个基本上是查询结果内容的表(在 $result 中)需要大量代码。我猜你几乎每个请求都有类似的代码。所以我通常做的是构建一个名为extractResult 的通用函数,它直接根据查询结果生成一个行数组。

函数如下:

/**
* Extract a php array from the result of a db query.
* This result can be directly parsed in JSON for instance.
*/
function extractResult($res) {
    $arr = array();
    while($line = $res->fetch()) {
        $count = count($line)/2;
        for ($i=0; $i<$count; $i++) {
            unset($line[$i]);
        }
        array_push($arr, $line);
    }
    return $arr;
}

注意:带有“未设置”的 for 循环用于删除带有数字的条目。 fetch 返回的内容是这样的:

Array("DisplayName" => "Loulou", 0 =>"Loulou", "StreamKey" => 12, 1 => 12)

所以它删除了数字重复。

所以你可以像这样使用它,你的代码会变得更轻:

<?php

header('Content-type:application/json;charset=utf-8');

//Make connection to database
$db=new PDO('mysql:dbname=streamdb;host=localhost;','root','');  

// Check connection
if ($db->connect_error) {
    die("Connection failed: " . $db->connect_error);
} 
echo "Connected successfully";

$result=$db->query('select display_name AS DisplayName, stream_key AS StreamKey from maintable');

$response = array();
$response['streamers'] = extractResult($result);

echo json_encode($response);

?>

请注意,您必须直接在请求中指定您想要的列名! :)

不知道它是否有趣,但我总是使用这个技巧,因此从 DB 构建 JSON 变得更容易和更轻松。 :) 祝你好运。

【讨论】:

    【解决方案3】:

    在这里你可以检查工作代码

    <?php
    $con=mysqli_connect($servername,$username,$password,$databasename);
    if (mysqli_connect_errno())
    {
    echo "Connection Error" . mysqli_connect_error();
    }
    $query = "SELECT * FROM TableName";
    $result = mysqli_query($con,$query);
    $querydata = array();
    while($data = mysqli_fetch_array($result)) {
    $querydata[] = $data;
    }
    echo json_encode($querydata);
    mysqli_close($con);
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2017-08-08
      • 2014-09-04
      相关资源
      最近更新 更多