You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP从MySQL数据库生成指定格式的JSON数据

修改PHP代码实现MySQL数据的JSON输出需求

我来帮你调整这段代码,实现传入id参数返回单个JSON对象,无id参数返回JSON数组的需求,先理清楚问题和解决方案:

需求回顾

你需要从MySQL数据库生成指定格式的JSON:

  • 传入id时返回单个对象:
{
  "idbarang": "ID-75192864",
  "namabarang": "Fruit Tea",
  "jenisbarang": "Minuman",
  "hargabarang": "6000"
}
  • 无id参数时返回包含多个对象的JSON数组

现有代码问题

你当前的代码存在几个主要问题:

  1. 条件判断$idbarang == !null逻辑错误,会导致判断不准确
  2. 即使传入id,仍用循环把结果放到数组里,所以返回的是数组而非单个对象
  3. 直接拼接SQL存在SQL注入风险

先看你现有的代码:

<?php 
include 'koneksi.php';

$idbarang = $_GET['id'];

if($idbarang == !null){
    $query = mysqli_query($conn, "SELECT * FROM data_barang WHERE id_barang = '$idbarang'");

    $result = array();
    $i= 0;
    while($row = mysqli_fetch_array($query)){
        $result[$i]['idbarang'] = $row['id_barang'];
        $result[$i]['namabarang'] = $row['nama_barang'];
        $result[$i]['jenisbarang'] = $row['jenis_barang'];
        $result[$i]['hargabarang'] = $row['harga_barang'];
        $i++;
    };

    echo json_encode($result);

} else {
    $query = mysqli_query($conn, "SELECT * FROM data_barang");

    $result = array();
    $i= 0;
    while($row = mysqli_fetch_assoc($query)){
        $result[$i]['idbarang'] = $row['id_barang'];
        $result[$i]['namabarang'] = $row['nama_barang'];
        $result[$i]['jenisbarang'] = $row['jenis_barang'];
        $i++;
    };

    echo json_encode($result);
}
?>

当前错误输出

即使传入id,返回的还是数组格式:

[
  {
    "idbarang": "ID-75192864",
    "namabarang": "Fruit Tea",
    "jenisbarang": "Minuman",
    "hargabarang": "6000"
  },
  {
    "idbarang": "ID-96037284",
    "namabarang": "Sampoerna",
    "jenisbarang": "Rokok",
    "hargabarang": "12000"
  }
]

修改后的代码

下面是修正后的代码,解决了上述问题,还增加了SQL注入防护:

<?php 
include 'koneksi.php';

// 设置响应头为JSON格式,确保客户端正确解析
header('Content-Type: application/json');

// 获取并处理id参数
$idbarang = isset($_GET['id']) ? trim($_GET['id']) : '';

if(!empty($idbarang)){
    // 使用预处理语句避免SQL注入,更安全
    $stmt = $conn->prepare("SELECT id_barang, nama_barang, jenis_barang, harga_barang FROM data_barang WHERE id_barang = ?");
    $stmt->bind_param("s", $idbarang); // "s"表示参数为字符串类型
    $stmt->execute();
    $result = $stmt->get_result();
    
    // 获取单条数据(假设id_barang是主键,只会有一条结果)
    if($row = $result->fetch_assoc()){
        $response = [
            'idbarang' => $row['id_barang'],
            'namabarang' => $row['nama_barang'],
            'jenisbarang' => $row['jenis_barang'],
            'hargabarang' => $row['harga_barang']
        ];
        echo json_encode($response);
    } else {
        // 没有找到对应id的商品时,返回空对象或自定义提示
        echo json_encode((object)[]);
        // 可选:返回错误提示 echo json_encode(['message' => '商品未找到']);
    }
    $stmt->close();
} else {
    // 查询所有商品,返回数组
    $query = mysqli_query($conn, "SELECT id_barang, nama_barang, jenis_barang, harga_barang FROM data_barang");

    $result = [];
    while($row = mysqli_fetch_assoc($query)){
        $result[] = [
            'idbarang' => $row['id_barang'],
            'namabarang' => $row['nama_barang'],
            'jenisbarang' => $row['jenis_barang'],
            'hargabarang' => $row['harga_barang']
        ];
    }

    echo json_encode($result);
}

// 关闭数据库连接
$conn->close();
?>

关键修改点

  • 修正了id参数的判断逻辑,用!empty($idbarang)确保参数有效
  • 传入id时直接返回单个对象,不再用循环包装成数组
  • 使用预处理语句替代直接拼接SQL,防止SQL注入攻击
  • 新增header('Content-Type: application/json')确保响应被正确识别为JSON
  • 优化了数组赋值写法,去掉不必要的计数器$i

内容的提问来源于stack exchange,提问作者Amrul Izwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 17:01:48