PHP表单SQL WHERE过滤失效求助(phpMyAdmin环境,新手)
问题排查与解决方案
嘿,我来帮你找出过滤功能失效的问题,顺便给你修正后的代码和新手必知的注意事项~
你的代码里的几个关键问题
1. 废弃的MySQL扩展
你用的mysql_connect()、mysql_select_db()这类函数早就被PHP官方废弃了,PHP 7及以上版本甚至直接移除了这些函数,不管功能逻辑对不对,首先这个扩展就不能用了,得换成mysqli(和原代码风格接近的面向过程写法)或者PDO。
2. SQL字段名的语法错误
你的字段名是Food-type2,里面的连字符-会被MySQL当成减号运算符,比如Food-type2会被解析成Food - type2,完全偏离了你要查询字段的本意。这种带特殊字符的字段名必须用反引号`包裹,写成`Food-type2`。
3. 字符串值未加单引号
$t是用户提交的字符串类型值(比如dessert),你直接拼到SQL里会变成where Food-type2 = dessert,MySQL会把dessert当成列名而非字符串值,自然查不到数据。
4. 严重的SQL注入风险
直接把用户输入的$_GET['Foodlist']拼到SQL语句里,恶意用户可以构造特殊输入篡改SQL逻辑,甚至删除你的数据库,必须用参数化查询规避这个风险。
修正后的完整showtype.php代码
我保留了和你原代码接近的风格,同时加入了注释说明每个修改点:
<!DOCTYPE HTML> <HTML> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="mycss.css"> </head> <BODY> <?php // 替换为mysqli扩展(面向过程风格,和原代码逻辑接近) $db_host="localhost"; $db_user="root"; $db_pass=""; $db_name="resturant"; $db_table="resturant"; // 连接数据库,同时指定要使用的库,简化步骤 $con = mysqli_connect($db_host, $db_user, $db_pass, $db_name); // 检查连接是否成功,方便调试 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); } // 初始化SQL语句,字段名用反引号包裹避免语法错误 $SQL = "SELECT * FROM `$db_table`"; // 用??运算符处理变量不存在的情况(PHP7+支持,避免未定义变量警告) $t = $_GET['Foodlist'] ?? ''; if ($t !== '') { // 使用参数化查询,彻底避免SQL注入,同时处理字符串值问题 $SQL .= " WHERE `Food-type2` = ?"; // 准备带占位符的SQL语句 $stmt = mysqli_prepare($con, $SQL); // 绑定参数,"s"表示参数是字符串类型 mysqli_stmt_bind_param($stmt, "s", $t); // 执行语句 mysqli_stmt_execute($stmt); // 获取查询结果集 $dbresult = mysqli_stmt_get_result($stmt); } else { // 如果选择的是All,直接执行普通查询 $dbresult = mysqli_query($con, $SQL); } // 检查查询是否成功,方便调试 if (!$dbresult) { die("查询失败: " . mysqli_error($con)); } // 遍历结果集输出 while($amch = mysqli_fetch_assoc($dbresult)) { ?> <div class="content"> <!-- 用htmlspecialchars转义输出内容,避免XSS攻击 --> <h3><?php echo htmlspecialchars($amch['Food-type2']); ?></h3> </div> <?php } // 养成关闭连接和语句的好习惯 if (isset($stmt)) { mysqli_stmt_close($stmt); } mysqli_close($con); ?> </BODY> </HTML>
新手额外注意事项
- 永远不要信任用户输入:不管是GET还是POST数据,都要做安全处理,参数化查询是防止SQL注入的最优解。
- 输出数据用htmlspecialchars:避免字段内容里的HTML特殊字符(比如
<、>)被浏览器解析成HTML标签,引发XSS攻击。 - 数据库命名规范:尽量用下划线代替特殊字符,比如把
Food-type2改成food_type2,这样就不用加反引号,更符合MySQL的命名习惯。 - 错误提示:代码里的错误提示是为了方便调试,生产环境可以换成友好的提示页面,不要暴露具体错误信息。
这样修改后,你的过滤功能就能正常工作,同时代码也更安全规范啦~
内容的提问来源于stack exchange,提问作者zahra khalafi
相关产品推荐
相关产品推荐

