19

在这个查询中

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%"

还是会完全不同?

4

7 回答 7

37

你也可以说:

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);
于 2010-04-27T15:12:39.550 回答
17
$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

于 2010-04-27T15:00:25.260 回答
0

您可以在准备好的语句之前使用 addcslashes。我在mysql上测试过。

$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);
于 2017-03-06T12:37:14.540 回答
0

我认为接受的答案(@bobince)可以简化一点。

您可以将其缩减为类似这样以处理参数中的下划线、百分比等,但仍将 LIKE 查询与部分百分比匹配:

$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
$rows = $stmt->fetchAll();
于 2019-01-23T18:46:57.627 回答
-1

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

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

如果你想从数据库中搜索所有关键字,试试这个

"SELECT wrd FROM tablename WHERE wrd LIKE :partial";
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));
于 2016-02-13T12:57:22.047 回答
-2

你应该这样做

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

谢谢,

Qwerty

于 2015-08-20T09:29:47.997 回答
-4

谁编写了答案(可能是 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%'));

因为答案中指定了“部分”一词并且无法更改。非常感谢。

于 2014-04-03T06:39:08.260 回答