我使用PDO
LIKE
使用通配符'%'
来匹配部分结果:
$value = $_GET["searchValue"];
$dbh = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$query = $dbh->prepare('SELECT * FROM table WHERE column1 LIKE ? OR column2 LIKE ?');
$query->execute(array("%$value1%","%$value2%"));
我的问题是,当用户输入'%'
或'%%%%%'
时,它会返回database
上的所有值,即使没有保存{{1}的任何内容符号con %
。
提前致谢。
答案 0 :(得分:1)
我有以下PDO使用通配符'%'匹配部分结果
当用户输入'%'它返回数据库中的所有值,即使没有任何与%符号con保存该行的内容。
上面这两段,相当矛盾?
当你自己使用%时,你希望它匹配任何角色,但是然后用户正在使用它,你希望它只匹配%literaly。唉,mysql还不能读懂思想,也不能告诉别人一个%。
坦率地说,根本没有问题。返回LIKE '%%%'
语句的所有行是为%wildcard is
设计的。如果你想让用户按字面意思搜索%字符,你必须用反斜杠转义它。
答案 1 :(得分:1)
让我们只考虑$value1
变量。
当用户插入%时,PDO会进行查询
SELECT * FROM table WHERE column1 LIKE '%%%'
这是正确的行为。
但是,如果你想用这种模式搜索(这就是你想要的)字符串
[anything]%[anithing]
您必须转义用户输入,使查询看起来像
SELECT * FROM table WHERE column1 LIKE '%\%%'
为此,您必须将%
替换为\%
。
基本上,你唯一要做的就是改变这一行
$value = $_GET["searchValue"];
以这种方式
$value = str_replace('%', '\%', $_GET["searchValue"]);
我希望它有所帮助。