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


当前回答

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

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;
}   

其他回答

使用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);
$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。

使用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);
}
?>