0

私はこのクエリを持つ検索ボックス機能を作成しています:

$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内でまったく同じクエリを試しましたが、機能しました。

なぜこれがエラーをスローしているのか誰かが知っていますか?

よろしくお願いします。

4

3 に答える 3

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();
于 2012-09-04T02:00:42.870 に答える
1

LIKEが機能しない理由は、LIKEでバインドパラメータを使用すると、「%value%」が文字列として扱われるためです。

次のものを使用する必要があります。

$query="SELECT * FROM article WHERE title LIKE CONCAT('%',?,'%') OR description LIKE CONCAT('%',?,'%')";
于 2012-09-04T02:04:13.323 に答える
0

limit句で渡した変数を変換する必要があると思います。これを参照してください。句...to use near ''0', '2''の値には一重引用符がありますLIMIT

試す

$query.=" LIMIT ?, ?";
$params[] = intval($row_number);
$params[] = intval($items_per_page);
于 2012-09-04T02:08:21.537 に答える