PHP从SQL数据库多行显示指定数据及洗衣工单显示问题求助
问题1:如何在PHP中从SQL数据库显示多行指定数据
嘿,我来帮你搞定这个问题!要在PHP里从SQL数据库取出并显示多行指定数据,步骤其实很清晰,我给你拆解成两种常用的实现方式,你可以根据自己的习惯选:
方式一:用PDO(推荐,更安全且兼容多数据库)
PDO是PHP的数据对象扩展,自带参数绑定能有效避免SQL注入,是现在的最佳实践:
// 1. 建立数据库连接 $dsn = 'mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4'; $username = '数据库用户名'; $password = '数据库密码'; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("连接失败: " . $e->getMessage()); } // 2. 执行指定条件的查询(这里示例是获取状态为"待处理"的工单,你可以改WHERE条件) $stmt = $pdo->prepare("SELECT ticket_id, customer_name, service_type FROM TICKET WHERE status = ?"); $stmt->execute(['待处理']); // 3. 遍历结果并渲染成表格 echo "<table border='1'>"; echo "<tr><th>工单ID</th><th>客户姓名</th><th>服务类型</th></tr>"; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 用htmlspecialchars转义输出,防止XSS攻击 echo "<tr>"; echo "<td>" . htmlspecialchars($row['ticket_id']) . "</td>"; echo "<td>" . htmlspecialchars($row['customer_name']) . "</td>"; echo "<td>" . htmlspecialchars($row['service_type']) . "</td>"; echo "</tr>"; } echo "</table>";
方式二:用mysqli(面向过程风格,适合习惯原生写法的开发者)
如果你更熟悉mysqli的面向过程写法,也可以这么做:
// 1. 建立连接 $conn = mysqli_connect('localhost', '用户名', '密码', '数据库名'); if (!$conn) { die("连接失败: " . mysqli_connect_error()); } mysqli_set_charset($conn, 'utf8mb4'); // 2. 执行查询 $sql = "SELECT ticket_id, customer_name, service_type FROM TICKET WHERE status = '待处理'"; $result = mysqli_query($conn, $sql); // 3. 显示数据 if (mysqli_num_rows($result) > 0) { echo "<table border='1'>"; echo "<tr><th>工单ID</th><th>客户姓名</th><th>服务类型</th></tr>"; while ($row = mysqli_fetch_assoc($result)) { echo "<tr>"; echo "<td>" . htmlspecialchars($row['ticket_id']) . "</td>"; echo "<td>" . htmlspecialchars($row['customer_name']) . "</td>"; echo "<td>" . htmlspecialchars($row['service_type']) . "</td>"; echo "</tr>"; } echo "</table>"; } else { echo "没有找到匹配的数据"; } // 记得关闭连接 mysqli_close($conn);
问题2:同一用户添加多个工单后,ticket_id同时展示的问题
作为PHP新手遇到这个太正常啦!核心问题应该是你查询ticket_id的时候,没加精准的过滤条件,导致把该用户的所有工单ID都查出来了。我分两种常见场景给你解决办法:
场景1:添加工单后跳转到详情页,却显示所有工单ID
这种情况是你没把刚生成的工单ID传递到详情页,或者查询时没指定该ID。解决步骤:
- 提交工单成功后,获取刚插入的ticket_id:
// PDO写法 $stmt = $pdo->prepare("INSERT INTO TICKET (user_id, service_type, create_time) VALUES (?, ?, NOW())"); $stmt->execute([$_SESSION['user_id'], '普通洗衣']); $new_ticket_id = $pdo->lastInsertId(); // 获取最新生成的工单ID header("Location: ticket_detail.php?id=" . $new_ticket_id); exit; // mysqli写法 mysqli_query($conn, "INSERT INTO TICKET (user_id, service_type, create_time) VALUES ('{$_SESSION['user_id']}', '普通洗衣', NOW())"); $new_ticket_id = mysqli_insert_id($conn); header("Location: ticket_detail.php?id=" . $new_ticket_id); exit; - 在详情页
ticket_detail.php中,根据传递的ID查询唯一工单:// 先验证参数合法性 if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { die("非法请求"); } $ticket_id = intval($_GET['id']); // PDO查询(加user_id过滤防止越权) $stmt = $pdo->prepare("SELECT ticket_id, service_type, status FROM TICKET WHERE ticket_id = ? AND user_id = ?"); $stmt->execute([$ticket_id, $_SESSION['user_id']]); $ticket = $stmt->fetch(PDO::FETCH_ASSOC); if ($ticket) { echo "你的工单ID是:" . htmlspecialchars($ticket['ticket_id']); // 这里可以继续显示工单其他信息 } else { echo "找不到该工单,或者你没有权限查看"; }
场景2:订单列表页每个条目都显示所有ticket_id
这是循环遍历结果集时的逻辑错误,比如你把所有ID拼接在一起了。正确的做法是每个订单条目只显示对应ID:
// 查询当前用户的所有工单 $stmt = $pdo->prepare("SELECT ticket_id, service_type, create_time, status FROM TICKET WHERE user_id = ? ORDER BY create_time DESC"); $stmt->execute([$_SESSION['user_id']]); echo "<h3>你的所有工单</h3>"; echo "<ul>"; while ($ticket = $stmt->fetch(PDO::FETCH_ASSOC)) { echo "<li>"; echo "工单ID:" . htmlspecialchars($ticket['ticket_id']) . " | "; echo "服务类型:" . htmlspecialchars($ticket['service_type']) . " | "; echo "状态:" . htmlspecialchars($ticket['status']); echo "</li>"; } echo "</ul>";
快速排查技巧:
- 把你的SQL查询语句打印出来看看,比如
echo $sql;,确认有没有加正确的WHERE条件。 - 检查SESSION里的
user_id是否正确,确保你是用当前登录用户的ID过滤工单的。
内容的提问来源于stack exchange,提问作者Ahmad Afham
相关产品推荐
相关产品推荐

