通过Serial获取同表同SKU关联数据的PDO查询问题
解决同SKU产品查询的问题
我来帮你搞定这个需求!你想要的是当用户通过localhost?id=12345678传入某个serial时,显示和该serial对应产品同SKU的所有条目,对吧?先说说你现有代码的几个问题,再给出正确的实现方案。
现有代码的问题
- SQL拼接错误+注入风险:你写的
"SELECT * FROM tbl_product WHERE serial='.$id.'"在双引号字符串里用了.拼接,语法上就不对,而且直接把用户输入拼进SQL是严重的安全漏洞,容易被SQL注入攻击。 - 逻辑不符合需求:原代码只会查询传入的serial对应的单个产品,而不是同SKU的所有产品。
- 字段不匹配:你的表结构里产品名称是
product_name,但代码里用了$row->pname,这会导致报错,得对应上实际字段名。
正确实现方案
这里提供两种方法,都采用PDO参数绑定来避免注入风险,同时满足你的需求:
方法1:分步查询(先获取SKU,再查同SKU产品)
这种方式逻辑清晰,适合需要单独处理SKU的场景:
// 处理GET参数,容错处理防止未传id的情况 $targetSerial = $_GET['id'] ?? ''; // 第一步:根据传入的serial获取对应的SKU $getSkuStmt = $pdo->prepare("SELECT sku FROM tbl_product WHERE serial = :serial"); $getSkuStmt->bindParam(':serial', $targetSerial, PDO::PARAM_STR); $getSkuStmt->execute(); $skuResult = $getSkuStmt->fetch(PDO::FETCH_OBJ); if ($skuResult) { $targetSku = $skuResult->sku; // 第二步:查询所有该SKU下的产品 $productsStmt = $pdo->prepare("SELECT * FROM tbl_product WHERE sku = :sku"); $productsStmt->bindParam(':sku', $targetSku, PDO::PARAM_STR); $productsStmt->execute(); // 输出表格(建议补全table标签,原代码只有tr) echo '<table border="1">'; while ($row = $productsStmt->fetch(PDO::FETCH_OBJ)) { echo '<tr> <td>' . htmlspecialchars($row->product_name) . '</td> <td>' . htmlspecialchars($row->sku) . '</td> <td>' . htmlspecialchars($row->serial) . '</td> </tr>'; } echo '</table>'; } else { echo '未找到对应serial的产品'; }
方法2:子查询一步完成(更简洁)
用子查询直接关联,一步获取所有同SKU的产品:
$targetSerial = $_GET['id'] ?? ''; // 子查询:先找到传入serial对应的SKU,再查该SKU下的所有产品 $productsStmt = $pdo->prepare(" SELECT * FROM tbl_product WHERE sku = (SELECT sku FROM tbl_product WHERE serial = :serial) "); $productsStmt->bindParam(':serial', $targetSerial, PDO::PARAM_STR); $productsStmt->execute(); // 输出结果 echo '<table border="1">'; if ($productsStmt->rowCount() > 0) { while ($row = $productsStmt->fetch(PDO::FETCH_OBJ)) { echo '<tr> <td>' . htmlspecialchars($row->product_name) . '</td> <td>' . htmlspecialchars($row->sku) . '</td> <td>' . htmlspecialchars($row->serial) . '</td> </tr>'; } } else { echo '<tr><td colspan="3">未找到相关产品</td></tr>'; } echo '</table>';
额外注意点
- 安全处理:我在输出字段时用了
htmlspecialchars(),防止XSS攻击,这是前端输出的好习惯。 - 参数绑定:全程使用PDO的参数绑定,绝对不要直接拼接用户输入到SQL里,这是防范SQL注入的核心手段。
- 容错处理:用
$_GET['id'] ?? ''处理未传参数的情况,避免出现Undefined index错误。
内容的提问来源于stack exchange,提问作者mnamz
相关产品推荐
相关产品推荐

