返回JSON格式的MySQL数据


Return MySQL data in JSON format

我是一个使用JSON/PHP的新手。我一直在尝试用这个答案来解决这个问题。

如何用PHP生成。json文件?

我试图查询MySQL数据库以JSON格式输出,而无需将其写入新文件I.E.文件。json,因为我正在拉动态数据。我可以创建一个脚本,创建一个json数组,但是,我需要在json格式的输出。我一直在下面工作的脚本从上面的例子链接连接到数据库,但是,它不是用数据填充。它只是给出了这个输出。我添加了DB连接检查来检查脚本是否连接到DB。

连接成功{"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));
?>

-谢谢!

首先,只使用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中,因此不需要转义斜杠,我们将使其很好地缩进,以便于调试。

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

while($row=mysql_fetch_array($result))

另外,你使用了与PDO不兼容的mysql_函数。你应该使用$db->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;
}

注意:带"unset"的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更容易和更轻。祝你好运。

您可以在这里查看工作代码

<?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);
?>