mysqli_query执行INSERT INTO语句失败,请求排查问题
我太懂这种看起来逻辑没问题但死活报错的抓狂感了!咱一步步来排查你代码里的问题,大概率是这几个点导致的:
1. 直接拼接SQL语句引发的语法错误(还带SQL注入风险)
你现在把用户输入的$title、$description直接拼进SQL里,如果用户输入里包含单引号(比如I'm a user),会直接破坏SQL语法结构,导致插入失败。这不仅是报错的原因,还会让你的代码暴露在SQL注入攻击下,非常危险。
解决方法是用预处理语句(Prepared Statements),这是PHP操作数据库的标准安全做法:
if(!empty($_POST['title']) && !empty($_POST['description']) && isset($_COOKIE['user_id'])) { $title = $_POST['title']; $description = $_POST['description']; $user_id = $_COOKIE['user_id']; // 用预处理语句避免SQL注入和语法错误 $query = "INSERT INTO posts (title, description, user_id) VALUES(?, ?, ?);"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "ssi", $title, $description, $user_id); // "ssi"对应字符串、字符串、整数 $result = mysqli_stmt_execute($stmt); if($result) { $_SESSION['post_message'] = "Posting succ"; header('Location: profile.php'); exit; // 跳转后一定要exit,避免后续代码执行 } else { // 打印具体错误信息,方便排查 $_SESSION['post_message'] = "Something went wrong: " . mysqli_error($conn); header('Location: profile.php'); exit; } }
2. 未检查数据库连接是否正常
如果$conn没有成功连接到数据库,mysqli_query会直接返回false。你可以在执行查询前加个连接检查:
if (!$conn) { die("Database connection failed: " . mysqli_connect_error()); }
3. $_COOKIE['user_id']可能不存在或为空
如果用户没有登录,user_id Cookie可能没设置,直接拼进SQL里会导致插入空值,如果posts表的user_id字段设置了NOT NULL约束,插入就会失败。所以一定要先判断Cookie是否存在:
if(!empty($_POST['title']) && !empty($_POST['description']) && isset($_COOKIE['user_id'])) { // 后续代码... } else { $_SESSION['post_message'] = "Please log in first or fill all fields"; header('Location: profile.php'); exit; }
4. 跳转前的输出问题(可能隐性影响)
你的HTML代码在PHP代码之前就有输出(比如<div class="heading">这些内容),而PHP里用header('Location: ...')要求在输出任何内容之前发送HTTP头。如果开启了PHP错误提示,这里应该会报Headers already sent错误,但如果错误提示被关闭,可能会导致跳转失败,进而让你误以为是插入失败。
解决方法是把所有PHP逻辑(包括Session和数据库操作)放在HTML输出之前,或者使用输出缓冲(ob_start())。
快速排查技巧:打印具体错误信息
最直接的方式是在错误提示里加上数据库的具体错误,比如把else分支改成:
$_SESSION['post_message'] = "Something went wrong: " . mysqli_error($conn);
这样你就能看到到底是语法错误、约束违反还是连接问题,直接定位根源。
附上你提供的原始代码方便对照:
HTML部分
<div class="heading"><h2>Make a post<h2></div> <form action="post.php" method="POST"> <div class="head"><h3>Title</h3></div> <textarea name="title" rows="2" cols="45"></textarea> <div class="desc"><h3>Content</h3></div> <textarea name="description" rows="15" cols="45"></textarea><br> <input type="submit" value="Submit"> <p id="error_p"><?php echo (!empty($_SESSION['post_message']))? $_SESSION['post_message']:""; ?></p> </form>
PHP部分
if(!empty($_POST['title']) && !empty($_POST['description'])) { $title=$_POST['title']; $description=$_POST['description']; $user_id=$_COOKIE['user_id']; $query="INSERT INTO posts (title,description,user_id) VALUES('" . $title . "','" . $description . "','" . $user_id . "');"; $result=mysqli_query($conn,$query); if($result) { $_SESSION['post_message']="Posting succ"; header('Location: profile.php'); } else { $_SESSION['post_message']="something gone wrong"; header('Location: profile.php'); } }
内容的提问来源于stack exchange,提问作者Hikikomori

