php 如何使用PDO扩展绑定LIKE值?

bfrts1fy  于 2022-12-10  发布在  PHP
关注(0)|答案(7)|浏览(184)

在此查询中

select wrd from tablename WHERE wrd LIKE '$partial%'

我正在尝试将变量'$partial%'与PDO绑定。不确定最后的%如何工作。
会不会

select wrd from tablename WHERE wrd LIKE ':partial%'

其中:partial绑定到$partial="somet"
还是

select wrd from tablename WHERE wrd LIKE ':partial'

其中:partial绑定到$partial="somet%"
还是完全不同的东西

cwdobuhd

cwdobuhd1#

你也可以说:

SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')

在MySQL端进行字符串连接,在本例中并没有什么特别的原因。
如果您要查找的部分wrd本身可能包含百分号或下划线字符(因为这些字符对LIKE操作符有特殊含义)或反斜杠(MySQL将其用作LIKE操作符中的另一层转义-根据ANSI SQL标准,这是不正确的),那么事情就变得有点棘手了。
希望这不会影响您,但如果您确实需要正确处理该案例,下面是一个混乱的解决方案:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'");
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var);
$stmt->bindParam(':term', $escaped);
r8xiu3jd

r8xiu3jd2#

$var = "partial%";
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->bindParam(":partial", $var);
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
                  // first calling bindParam()
$rs = $stmt->fetchAll();

使用问号参数:

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs = $stmt->fetchAll();

http://www.php.net/manual/en/pdo.prepare.php

mzaanser

mzaanser3#

你可以在预准备语句之前使用addcslashes。我在mysql上测试过。

$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);
1cklez4t

1cklez4t4#

我认为公认的答案(由@bobince)可以简化一点。
您可以将其简化为如下形式,以处理参数中的下划线、百分比等,但仍然匹配带有部分%的LIKE查询:

$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
$rows = $stmt->fetchAll();
6yt4nkrj

6yt4nkrj5#

下面的代码只显示了数据库中的第一个关键字!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"

如果您想从数据库中搜索所有关键字,请尝试此方法

"SELECT wrd FROM tablename WHERE wrd LIKE :partial";
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));
6tqwzwtp

6tqwzwtp6#

你应该这样做

bindValue(':partial', '%' . $_GET['partial'] . '%');

谢谢你,
标准键盘

whhtz7ly

whhtz7ly7#

谁写了答案(可能是karim79):

$var ="partial%"
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial")
$stmt->bindParam(":partial",$var)
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
                  // first calling bindParam()
$rs =$stmt->fetchAll();

使用问号参数:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs =$stmt->fetchAll();

非常感谢他。我在搜索代码&看到了很多例子,但我不能解决我的问题。这次我成功地做到了。我使用了代码的“使用问号参数:”部分。
为了获得其他帮助,如果要从变量中检索值,可以将代码更改为

$stmt->execute(array($variable.'%'));

代替

$stmt->execute(array('partial%'));

因为“部分”这个词已经在答案里写明了,不能更改。谢谢。

相关问题