2009-11-29 4 views
1

Im coincé, essayé de comprendre cela depuis 2 heures maintenant. J'ai trouvé la boucle de foreach, mais je n'arrive pas à comprendre comment insérer les données maintenant.Insérez plusieurs lignes dans mysql avec php en utilisant des tableaux foreach

Voici mon php, qu'est-ce que je fais 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 l'exposer comme ceci, désolé encore un débutant à 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); 

Répondre

2

Plusieurs mauvaises choses ici:

  1. Vous manque un support d'ouverture sur votre liste de valeurs (après VALUES)
  2. Vous exécutez mysql_query à chaque itération de la foreach. Au lieu de cela, vous souhaiterez probablement créer la chaîne en premier (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 façon
  4. Vous devez échapper aux $_POST données avant de le mettre dans la base de données!
  5. Vous n'utilisez pas réellement le $key ou $value de votre foreach dans votre recherche, vous le jetez 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 aucun sens. Vous ne savez pas combien de temps $_POST est, ou ce qui pourrait l'être, alors pourquoi bouclez-vous sur $_POST?

Quelques conseils pour vous aider à résoudre tout cela:

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

Si vous souhaitez obtenir un complément d'aide, je vous suggère de vous var_dump ce qui est dans $_POST, essayez d'écrire ce que vous pensez que la requête devrait ressembler, et puis après deux ici. Alors peut-être que quelqu'un vous aidera à passer de l'un à l'autre.

+0

Est-ce la façon dont cela devrait être configuré? Foreach ($ _ POST comme $ key => $ value) { $ query = "INSÉRER DANS les images VALEURS (chemin_chemin, chemin_image, image_principal, id_projet),"; $ query. = "$ Valeur [chemin_chemin], $ valeur [$ chemin_image], $ valeur [$ main_image], '$ _POST [id_projet'])"; } $ resultat = requête mysql ($ query, $ connection); – jrutter

0

D'abord, évitez $ _POST [id_projet] avec mysql_real_esape_string.

Ensuite, le syntax est INSERT INTO table VALUES (...), (...)

0
// escape your input 
$_POST = array_map('addslashes', $_POST); 

// rather than recursively calling mysql_query, you can insert all your rows with one query 
// INSERT INTO table (columns) VALUES (data), (data), (data), ... 
$values = array(); 
foreach($_POST as $key => $value) { 
    $values[] = "('{$_POST['thumb_path']}', '{$_POST['image_path']}', '{$_POST['main_image']}', '{$_POST['project_id']}')"; 
} 
if(sizeof($values)) { 
    $query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ".implode(',', $values); 
    $result = mysql_query($query, $connection); 
} 
+0

Merci pour l'aide, cela a semblé fonctionner mais les valeurs n'ont pas été retirées. Au lieu de cela, il a tout stocké comme "Array" dans la base de données. Des idées comment je peux résoudre ce problème? – jrutter

0

je trouve quelque chose comme cela est beaucoup plus facile à entretenir que la concaténation de chaîne répétée que vous faites:

$values = array(); 
foreach ($_POST as $key => $value) { 
    $qvalue = mysql_real_escape_string($value); 
    $values[] = "($field1, $field2, $field3, $qvalue)"; // quoted value, not the raw value 
} 

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

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

Il suffit de garder à l'esprit que lors de la construction d'une requête comme celui-ci, il est tout à fait Il est possible de créer une requête suffisamment grande pour exclure la longueur max_packet, auquel cas vous devrez diviser l'insertion en plusieurs requêtes plus petites.

Questions connexes