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

PHP更新数据库数据时出现SQL语法错误的技术求助

问题排查与解决

核心语法错误原因

你的SQL语句存在两个关键问题,直接触发语法错误:

  1. 字符串类型字段未加引号:如果kd_buku是字符串类型(如VARCHAR),Where kd_buku=$kdba中的$kdba未被单引号包裹,会导致数据库将参数值识别为非法字段名。比如$kdba为BK001时,SQL会变成Where kd_buku=BK001,这明显不符合语法规范。
  2. SQL注入风险:直接将POST参数拼接进SQL语句,不仅会引发语法问题,还会导致严重的安全漏洞。

修复方案

方案1:临时修复语法错误(仅用于测试,生产环境禁用)

给$kdba添加单引号,保证字符串类型参数的语法合法性:

$sql = "UPDATE tb_buku SET judul_buku='$jdla', pengarang='$pgra', penerbit='$pnra', tahun='$tha' WHERE kd_buku='$kdba'";

注意:此方法仅解决语法问题,无法抵御SQL注入攻击,禁止在生产环境使用。

方案2:使用预处理语句(推荐,安全且彻底解决问题)

采用mysqli预处理语句绑定参数,同时解决语法错误和安全风险:

<?php
include("config.php");

if(isset($_POST['save'])){
    // 获取表单数据
    $kdba = $_POST['kd_buku'];
    $jdla = $_POST['jdlbuku'];
    $pgra = $_POST['pengarang'];
    $pnra = $_POST['penerbit'];
    $tha = $_POST['thn'];

    // 准备预处理语句
    $sql = "UPDATE tb_buku SET judul_buku=?, pengarang=?, penerbit=?, tahun=? WHERE kd_buku=?";
    $stmt = mysqli_prepare($db, $sql);
    
    // 绑定参数:s代表字符串,i代表整数,根据实际字段类型调整
    // 假设tahun为整数类型,其余字段为字符串
    mysqli_stmt_bind_param($stmt, "ssssi", $jdla, $pgra, $pnra, $tha, $kdba);
    
    // 执行语句
    mysqli_stmt_execute($stmt);

    // 验证执行结果
    if(mysqli_stmt_affected_rows($stmt) > 0) {
        header('Location: tbbuku.php');
        exit;
    } else {
        die("Gagal menyimpan perubahan...");
    }

} else {
    die("Akses dilarang...");
}
?>

额外检查项

  • 确认kd_buku字段的数据类型:如果是整数类型,方案1中可不加引号,但仍强烈建议使用预处理语句。
  • 添加参数存在性校验:增加isset($_POST['kd_buku'])判断,避免因参数缺失导致SQL语句不完整。

内容的提问来源于stack exchange,提问作者Yansa Rah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:30:50