PHP如何用if语句按优先级查询三个同结构表的指定ID数据
三表按优先级匹配ID查询实现方案
你原有代码用逗号拼接多表查询会生成笛卡尔积,既不符合逐表判断优先级的要求,还存在直接拼接用户传入参数导致的SQL注入风险。以下是通过if语句实现优先级判断的正确代码:
核心逻辑
- 优先查最高优先级的
table1,匹配到对应ID记录就直接提取数据,不再执行后续表查询 table1无匹配时再查table2,匹配到记录就取数终止流程- 前两张表都没有匹配记录时,最后查询
table3取数 - 增加参数校验、查询结果判断和三表无匹配的兜底逻辑,避免报错和安全漏洞
<?php include('config/database.php'); // 校验传入id参数,转为整型规避SQL注入,适用于id为数字类型的场景 $id = isset($_GET['single']) ? intval($_GET['single']) : 0; // 初始化存储结果的变量 $title = $date = $admin = $thumbnail = $description = $category = ''; $found = false; // 第一步:查询最高优先级的table1 $query = mysqli_query($conn, "SELECT * FROM `table1` WHERE `id` = {$id} LIMIT 1"); if ($query && mysqli_num_rows($query) == 1) { $row = mysqli_fetch_assoc($query); $title = $row['title']; $date = $row['date']; $admin = $row['admin']; $thumbnail = $row['thumbnail']; $description = $row['description']; $category = $row['category']; $found = true; } // 第二步:table1未查到则查询table2 if (!$found) { $query = mysqli_query($conn, "SELECT * FROM `table2` WHERE `id` = {$id} LIMIT 1"); if ($query && mysqli_num_rows($query) == 1) { $row = mysqli_fetch_assoc($query); $title = $row['title']; $date = $row['date']; $admin = $row['admin']; $thumbnail = $row['thumbnail']; $description = $row['description']; $category = $row['category']; $found = true; } } // 第三步:前两个表都未查到则查询table3 if (!$found) { $query = mysqli_query($conn, "SELECT * FROM `table3` WHERE `id` = {$id} LIMIT 1"); if ($query && mysqli_num_rows($query) == 1) { $row = mysqli_fetch_assoc($query); $title = $row['title']; $date = $row['date']; $admin = $row['admin']; $thumbnail = $row['thumbnail']; $description = $row['description']; $category = $row['category']; $found = true; } } // 三表均无匹配的兜底逻辑 if (!$found) { echo "未找到对应ID的记录"; } // 后续可直接使用$title、$date等提取到的变量 ?>
补充说明
- 代码中加
LIMIT 1是因为ID通常为表主键,单表内唯一,只查1条可以提升查询效率 - 如果你的id是字符串类型,把参数校验部分改成
$id = mysqli_real_escape_string($conn, $_GET['single']);做转义即可,禁止直接拼接未处理的用户输入到SQL语句中 - 整套逻辑完全通过if语句实现优先级判断,匹配到高优先级表的记录后不会再查询低优先级表,完全符合需求
内容的提问来源于stack exchange,提问作者Liton Kumar
相关产品推荐
相关产品推荐

