PHP中PDO绑定:sqlSearch占位符未替换值的问题求助
SQL LIKE查询占位符绑定失效问题解答
问题描述
执行SQL查询时,占位符:sqlSearch未按预期替换为包含通配符的搜索值,代码片段如下:
$db = phpmotorsConnect(); $sqlSearch = "'%" . $searchTxt . "%'"; $sql = "SELECT * FROM inventory WHERE invColor LIKE :sqlSearch OR invMake LIKE :sqlSearch OR invModel LIKE :sqlSearch OR invDescription LIKE :sqlSearch OR invPrice LIKE :sqlSearch"; $stmt = $db->prepare($sql); // 标注行:占位符未正确替换 $stmt->bindValue(':sqlSearch', $sqlSearch, PDO::PARAM_STR); $stmt->execute();
问题原因
你手动给$sqlSearch添加了单引号,而PDO在绑定字符串类型参数时,会自动为参数包裹单引号。 这导致最终SQL中的条件变成了LIKE '''%搜索内容%'''(单引号被转义),相当于在搜索包含'%搜索内容%'(带单引号)的字符串,而非预期的包含搜索内容的字符串,所以看起来占位符没生效。
修复方案
有两种正确的写法:
方案1:通配符放在绑定值中(不加单引号)
$db = phpmotorsConnect(); // 只保留通配符,去掉手动添加的单引号 $sqlSearch = "%" . $searchTxt . "%"; $sql = "SELECT * FROM inventory WHERE invColor LIKE :sqlSearch OR invMake LIKE :sqlSearch OR invModel LIKE :sqlSearch OR invDescription LIKE :sqlSearch OR invPrice LIKE :sqlSearch"; $stmt = $db->prepare($sql); $stmt->bindValue(':sqlSearch', $sqlSearch, PDO::PARAM_STR); $stmt->execute();
方案2:通配符写在SQL语句中,绑定纯搜索文本
$db = phpmotorsConnect(); $sql = "SELECT * FROM inventory WHERE invColor LIKE CONCAT('%', :sqlSearch, '%') OR invMake LIKE CONCAT('%', :sqlSearch, '%') OR invModel LIKE CONCAT('%', :sqlSearch, '%') OR invDescription LIKE CONCAT('%', :sqlSearch, '%') OR invPrice LIKE CONCAT('%', :sqlSearch, '%')"; $stmt = $db->prepare($sql); // 直接绑定原始搜索文本,无需添加任何符号 $stmt->bindValue(':sqlSearch', $searchTxt, PDO::PARAM_STR); $stmt->execute();
内容的提问来源于stack exchange,提问作者Eron Whitefield
相关产品推荐
相关产品推荐

