SQL报错:where子句存在未知列'General',论坛专题页SQL查询求助
问题分析与解决办法
你遇到的问题很典型——字符串类型的查询值没有用单引号包裹,导致MySQL把General当成了列名,而不是topic_name字段的匹配值。
直接修复当前代码
你需要给mysqli_real_escape_string处理后的字符串加上单引号,这样MySQL才会把它识别为字符串值:
$sql = "SELECT * FROM topics WHERE topic_name= '" . mysqli_real_escape_string($link,$_GET['id']) . "'"; echo $sql; $result = mysqli_query($link, $sql); echo mysqli_error($link);
这样生成的SQL会变成SELECT * FROM topics WHERE topic_name= 'General',MySQL就能正确识别General是要匹配的字符串了。
更安全的方案:使用预处理语句
虽然mysqli_real_escape_string能一定程度防止SQL注入,但预处理语句(参数化查询)是更可靠的做法,能彻底避免这类问题,同时代码也更清晰:
// 准备预处理语句 $stmt = mysqli_prepare($link, "SELECT * FROM topics WHERE topic_name = ?"); // 绑定参数(s表示字符串类型) mysqli_stmt_bind_param($stmt, "s", $_GET['id']); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果 $result = mysqli_stmt_get_result($stmt); // 处理结果 while ($row = mysqli_fetch_assoc($result)) { // 输出或处理数据 }
预处理语句会自动处理字符串的引号和转义,不用手动拼接,安全性和可读性都更好。
内容的提问来源于stack exchange,提问作者Talha Ahmed
相关产品推荐
相关产品推荐

