1 votes

Insérez plusieurs lignes dans mysql avec php en utilisant des tableaux foreach

Je suis bloqué, j'ai essayé de comprendre cela depuis 2 heures maintenant. J'ai compris la boucle foreach, mais je ne peux pas comprendre comment insérer les données maintenant.

Voici mon php, qu'est-ce que je fais de mal?

    $query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ";  
foreach($_POST as $key => $value) {
    $query .= "$thumb_path,$image_path,$main_image,$_POST[project_id])";
    $result = mysql_query($query, $connection);
}

Merci!

Devrais-je le présenter ainsi, désolé je suis encore un novice en ce qui concerne le foreach et comment cela fonctionne.

foreach($_POST as $key => $value) {
    $query = "INSERT INTO images VALUES (thumb_path, image_path, main_image, project_id),";  
    $query .= "$value[thumb_path], $value[$image_path], $value[$main_image], '$_POST[project_id]')";
}

$result = mysql_query($query, $connection);

2voto

Ben James Points 41165

Plusieurs erreurs ici :

  1. Vous avez oublié un crochet ouvrant dans votre liste de valeurs (après VALUES)
  2. Vous exécutez mysql_query à chaque itération du foreach. À la place, vous devez probablement construire la chaîne d'abord (en utilisant plusieurs listes de valeurs), et exécuter mysql_query en dehors de la boucle.
  3. Vous ne pouvez pas interpoler la variable $_POST['project_id'] dans une chaîne de cette manière
  4. Vous devez échapper les données de $_POST avant de les mettre dans la base de données !
  5. Vous n'utilisez pas réellement les variables $key ou $value de votre foreach dans votre requête, vous les ignorez simplement.
  6. Les variables à l'intérieur de la boucle ($thumb_path etc.) seront les mêmes pour chaque itération de la boucle - donc vous allez insérer les mêmes données à chaque fois.
  7. La logique de la boucle n'a tout simplement pas de sens. Vous ne savez pas combien $_POST mesure, ni ce qui pourrait s'y trouver, alors pourquoi bouclez-vous sur $_POST ?

Quelques conseils pour vous aider à corriger tout cela :

  1. Vérifiez votre fichier journal d'erreurs.
  2. var_dump la chaîne SQL avant d'exécuter la requête pour vérifier si elle est syntaxiquement et logiquement correcte.

Si vous avez besoin d'aide supplémentaire, je vous suggère de var_dump ce qui se trouve dans $_POST, essayez d'écrire à quoi vous pensez que la requête devrait ressembler, puis postez les deux ici. Ensuite, peut-être que quelqu'un vous aidera à passer de l'un à l'autre.

0voto

Aif Points 4603

Tout d'abord, échappez $_POST[project_id] avec mysql_real_esape_string.

Ensuite, la syntaxe est INSERT INTO table VALUES ( ... ), ( ... )

0voto

Rob Points 3582
// échappez votre entrée
$_POST = array_map('addslashes', $_POST);

// au lieu d'appeler récursivement mysql_query, vous pouvez insérer toutes vos lignes avec une seule requête
// INSÉRER DANS table (colonnes) VALEURS (données), (données), (données), ...
$valeurs = array();
foreach($_POST as $key => $value) {
    $valeurs[] = "('{$_POST['thumb_path']}', '{$_POST['image_path']}', '{$_POST['main_image']}', '{$_POST['project_id']}')";
}
if(sizeof($valeurs)) {
    $requete = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ".implode(',', $valeurs);
    $resultat = mysql_query($requete, $connection);
}

0voto

Marc B Points 195501

Je trouve que quelque chose comme ça est beaucoup plus facile à maintenir que la concaténation de chaînes répétée comme vous le faites :

$values = array();
foreach ($_POST as $key => $value) {
    $qvalue = mysql_real_escape_string($value);
    $values[] = "($field1, $field2, $field3, $qvalue)"; // valeur entre guillemets, pas la valeur brute
}

$query_values = implode(',', $values);

$query = "INSERT INTO images (field1, field2, field3, field4) VALUES $query_values";
$result = mysql_query($query, $connection);

Gardez simplement à l'esprit que lors de la construction d'une requête de cette manière, il est tout à fait possible de construire une requête suffisamment grande pour dépasser la longueur max_packet, auquel cas vous devriez diviser l'insertion en plusieurs requêtes plus petites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X