[英]Return MySQL data in JSON format
在使用 JSON/PHP 时,我是新手。 我一直试图根据这个答案来让它工作。
我正在尝试查询 MySQL 数据库以将其以 JSON 格式输出,而无需将其写入新文件 IE 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));
?>
-谢谢!
首先,仅使用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);
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.