我如何使用json_encode()函数与MySQL查询结果?我是否需要遍历这些行,或者我可以将其应用到整个结果对象?
当前回答
下面的代码在这里可以正常工作!
<?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);
?>
其他回答
http://www.php.net/mysql_query说“mysql_query()返回一个资源”。
http://www.php.net/json_encode说它可以编码任何值,“除了资源”。
您需要在数组中遍历和收集数据库结果,然后对数组进行json_encode。
使用FOR循环的另一个选项:
$sth = mysql_query("SELECT ...");
for($rows = array(); $row = mysql_fetch_assoc($sth); $rows[] = $row);
print json_encode($rows);
唯一的缺点是循环for比while或特别是foreach慢
<?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(行,row_array美元);有助于构建数组,否则将给出while循环中的最后一个值。
这类似于Java中StringBuilder的append方法。
考虑到在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);
}
?>
使用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);