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

如何将这段PHP查询代码转换为MySQL预处理语句?

没问题,我帮你把这段查询代码改成更安全的预处理语句,同时保留原有功能——这样能彻底避免SQL注入风险,还能让代码更健壮:

转换为预处理语句的解决方案

原代码的核心问题是直接将用户可控的$_GET['id']拼接进SQL语句,这会导致SQL注入漏洞。下面是修改后的安全版本:

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $update = true;
    
    // 使用预处理语句,避免SQL注入
    $sql = "SELECT * FROM crimenews WHERE crimenews_id = ?";
    // 初始化预处理对象
    $stmt = mysqli_prepare($conn, $sql);
    // 绑定参数:"i"表示整数类型(如果你的crimenews_id是字符串,改成"s")
    mysqli_stmt_bind_param($stmt, "i", $id);
    // 执行查询
    mysqli_stmt_execute($stmt);
    // 获取结果集
    $result = mysqli_stmt_get_result($stmt);
    
    if(mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_array($result);
        $category = $row['crimenews_cat'];
        $url = $row['crimenews_url'];
        $datetime = $row['crimenews_datetime'];
        $lat = $row['crimenews_locationLat'];
        $lng = $row['crimenews_locationLong'];
    }
    
    // 关闭预处理语句(可选,但好习惯)
    mysqli_stmt_close($stmt);
}

关键修改说明:

  • 把SQL中的$id替换成占位符?,这是预处理语句的核心——SQL语句结构固定,参数通过绑定传入,避免了恶意SQL拼接
  • 使用mysqli_prepare()创建预处理对象,和数据库建立预编译的SQL连接
  • mysqli_stmt_bind_param()绑定参数:第一个参数是类型标识符,"i"对应整数(如果你的crimenews_id是字符类型比如UUID,就换成"s"),第二个参数是要绑定的变量
  • 执行后通过mysqli_stmt_get_result()获取结果集,后续的行数判断和数据读取逻辑和原代码完全一致
  • 最后关闭预处理语句,手动释放资源,养成良好的代码习惯

这样修改后,既保留了原有功能,又彻底杜绝了SQL注入的风险,代码的可读性和安全性都得到了提升。

内容的提问来源于stack exchange,提问作者O San

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:14:03