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

SQL语法错误:文本含单引号报错,如何用mysqli_real_escape_string()处理?

解决单引号导致的SQL语法错误:使用mysqli_real_escape_string()的正确姿势

这个问题我之前踩过坑——用户输入里的单引号(比如O'Neil这种内容)会直接打断SQL语句的字符串边界,导致语法报错。用mysqli_real_escape_string()就能把这些特殊字符转义,让SQL语句正确解析,下面是具体的修改方法:

核心修改步骤

  1. 确认数据库连接有效:mysqli_real_escape_string()必须传入数据库连接对象(也就是你的$conn)作为第一个参数,所以要保证连接已经正常建立。
  2. 转义所有用户输入变量:把从$_POST、$_FILES里获取的、要拼进SQL的变量,全部用这个函数处理一遍。
  3. 替换SQL中的原始变量:将转义后的变量代入SQL语句,保持原有结构不变。

修改后的完整代码

<?php 
if(isset($_POST["add_post"])){ 
    // 对所有用户输入的变量进行转义处理
    $post_title = mysqli_real_escape_string($conn, $_POST["post_title"]); 
    $post_category = mysqli_real_escape_string($conn, $_POST["post_category"]); 
    $post_tags = mysqli_real_escape_string($conn, $_POST["post_tags"]); 
    $post_text = mysqli_real_escape_string($conn, $_POST["post_text"]); 
    $post_date = date("d/m/y"); 
    $post_image = mysqli_real_escape_string($conn, $_FILES["post_image"]["name"]); 
    $post_image_temp = $_FILES["post_image"]["tmp_name"]; 

    move_uploaded_file($post_image_temp, "../images/$post_image"); 

    // 使用转义后的变量拼接SQL语句
    $query = "INSERT INTO posts (post_title, post_category, post_text, post_tags, post_date, post_image)"; 
    $query .= " VALUES('$post_title', '$post_category', '$post_text', '$post_tags', now(), '$post_image')"; 

    $create_post_query = mysqli_query($conn, $query) ; 

    if(!$create_post_query) { 
        die("QUERY FAILED:" .mysqli_error($conn)); 
    } else { 
        header("Location: posts.php"); 
    } 
} 
?>

额外建议:更安全的预处理语句

虽然mysqli_real_escape_string()能解决当前的单引号问题,但**预处理语句(Prepared Statements)**是更可靠的方案——它从根本上避免了SQL注入风险,还不需要手动处理转义。给你个简单的示例参考:

// 预处理语句写法示例
$query = "INSERT INTO posts (post_title, post_category, post_text, post_tags, post_date, post_image) 
          VALUES(?, ?, ?, ?, now(), ?)";
$stmt = mysqli_prepare($conn, $query);
// 绑定参数:"sssss"表示5个字符串类型的参数
mysqli_stmt_bind_param($stmt, "sssss", $post_title, $post_category, $post_text, $post_tags, $post_image);
mysqli_stmt_execute($stmt);

如果项目允许,建议切换到这种写法,安全性会提升很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:56:38