我如何使用json_encode()函数与MySQL查询结果?我是否需要遍历这些行,或者我可以将其应用到整个结果对象?
当前回答
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";
}
其他回答
我们可以这样简化Paolo Bergantino的答案
$sth = mysql_query("SELECT ...");
print json_encode(mysql_fetch_assoc($sth));
我们不应该在现代应用程序中看到任何mysql_函数的使用,所以使用mysqli_或pdo函数。
显式调用报头("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的可能性:
只有在完全完成对结果数组和的操作之后,才应该调用json_encode() 您应该始终使用json_encode()对有效负载进行编码(避免使用其他字符串函数或连接手动生成json字符串)。
如果您需要迭代结果集数据来运行php函数或提供数据库语言不提供的功能,那么您可以立即使用foreach()迭代结果集对象并使用数组语法访问值。
$response = [];
foreach ($result as $row) {
$row['col1'] = someFunction($row['id']);
$response[] = $row;
}
exit(json_encode($response));
如果对数据有效负载调用json_encode(),那么无论有效负载是数组的数组还是对象的数组,都不会有任何区别。创建的json字符串将具有相同的语法。
在完成连接后,不需要显式地关闭数据库连接。当脚本终止时,连接将自动关闭。
http://www.php.net/mysql_query说“mysql_query()返回一个资源”。
http://www.php.net/json_encode说它可以编码任何值,“除了资源”。
您需要在数组中遍历和收集数据库结果,然后对数组进行json_encode。
例如 $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 = 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。