PHP中实现条件查询结果表格展示的技术问题咨询
修复你的PHP条件查询与结果表格展示问题
嘿,我帮你梳理下这段代码里的几个关键问题,然后给出能正常运行且更安全的修复版本:
原代码里的坑点
- 过时的数据库函数:你用的
mysql_*系列函数早在PHP 5.5就被废弃了,PHP 7及以后直接移除了这些函数,必须换成mysqli或者PDO才能正常运行 - SQL语法错误:
- WHERE子句里的
'ORDER-NO'用了单引号,这会被SQL当成普通字符串,而不是字段名,得换成反引号` - 查询语句最后少了一个闭合的单引号,直接导致SQL执行失败
- WHERE子句里的
- 严重的安全隐患:直接把
$_POST['Onum']拼进SQL语句,恶意用户很容易通过构造输入篡改你的查询逻辑(也就是SQL注入) - 错误提示毫无意义:
die("ok")这种提示完全帮不了你排查问题,得显示实际的错误信息 - 不规范的写法:
$_POST{'Onum'}虽然语法上能跑,但大家一般都用$_POST['Onum'],更易读
修复后的完整代码(用mysqli面向对象写法,更易维护)
<?php // 先判断是否有POST过来的订单编号 if (isset($_POST['Onum'])) { $Onum = $_POST['Onum']; // 连接数据库,直接指定数据库名更简洁 $connect = new mysqli("localhost", "root", "", "dbmsproj"); // 检查连接是否成功 if ($connect->connect_error) { die("数据库连接失败: " . $connect->connect_error); } // 用预处理语句防SQL注入,这是现在的标准做法 $query = "SELECT `ITEM-NO` FROM `made-of` WHERE `ORDER-NO` = ?"; $stmt = $connect->prepare($query); // 绑定参数,"s"表示字符串类型,如果你的ORDER-NO是整数就换成"i" $stmt->bind_param("s", $Onum); $stmt->execute(); $results = $stmt->get_result(); // 输出表格,加个border让结构更清晰,再加个表头 echo "<table border='1'>"; echo "<tr><th>ITEM-NO</th></tr>"; while ($row = $results->fetch_assoc()) { // 用htmlspecialchars转义输出,防止XSS攻击 echo "<tr><td>" . htmlspecialchars($row['ITEM-NO']) . "</td></tr>"; } echo "</table>"; // 记得关闭资源,养成好习惯 $stmt->close(); $connect->close(); } else { echo "请提交有效的订单编号哦"; } ?>
额外提醒
- 因为你的字段名带连字符(比如
ITEM-NO),所以必须用反引号包裹,不然SQL会把连字符当成减号解析,直接报错 - 预处理语句一定要用,别再直接拼字符串了,安全第一
- 输出数据库内容时用
htmlspecialchars,能避免恶意脚本注入到页面里
如果运行后还是有问题,可以检查这几点:
- 数据库的用户名、密码、数据库名是不是和你的实际环境匹配
made-of表确实存在,ORDER-NO和ITEM-NO的拼写有没有错- 提交数据的表单是不是用的POST方法,表单输入框的
name属性是不是Onum
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

