PDO() Tableau de Déclaration ET d'un espace réservé
J'ai trouvé ce code sur DONC, ce qui est excellent pour l'utilisation de PDO et l'EN() instruction.
$values = explode(',', $values) ; # 1,4,7
$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ;
$query = "SELECT * FROM table WHERE id IN ($placeholders)";
$stm = $db->prepare($query) ;
$stm->execute($values) ;
Cependant, comment puis-je mélanger dans un autre ajout à la requête de sorte que la requête ressemble à ceci:
$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm = $db->prepare($query) ;
$stm->execute(array($values,$product)) ; //error happens when adding product placeholder
J'ai pensé que cela pourrait fonctionner, mais je reçois:
Avertissement: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables ne correspond pas à un nombre de jetons dans la ligne 3 ($stm ligne)
Aucune idée de la façon d'obtenir ce à se comporter comme prévu?
Mis à JOUR exécuter à la matrice, ne fonctionne toujours pas..
Cette
rtrim(str_repeat('?, ', count($values)), ', ') ;
est agréable. merci 🙂OriginalL'auteur Maverick | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Solution
Cela devrait fonctionner, si
$values
est un tableau:Explication
execute()
attend un paramètre dans ce cas d'une matrice - être fourni. En ajoutantarray_merge($values, array($product))
vous créez un tableau avec$product
ajouté à la fin, de sorte que la requête devrait fonctionner correctement.Voir la démo ici: http://ideone.com/RcClX
OriginalL'auteur
Le problème ici est que
execute
besoin d'un unique tableau. Vous ne pouvez pas passer plusieurs tableaux, et pire encore, vous ne pouvez pas imbriquer des tableaux.Nous avons déjà une très bonne
$values
tableau, donc, nous allons réutiliser après vous créez la chaîne d'espace réservé.Je l'ai fait (fusion de tableaux dans
execute()
appel), parce que vous pouvez toujours utiliser$values
dans votre code plus tard. Et si vous le faites après l'ajout de la$product
, alors vous aurez juste besoin de traiter avec un seul élément supplémentaire, vous ne voulez pas que là 🙂 Mais la décision est la vôtre - rappelez-vous juste de ne pas rendre le code plus compliqué 🙂 Si vous voulez faire quelque chose comme$values[] = ($product,$type)
dans une ligne, il suffit de faire ceci:$values = array_merge($values, array($product,$type))
.Les deux Tadeck & Charles réponses sont excellentes. Je souhaite que je peut accepter à la fois sur les.
Ou utiliser array_splice.
À l'aide de
array_splice()
signifie que vous serez d'abord ajouter certains éléments à supprimer plus tard, de retour$values
à sa valeur d'origine. Pas très efficace, et plus important encore, peut diminuer (et sera probablement diminuer) la facilité de maintenance. Maisarray_slice()
est quelque chose qu'on peut prendre en considération.OriginalL'auteur
Et une autre solution peut être (si vous aimez l' :param_name = $valeur moyen, comme moi):
Je ne suis pas sûr si c'est la meilleure et la solution la plus optimale, mais il est un peu plus lisible 🙂 Et il peut être utile si vous avez un gros un complexe requête et que vous souhaitez déboguer il
(Je suis curieux de savoir si quelqu'un a un bon argument pourquoi ne PAS le faire de cette façon)
OriginalL'auteur
Vous avez oublié de préparer ^_^
Et à part que
execute()
ne devrait avoir un paramètreLa ne fonctionne pas À TOUS les!
Voir les DOCs
OriginalL'auteur
Espaces réservés version si vous en avez besoin
OriginalL'auteur