requête SQL avec clause in et variable de type '%s'

Catégories:

Bonjour,

J’ai créé une requête qui doit m’afficher les tailles disponibles pour mes articles dans ubercart.

Pour ceci, je récupère les identifiants de mes options d’attributs dans un chaîne de type

$mes_oid='23, 25, 22, 30';

après je faire une requête pour récupérer le nom des mes attributs classés par poids.
Le problème vient de la syntaxe utilisée, ça fonctionne mais ça me retourne un message d’erreur.

Voilà ma requête qui fonctionne mais me retourne une erreur car je passe la valeur %s sans les quotes.

$req3="SELECT distinct oid, name FROM {uc_attribute_options} WHERE oid in (%s) ORDER BY weight ASC";
$myresult3=db_query($req3, $mes_oid);
// exécute du code semblable à
// SELECT distinct oid, name FROM {uc_attribute_options} WHERE oid in (23, 25, 22, 30) ORDER BY weight ASC

Si je fais ceci, ça me retourne uniquement une valeur car les quotes sont bloquantes.

$req3="SELECT distinct oid, name FROM {uc_attribute_options} WHERE oid in ('%s') ORDER BY weight ASC";
$myresult3=db_query($req3, $mes_oid);
// exécute du code semblable à
// SELECT distinct oid, name FROM {uc_attribute_options} WHERE oid in ('23, 25, 22, 30') ORDER BY weight ASC

Comment puis-je faire pour occulter le message d’erreur ?

Merci d’avance

#

<?php
$oids
= array(23, 25, 22, 30);
db_query('SELECT DISTINCT oid, name FROM {uc_attribute_options} WHERE oid IN (' . db_placeholders($oids, 'int') . ') ORDER BY weight ASC', $oids);
?>

#

merci pour ton aide hélas ça ne fonctionne pas, ça me retourne le message d’erreur suivant :

warning : array_fill() [function.array-fill] : Number of elements must be positive in /homez.335/lavoila/www/includes/database.inc on line 253.

warning : implode() [function.implode] : Invalid arguments passed in /homez.335/lavoila/www/includes/database.inc on line 253.

user warning : 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 ‘) ORDER BY weight ASC’ at line 1 query : eval /* admin : eval */ SELECT DISTINCT oid, name FROM uc_attribute_options WHERE oid IN () ORDER BY weight ASC in /homez.335/lavoila/www/sites/all/modules/views_customfield/includes/views_customfield_handler_field_phpcode.inc(118) : eval()’d code on line 30.

warning : array_fill() [function.array-fill] : Number of elements must be positive in /homez.335/lavoila/www/includes/database.inc on line 253.

Dois-je patcher mon fichier comme indiqué sur http://drupal.org/node/167649

#

Il faut que $oids soit un tableau, sinon ca ne marchera pas :)

Au pire, si tu récupères vraiment une liste séparée par des virgules dans une chaine, tu peux faire :

<?php
$oids
= array_filter(array_map('trim', explode(',', $oids_as_a_string)));
?>

#

merci, c’est ce que j’étais en train de regarder sur http://api.drupal.org/api/function/db_placeholders/6

Même en convertissant en tableau j’ai toujours le message, je vérifie mon code il doit y avoir des erreurs.

#

Si je fais ceci

<?php
foreach($mes_oid as $loid){
   print
$loid." ";
}

//req pour recuperer nom des attributs obtenus avec tri par poids
$req3='SELECT DISTINCT oid, name FROM {uc_attribute_options} WHERE oid IN (' . db_placeholders($mes_oid, 'int') . ') ORDER BY weight ASC';
print
$req3;
$myresult3=db_query('SELECT DISTINCT oid, name FROM {uc_attribute_options} WHERE oid IN (' . db_placeholders($mes_oid, 'int') . ') ORDER BY weight ASC', $mes_oid);

//affichage des tailles
?>

ça me retourne cela
7 9 11 15 16 17 SELECT DISTINCT oid, name FROM {uc_attribute_options} WHERE oid IN (%d,%d,%d,%d,%d,%d) ORDER BY weight ASC36 | 40 | 44 | 46/48 | 50/52
54/56

donc j’ai bien ce que je veux mais j’ai toujours le message d’erreur

warning : array_fill() [function.array-fill] : Number of elements must be positive in /homez.335/lavoila/www/includes/database.inc on line 253.

warning : implode() [function.implode] : Invalid arguments passed in /homez.335/lavoila/www/includes/database.inc on line 253.

warning : array_fill() [function.array-fill] : Number of elements must be positive in /homez.335/lavoila/www/includes/database.inc on line 253.

warning : implode() [function.implode] : Invalid arguments passed in /homez.335/lavoila/www/includes/database.inc on line 253.

user warning : 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 ‘) ORDER BY weight ASC’ at line 1 query : eval /* admin : eval */ SELECT DISTINCT oid, name FROM uc_attribute_options WHERE oid IN () ORDER BY weight ASC in /homez.335/lavoila/www/sites/all/modules/views_customfield/includes/views_customfield_handler_field_phpcode.inc(118) : eval()’d code on line 36.

moi pas comprendre

EDIT ———————————-
Je place ce code dans views via custom field php est-ce que ça pourrais jouer ?

#

Le plus probable c’est que ce code est exécuté plusieurs fois (par exemple : à chaque ligne), et que à certaines occasions $mes_oid est vide.

Entoure le code d’un if (!empty($mes_oid)) { }, ca devrait résoudre le problème.

#

merci ça fonctionne.

Parfois je manque d’un brin de logique, c’est normal si on fait une requête vide…

Encore merci pour la fonction db_placeholders, l’API est tellement vaste qu’il est dur de tout connaître.

Syndiquer le contenu