JSON编码MySQL结果

我如何使用json_encode()函数与MySQL查询结果?我是否需要遍历这些行,或者我可以将其应用到整个结果对象?

587731 次浏览

http://www.php.net/mysql_query表示“mysql_query()返回一个资源”。

http://www.php.net/json_encode表示它可以编码“除了资源”的任何值。

你需要在数组中遍历和收集数据库结果,然后json_encode数组。

$sth = mysqli_query($conn, "SELECT ...");
$rows = array();
while($r = mysqli_fetch_assoc($sth)) {
$rows[] = $r;
}
print json_encode($rows);

函数json_encode需要PHP >= 5.2和php-json包-如前所述在这里

请注意: mysql自PHP 5.5.0起已弃用,请使用mysqli扩展来代替http://php.net/manual/en/migration55.deprecated.php

根据我的经验,在你命名根元素之前,上面的方法是行不通的 数组中的东西,我还没有能够访问任何东西

$sth = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
$rows['root_name'] = $r;
}
print json_encode($rows);

这应该能奏效!

试试这个,这将正确创建您的对象

 $result = mysql_query("SELECT ...");
$rows = array();
while($r = mysql_fetch_assoc($result)) {
$rows['object_name'][] = $r;
}


print json_encode($rows);

我的简单修复,以阻止它把语音标记周围的数值…

while($r = mysql_fetch_assoc($rs)){
while($elm=each($r))
{
if(is_numeric($r[$elm["key"]])){
$r[$elm["key"]]=intval($r[$elm["key"]]);
}
}
$rows[] = $r;
}

使用FOR循环的另一个选项:

 $sth = mysql_query("SELECT ...");
for($rows = array(); $row = mysql_fetch_assoc($sth); $rows[] = $row);
print json_encode($rows);

唯一的缺点是循环for比while或特别是foreach慢

抱歉,这是在问题之后很长一段时间,但是:

$sql = 'SELECT CONCAT("[", GROUP_CONCAT(CONCAT("{username:'",username,"'"), CONCAT(",email:'",email),"'}")), "]")
AS json
FROM users;'
$msl = mysql_query($sql)
print($msl["json"]);

基本上:

"SELECT" Select the rows
"CONCAT" Returns the string that results from concatenating (joining) all the arguments
"GROUP_CONCAT" Returns a string with concatenated non-NULL value from a group
例如< p > $result = mysql_query("SELECT * FROM userprofiles where NAME='TESTUSER' ")

1.)如果$result只有一行。

$response = mysql_fetch_array($result);
echo json_encode($response);

2.)如果$result多于一行。你需要迭代这些行,并将其保存到一个数组中,并返回一个包含数组的json。

$rows = array();
if (mysql_num_rows($result) > 0) {
while($r = mysql_fetch_assoc($result)) {
$id = $r["USERID"];   //a column name (ex.ID) used to get a value of the single row at at time
$rows[$id] = $r; //save the fetched row and add it to the array.
}
}
echo json_encode($rows);

我们可以这样简化保罗柏甘蒂诺的答案

$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));

下面的代码在这里可以正常工作!

<?php


$con=mysqli_connect("localhost",$username,$password,databaseName);


// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}


$query = "the query here";


$result = mysqli_query($con,$query);


$rows = array();
while($r = mysqli_fetch_array($result)) {
$rows[] = $r;
}
echo json_encode($rows);


mysqli_close($con);
?>
if ($result->num_rows > 0) {
# code...
$arr = [];
$inc = 0;
while ($row = $result->fetch_assoc()) {
# code...
$jsonArrayObject = (array('lat' => $row["lat"], 'lon' => $row["lon"], 'addr' => $row["address"]));
$arr[$inc] = $jsonArrayObject;
$inc++;
}
$json_array = json_encode($arr);
echo $json_array;
} else {
echo "0 results";
}

我是这样解的

$stmt->bind_result($cde,$v_off,$em_nm,$q_id,$v_m);
$list=array();
$i=0;
while ($cresult=$stmt->fetch()){




$list[$i][0]=$cde;
$list[$i][1]=$v_off;
$list[$i][2]=$em_nm;
$list[$i][3]=$q_id;
$list[$i][4]=$v_m;
$i=$i+1;
}
echo json_encode($list);
这将作为结果集返回给ajax 通过在javascript部分使用json解析:

obj = JSON.parse(dataX);
<?php


define('HOST', 'localhost');
define('USER', 'root');
define('PASS', '');
define('DB', 'dishant');


mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = mysqli_connect(HOST, USER, PASS, DB);


$sql = "select * from demo ";
$sth = mysqli_query($con, $sql);
$rows = array();
while ($r = mysqli_fetch_array($sth, MYSQLI_ASSOC)) {
$row_array['id'] = $r;


array_push($rows, $row_array);
}
echo json_encode($rows);

array_push($rows,$row_array);有助于构建数组,否则它将给出while循环中的最后一个值。

这类似于Java中StringBuilderappend方法。

使用PDO时

使用< >强fetchAll() < / >强获取作为关联数组的所有行。

$stmt = $pdo->query('SELECT * FROM article');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

