PDO de PHP à insérer dans DB à partir d'un tableau associatif
J'ai un tableau comme ceci
$a = array( 'phone' => 111111111, 'image' => "sadasdasd43eadasdad" );
Quand je fais du var-dump-je obtenir this ->
{ ["phone"]=> int(111111111) ["image"]=> string(19) "sadasdasd43eadasdad" }
Maintenant j'essaie de l'ajouter à la DB à l'aide de l'instruction IN -
$q = $DBH->prepare("INSERT INTO user :column_string VALUES :value_string");
$q->bindParam(':column_string',implode(',',array_keys($a)));
$q->bindParam(':value_string',implode(',',array_values($a)));
$q->execute();
Le problème que j'ai c'est que imploser retourner une chaîne de caractères. Mais le "téléphone" de la colonne est un entier dans la base de données et le tableau est de stocker un nombre entier. Donc j'obtiens l'erreur SQL que ma dernière requête ressembler à ceci --
INSERT INTO user 'phone,image' values '111111111,sadasdasd43eadasdad';
Ce qui est une fausse requête. Est-il un moyen de contourner cela.
Mes noms de colonne sont dynamiques en fonction de ce que l'utilisateur souhaite insérer. Je ne peux donc pas utiliser les espaces réservés comme :téléphone et :image que je ne peut pas toujours obtenir les valeurs de ces deux colonnes. S'il vous plaît laissez-moi savoir si il existe un moyen de contourner cela. sinon je vais avoir de définir plusieurs fonctions de chaque type de mise à jour.
Grâce.
D'accord Louis, bien qu'un numéro de téléphone peut être vu comme un entier, vous ne vous attendez pas à faire toute mathématiques avec elle et vous pouvez exécuter de taille, il est généralement mieux traités et stockés comme une chaîne de texte.
OriginalL'auteur Fox | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Dernière fois que j'ai vérifié, il n'était pas possible de préparer un état où les colonnes concernées étaient inconnues - temps de préparation, mais que quelque chose semble de travail - peut-être que votre système de base de données est plus indulgent que ceux que j'utilise (principalement postgres)
Ce qui est clairement mauvais, c'est la implode (), chaque variable doit être prise en charge par auto, vous avez aussi besoin de parenthèses autour de la liste des champs dans l'instruction insert.
Pour insérer des champs définis par l'utilisateur, je pense que vous avez à faire quelque chose comme ça (à moins que la façon dont je le fais);
Si vous ne pouvez faire confiance les noms de champ dans $un, vous avez à faire quelque chose comme
Où validfields est une fonction qui vous écrivez que les tests de chaque nom de champ et vérifie si elle est valide (rapide et sale en faisant un tableau associatif $valfields=array('nom'=>1,'email'=>1, 'téléphone'=>1 ... et puis la vérification de la valeur de $valfields[$f], ou (que je préfère) en allant chercher les noms de champ à partir du serveur)
INJECTION SQL Ce n'est pas sûr si
$a
est rempli par votre formulaire. C'est dans le texte, mais j'ai l'impression que cela doit être plus visible. Si vous avez besoin de la saisie de l'utilisateur l'utilisation d'un filtre: stackoverflow.com/a/4260168/956397+1 pas pour le résultat final, mais je recongized la façon dont vous avez créé un tableau avec une boucle foreach qui était exactement ce que j'essayais de faire un interrogée assoc tableau, et qui ont besoin d'ajouter d'autres key=>valeur. Merci :). @MortenSickel
OriginalL'auteur MortenSickel
Requête SQL paramètres peuvent être utilisés uniquement où vous auriez mis un valeur littérale.
Donc si vous pouviez vous voir mettre une chaîne littérale, la date littérale, ou littéral numérique dans cette position, dans la requête, vous pouvez utiliser un paramètre.
Vous ne pouvez pas utiliser un paramètre pour un nom de colonne, un nom de table, listes de valeurs, un mot clé SQL, ou toutes autres expressions ou de la syntaxe.
Pour ces cas, vous avez encore à interpoler contenu dans la chaîne SQL, si vous avez quelques risques d'injection SQL. La façon de se protéger contre c'est avec liste blanche les noms de colonne, et le rejet de toute saisie qui ne correspond pas à la liste blanche.
OriginalL'auteur Bill Karwin
Parce que tous les autres réponses permettent injection SQL. Pour la saisie de l'utilisateur vous avez besoin de filtrer autorisé pour les noms de champ:
OriginalL'auteur PiTheNumber
Vous avez réellement peuvent avoir la
:phone
et:image
champs liés avec des valeurs null à l'avance. La structure de la table est fixé de toute façon et vous devriez probablement obtenu de cette façon.Mais la réponse à votre question pourrait ressembler à ceci:
OriginalL'auteur Alex
J'ai apprécié MortenSickel réponse, mais je voulais utiliser des paramètres nommés, pour être sur le côté sécuritaire:
Êtes-vous configurer les valeurs de l'égalité au nom de champ?
OriginalL'auteur Joseph Heininge
Je sais que cette question a répondu il y a longtemps, mais je l'ai trouvé aujourd'hui et d'avoir une petite contribution en plus de la réponse de @MortenSickel.
La classe ci-dessous vous permettra d'insérer ou de mettre à jour un tableau associatif à votre table de base de données. Pour plus d'informations à propos de MySQL PDO, veuillez visiter: http://php.net/manual/en/book.pdo.php
dbConnection classe d'utilisation:
OriginalL'auteur Teun Ouwehand