pdo绑定like模糊查询时,通配符%必须放在参数值里,而不是sql语句中。使用占位符(如?或:name)绑定参数,并将%拼接在变量前后,例如"%{$keyword}%",这样能安全执行模糊匹配且防止sql注入。

为什么不能把%直接写在SQL字符串里?
如果将%直接写在SQL字符串中,会导致无法动态改变搜索条件,且若用户输入包含特殊字符可能引发语法错误或注入风险。正确做法是将整个模式作为参数传递。

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$keyword = 'admin';
$sql = "SELECT * FROM users WHERE username LIKE ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(['%' . $keyword . '%']);
$results = $stmt->fetchAll();
print_r($results);
命名占位符与位置占位符哪种更好?
命名占位符(如:name)可读性更强,适合复杂查询;位置占位符(?)更简洁,适合简单场景。两者在安全性上无差异,均能有效防止SQL注入。

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$keyword = 'admin';
$sql = "SELECT * FROM users WHERE username LIKE :keyword";
$stmt = $pdo->prepare($sql);
$stmt->execute(['keyword' => '%' . $keyword . '%']);
$results = $stmt->fetchAll();
print_r($results);
如果搜索词本身包含%怎么办?
若搜索词包含%或_等通配符,需先转义这些字符。可使用PDO::quote()或手动替换%,例如用\%替代%,确保精确匹配。











