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 ASCSi 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 ASCComment puis-je faire pour occulter le message d’erreur ?
Merci d’avance
- Vous devez vous identifier ou créer un compte pour écrire des commentaires

<?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);
?>
Damien Tournoud
808
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
selinav
1242
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)));
?>
Damien Tournoud
808
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.
selinav
1242
Si je fais ceci
<?phpforeach($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 ?
selinav
1242
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.Damien Tournoud
808
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.
selinav
1242