如何用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数组
现有代码问题
你当前的代码存在几个主要问题:
- 条件判断
$idbarang == !null逻辑错误,会导致判断不准确 - 即使传入id,仍用循环把结果放到数组里,所以返回的是数组而非单个对象
- 直接拼接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
相关产品推荐
相关产品推荐

