我有一个php脚本来创建从mysql数据库获取数据的json输出:
<?php
include("myconnection.php");
//Creamos y ejecutamos la consulta
$sql = "SELECT * FROM myTable where value='1003'";
$result=mysql_query($sql);
while($row = mysql_fetch_array($result)){
$value1 = $row['value1'];
$value2 = $row['value2'];
$data = json_encode(
array("value1" => $value1,
"value2" => $value2));
echo $data;
}
?>
我得到了这样的结果:
{"value1":"847534837","value2":"Regular"}{"value1":"847534838","value2":"Regular"}
我想用括号和逗号来获得这样的结果:
[{"value1":"847534837","value2":"Regular"},{"value1":"847534838","value2":"Regular"}]
我试图像这样写一些回音句:
echo "[";
while($row = mysql_fetch_array($result)){
$value1 = $row['value1'];
$value2 = $row['value2'];
$data = json_encode(
array("value1" => $value1,
"value2" => $value2)).",";
echo $data;
}
echo "]";
但结果完成了&#34;,]&#34;像这样:
[{"value1":"847534837","value2":"Regular"},{"value1":"847534838","value2":"Regular"},]
我想要一些帮助。
答案 0 :(得分:1)
让json_encode()
为您完成工作,不要试图推出自己的编码器!
要获得您想要的json字符串输出,只需将您当前正在编码的项目一次一个地粘贴到另一个数组中,然后对谁进行一次enchilada编码。
$final_array = []; notation
while($row = mysql_fetch_array($result)){
$final_array[] = ["value1" => $row['value1'],
"value2" => $row['value2']];
}
echo json_encode($final_array);
注意:我假设您使用的是PHP&gt; = 5.4并且使用
[]
表示法, 否则更换[]
和["value1" => $row['value1'], "value2" => $row['value2']]
分别有array()
和array("value1" => $row['value1'], "value2" => $row['value2'])
。
答案 1 :(得分:0)
首先,不要使用mysql_*
函数。使用PDO。
其次,有两种方法可以解决这个问题:
对于少量数据:
$result = $pdo->query('SELECT column1 as key1, ... FROM ...');
echo json_encode($result->fetchAll(PDO::FETCH_ASSOC));
这个方法会将数据同时保存在内存中四次:MySQL的缓冲区包含结果,PDO的结果集,序列化的JSON字符串和输出缓冲区。对于少量数据(最多1 MB),它很好,而且是最快的方法。
对于大量数据,您可以在小的常量内存空间中执行此操作。但它要复杂得多。
首先,您需要摆脱fetchAll()
电话。但是因为PHP中没有流式JSON编码器,所以你需要自己编写,你尝试过。然后下一步是在MySQL服务器中使用无缓冲查询,因此结果集不会在数据库服务器中预先生成。毕竟,您可以将整个数据库转储到JSON数组中而不必担心内存。但我觉得你应该坚持上面两行。
流式JSON编写器:
让我们假设您需要数组,并且您拥有可迭代对象,并且集合中的单个对象很小,但是它们中有很多。然后你需要这样做:
function write_json_array($array) {
echo "[\n";
$first = true;
foreach ($array as $v) {
if ($first) {
$first = false;
} else {
echo ",\n";
}
echo json_encode($v);
}
echo "]";
}
然后你可以像这样使用它:
$result = $pdo->query('SELECT column1 as key1, ... FROM ...');
$result->setFetchMode(PDO::FETCH_ASSOC);
write_json_array($result); // PDOStatement will do the trick.