D7のdb_queryでLIKEを使用する


19

Drupal 6には次のようなクエリがあります。

$sql = 'SELECT sid, score FROM search_index WHERE word LIKE "%%%s%%"';
$result = db_query($sql,$search_term);

そして、うまくいきましたが、今はDr​​upal 7にアップグレードしています。

私が読んで、これはうまくいくはずですが、そうではありません:

$sql = 'SELECT sid, score FROM search_index WHERE word LIKE "%:term"';
$result = db_query($sql,array(':term'=>$search_term));

誰かが私が間違っていることを知っていますか?

回答:


18

これを試して。

 $sql = 'SELECT sid, score FROM {search_index} WHERE word LIKE :term';
 $result = db_query($sql, array(':term' => '%' . db_like($search_term)));

2
db_like ...?なぜDrupal、なぜそうするのですか?
クーミー

はい、Drupalのは、次のような、7で新しいDB APIを導入しdb_select()db_insert()db_update()db_condition()db_like()、などの代わりに使用してdb_query()、それが使用することを推奨していますdb_select()。ここを参照してくださいdrupal.org/developing/api/database、api.drupal.org / api / drupal
includes!database!database.inc/group/…– Sithu

6
@Coomieあなたが見ればdb_like、あなたはエスケープ処理がエンジン単位でDB層で、具体的に行われていることがわかります。これは、移植性の理由で行われます。
mpdonadio

最初の行がコンマで終わっているのは正しいですか?
アンダーサウンド

0

次のリンクをフォローアップすると、http: //api.drupal.org/api/drupal/includes!database!database.inc/group/database/7 これにより、

プレースホルダーは「完全な」値である必要があることに注意してください。たとえば、LIKEクエリを実行するときは、クエリ自体ではなく、SQLワイルドカード文字%を値の一部にする必要があります。

そう

SELECT nid, title FROM {node} WHERE title LIKE :title%;

間違っています。

クエリは

SELECT nid, title FROM {node} WHERE title LIKE :title;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.