在 sql 中写 like :term,再绑定包含百分号的完整模式,例如 %草莓%。如果用户输入中的百分号和下划线要按原字符搜索,还要按 sql 的 escape 规则转义。
准备能区分通配符和字面值的测试数据
在独立 MySQL 测试库执行下面的建表和插入语句。使用三个相近名称,便于检查转义是否有效。
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL
) CHARACTER SET utf8mb4;
INSERT INTO products (name)
VALUES ('草莓_冰沙'), ('草莓芝冰沙'), ('草莓=冰沙');
PHP 环境需启用 pdo_mysql。把测试库连接信息放到当前进程的 DB_DSN、DB_USER、DB_PASS 环境变量中,DSN 里指定 charset=utf8mb4。
在 PHP 中绑定整个 LIKE 模式
保存为 search-products.php。将等号选为转义符,同时转义输入中已有的等号、百分号和下划线。
立即学习“PHP免费学习笔记(深入)”;
<?php
$pdo = new PDO(
getenv('DB_DSN'),
getenv('DB_USER'),
getenv('DB_PASS'),
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false]
);
$keyword = trim($argv[1] ?? '');
if ($keyword === '') {
exit("Please provide a keyword\n");
}
$literal = strtr($keyword, ['=' => '==', '%' => '=%', '_' => '=_']);
$sql = "SELECT id, name FROM products
WHERE name LIKE :term ESCAPE '='
ORDER BY id LIMIT 20";
$stmt = $pdo->prepare($sql);
$stmt->execute(['term' => '%' . $literal . '%']);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $product) {
echo $product['name'], PHP_EOL;
}
预处理负责分离 SQL 和参数。LIKE 的转义负责决定用户输入里的符号是否参与通配匹配。
用下划线和等号核对查询结果
分别输入带下划线、等号和没有特殊字符的关键词。
php search-products.php '草莓_' php search-products.php '草莓=' php search-products.php '草莓'
第一条只匹配草莓_冰沙,第二条只匹配草莓=冰沙,第三条匹配三条记录。



















