PHP+HTML页面实现MySQL单字段通配符搜索报错排查求助
问题排查与修复方案
错误原因分析
- SQL语法错误:生成的SQL语句存在两处多余逗号:
DATE_FORMAT(Record started Date, '%d-%m-%Y') ASRecord started Date, FROM中,别名后多了一个逗号FROM Sheep, WHERE中,表名后多了一个逗号
- PDO参数绑定不匹配:代码直接将用户输入拼入SQL字符串,却尝试绑定
:sheep参数,但SQL中无该占位符,导致参数数量与标记数不匹配,触发SQLSTATE[HY093]错误。 - SQL注入风险:直接拼接用户输入到SQL中,存在严重安全隐患。
修复后的完整PHP代码
<?php // 开启错误调试,便于排查问题 error_reporting(-1); ini_set('display_errors', 'On'); if (isset($_POST['submit'])) { try { require "./config.php"; require "./common.php"; $connection = new PDO($dsn, $username, $password, $options); $sheep = $_POST['sheep']; // 使用PDO占位符,避免SQL注入,同时修正SQL语法错误 $sql = "SELECT *, DATE_FORMAT(DOB, '%d-%m-%Y') AS DOB, DATE_FORMAT(`Record started Date`, '%d-%m-%Y') AS `Record started Date` FROM Sheep WHERE `Notes` LIKE :sheep"; $statement = $connection->prepare($sql); // 将通配符与用户输入拼接后绑定,实现模糊搜索 $searchTerm = "%{$sheep}%"; $statement->bindParam(':sheep', $searchTerm, PDO::PARAM_STR); $statement->execute(); $result = $statement->fetchAll(); } catch(PDOException $error) { echo $sql . "<br>" . $error->getMessage(); } } ?>
核心修复说明
- 修正SQL语法:移除两处多余逗号,确保SQL语句结构合法。
- 规范PDO参数绑定:用
:sheep占位符替代直接变量拼接,将模糊搜索的通配符%与用户输入拼接后再绑定,既解决参数不匹配问题,又彻底规避SQL注入风险。 - 启用错误调试:解除错误报告注释,方便后续定位其他潜在问题。
内容的提问来源于stack exchange,提问作者Zippyduda
相关产品推荐
相关产品推荐