当你的SQL有参数时:

$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

当你需要重键表时,你可以使用foreach循环并手动构建数组。

$stmt = $pdo->prepare('SELECT * FROM article WHERE id=?');
$stmt->execute([1]);


$rows = [];
foreach ($stmt as $row) {
$rows[] = [
'newID' => $row['id'],
'Description' => $row['text'],
];
}


echo json_encode($rows);

使用mysqli时

使用< >强fetch_all() < / >强获取作为关联数组的所有行。

$res = $mysqli->query('SELECT * FROM article');
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);

当你的SQL有参数时,你需要执行prepare/bind/execute/get_result。

$id = 1;
$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id); // binding by reference. Only use variables, not literals
$stmt->execute();
$res = $stmt->get_result(); // returns mysqli_result same as mysqli::query()
$rows = $res->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);

当你需要重键表时,你可以使用foreach循环并手动构建数组。

$stmt = $mysqli->prepare('SELECT * FROM article WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();
$res = $stmt->get_result();


$rows = [];
foreach ($res as $row) {
$rows[] = [
'newID' => $row['id'],
'Description' => $row['text'],
];
}


echo json_encode($rows);

当使用mysql_* API时

请尽快升级到受支持的PHP版本!请认真对待。如果你需要一个使用旧API的解决方案,这是如何做到的:

$res = mysql_query("SELECT * FROM article");


$rows = [];
while ($row = mysql_fetch_assoc($res)) {
$rows[] = $row;
}


echo json_encode($rows);

考虑到在mysql中通常没有任何嵌套的json对象,创建自己的编码函数是相当容易的

首先,检索mysqli的函数会生成一个数组:

function noom($rz) {
$ar = array();
if(mysqli_num_rows($rz) > 0) {
while($k = mysqli_fetch_assoc($rz)) {
foreach($k as $ki=>$v) {
$ar[$ki] = $v;
}
}
}
return $ar;
}

现在,函数将数组编码为json:

function json($ar) {
$str = "";
$str .= "{";
$id = 0;
foreach($ar as $a=>$b) {
$id++;
$str .= "\"".$a."\":";
if(!is_numeric($b)) {
$str .= "\"".$b."\"";
} else {
$str .= $b;
}
        

if($id < count($ar)) {
$str .= ",";
}
}
$str .= "}";
return $str;
}

然后使用它:

<?php
$o = new mysqli(
"localhost",
"root",""
);
if($o->connect_error) {
echo "DUDE what are you/!";
} else {
$rz = mysqli_query($o,
"SELECT * FROM mydatabase.mytable"
);
$ar = noom($rz);
echo json($ar);
}
?>

我们不应该在现代应用程序中看到任何mysql_函数的使用,所以使用mysqli_或pdo函数。

一些开发人员认为,在输出数据有效负载之前显式调用header("Content-type:application/json");是最佳实践。这通常不是一个要求,但是向可能接收它的任何对象阐明了有效负载的格式。

假设这是唯一要打印的数据,使用exit()打印json字符串是安全的,这也将终止脚本的执行。同样,这也不是必需的,因为echo也可以很好地工作,但一些开发人员认为显式终止脚本是一个很好的实践。


MySQLi单行结果集:

exit(json_encode($result->fetch_assoc()));  // 1-dimensional / flat

MySQLi多行结果集对象:

在PHP 8.1.0之前,只能在mysqlnd中使用。

exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));  // 2-dimensional / array of rows

MySQLi单行结果集:

$result = $stmt->get_result();
exit(json_encode($result->fetch_assoc()));  // 1-dimensional / flat

MySQLi多行结果集

$result = $stmt->get_result();
exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));  // 2-dimensional / array of rows

查询结果集对象的PDO单行结果集

exit(json_encode($result->fetch(PDO::FETCH_ASSOC)));  // 1-dimensional / flat

查询结果集对象的PDO多行结果集

exit(json_encode($result->fetchAll(PDO::FETCH_ASSOC)));  // 2-dimensional / array of rows

预处理语句的PDO单行结果集:

exit(json_encode($stmt->fetch(PDO::FETCH_ASSOC)));  // 1-dimensional / flat

预处理语句的PDO多行结果集:

exit(json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)));  // 2-dimensional / array of rows

遵守这些规则以防止生成无效json的可能性:

  1. 你应该只在你完全完成操作结果数组和之后调用json_encode()
  2. 你应该总是使用json_encode()来编码有效负载(避免使用其他字符串函数或串联手动生成json字符串)。

如果你需要迭代结果集数据来运行php函数或提供数据库语言不提供的功能,那么你可以立即使用foreach()迭代结果集对象,并使用数组语法访问值。

$response = [];
foreach ($result as $row) {
$row['col1'] = someFunction($row['id']);
$response[] = $row;
}
exit(json_encode($response));

如果你在数据有效负载上调用json_encode(),那么有效负载是数组的数组还是对象的数组都不会有任何区别。创建的json字符串将具有相同的语法。


在完成连接后,不需要显式地关闭数据库连接。当脚本终止时,连接将自动关闭。