2012-09-04 102 views
0

我想提出一个搜索框的功能,有此查询:为什么我的PDO查询使用LIKE&LIMIT不起作用?

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

然后在foreach循环中,我有这样的数组:

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

然后我执行:

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

这工作,但...

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

$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内完全相同的查询,它的工作。

有没有人知道为什么这是抛出一个错误?

非常感谢。

+0

什么是'$ keyword'的价值? – Kermit

+1

可能重复[PHP的PDO bindValue在极限](http://stackoverflow.com/questions/2269840/php-pdo-bindvalue-in-limit) – jeroen

+0

嗨,值是一个字符串,只是字母。 – alexx0186

回答

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(); 
+0

先生的问题,你可以混合数组中的'PHP'数据类型? :) –

+2

@JohnWoo是的,你可以。 – xdazz

+1

@JohnWoo PHP就像那样美好。 – Kermit

1

的原因等没有工作,是因为当你使用绑定参数与喜欢它的治疗“%值%”作为一个字符串。

你将不得不使用:

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

嗨,感谢您的回复。我的文章中的第一个SQL查询确实有效。当我添加“LIMIT?,?”时,麻烦开始了在查询结束时。 Regards – alexx0186

0

我想你需要你有你的极限子句中传递的变量转化。看到这个...to use near ''0', '2''上有值单引号LIMIT条款

在尝试

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

嗨,谢谢你的回应。我尝试过,但无法使其工作。我想弄清楚如何将BindValues和'?'混合在一起。问候 – alexx0186

+0

@ alexx0186你为什么不这样做?每个值一个参数(*我的意思是不使用数组*)'$ stmt-> bindParam(':name',$ name); $ stmt-> bindParam(':value',$ value);' –

+0

嗨,我不确定我能这样做的原因是因为我不知道用户要输入多少个关键字。所以在我的foreach循环中,我只是根据需要添加尽可能多的'?'(而不是绑定值)。不知道我可以用BindParam做这个..? – alexx0186