为什么我的PDO查询使用LIKE&限制不工作?

时间:2012-09-04 01:56:50

标签: php mysql

我正在制作一个包含此查询的搜索框功能:

$query="SELECT * FROM article WHERE title LIKE ? OR description LIKE ?";

然后在foreach循环中,我创建了这个数组:

$params[]= "%".$keyword."%";
$params[]= "%".$keyword."%";

然后我执行:

$stmt=$cxn->prepare($query);
$stmt->execute($params);

这个工作,但是......

如果在foreach循环之后,我想添加“LIMIT?,?”,我这样做:

$query.=" LIMIT ?, ?";
$params[]=$row_number;
$params[]=$items_per_page;

然后我执行脚本,它会抛出这个致命错误:

PHP Fatal error:  Uncaught exception 'PDOException' with message 
'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; 
 check the manual that corresponds to your MySQL server version for the right syntax
 to use near ''0', '2'' at line 1' in ..../index.php:247
  Stack trace:
  #0 .../index.php(247): PDOStatement->execute(Array)
 #1 {main}
 thrown in ..../index.php on line 247

我尝试在关键字周围添加撇号:$params= "'%".$keyword."%'"; 但这没效果。

另外,我在PHPMyAdmin中尝试了完全相同的查询,但它确实有效。

有谁知道为什么会出错?

提前多多感谢。

3 个答案:

答案 0 :(得分:3)

更新

$query="SELECT * FROM article WHERE title LIKE ? OR description LIKE ?";
$query.=" LIMIT ?, ?";
$stmt=$cxn->prepare($query);
$stmt->bindValue(1, "%".$keyword."%");
$stmt->bindValue(2, "%".$keyword."%");
$stmt->bindValue(3, $row_number, PDO::PARAM_INT);
$stmt->bindValue(4, $items_per_page, PDO::PARAM_INT);

$stmt->execute();

答案 1 :(得分:1)

LIKE不起作用的原因是因为当你使用LIKE绑定参数时,它将'%value%'视为一个字符串。

你将不得不使用:

$query="SELECT * FROM article WHERE title LIKE CONCAT('%',?,'%') OR description LIKE CONCAT('%',?,'%')";

答案 2 :(得分:0)

我认为你需要转换你在limit子句中传递的变量。请参阅此...to use near ''0', '2'' LIMIT子句

中的值有单引号

尝试

$query.=" LIMIT ?, ?";
$params[] = intval($row_number);
$params[] = intval($items_per_page);