Utilisation de LIKE dans db_query dans D7


19

J'ai une requête comme celle-ci dans Drupal 6:

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

Et cela a bien fonctionné, mais maintenant je passe à Drupal 7.

J'ai lu et c'est censé fonctionner, mais ce n'est pas:

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

Est-ce que quelqu'un sait ce que je fais mal?

Réponses:


18

Essaye ça.

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

2
db_like ...? Pourquoi Drupal, pourquoi feriez-vous ça?
Coomie

Oui, Drupal a introduit une nouvelle db api dans 7, tels que db_select(), db_insert(), db_update(), db_condition(), db_like(), etc. Au lieu d'utiliser db_query(), il recommande d'utiliser db_select(). Voir ici drupal.org/developing/api/database , api.drupal.org/api/drupal/includes!database!database.inc/group/…
Sithu

6
@Coomie Si vous regardez db_like , vous verrez que l'échappement est effectué spécifiquement par la couche DB sur une base par moteur. Cela se fait pour des raisons de portabilité.
mpdonadio

Est-il exact que la première ligne se termine par une virgule?
underound

0

Si vous suivez le lien suivant, http://api.drupal.org/api/drupal/includes!database!database.inc/group/database/7 Cela vous dira que,

Notez que les espaces réservés doivent être une valeur "complète". Par exemple, lors de l'exécution d'une requête LIKE, le caractère générique SQL,%, doit faire partie de la valeur, pas la requête elle-même.

Donc

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

Est incorrect.

La requête doit être

SELECT nid, title FROM {node} WHERE title LIKE :title;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.