2010-08-03 7 views
4

Voici ce que je veux:boucle Foreach avec plusieurs tableaux


foreach($_POST['something'] as $something){ 
    foreach($_POST['example'] as $example){ 
     $query = mysql_query("INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"); 
    } 

} 

$_POST['something'] et $_POST['example'] sont des tableaux à partir d'une entrée avec

name="something[]" et name="example[]".

Le problème:


De cette façon, je vais envoyer les données deux fois à la base de données. J'ai donc besoin d'une solution où je peux faire une boucle sur 2 baies sans dédoubler les données.

EDIT

  • Le tableau à deux aura toujours la même taille
  • Dans le mysql_query je vais avoir d'autres éléments non Ramer, row2, et ceux-ci seront statiques sans aucun tableau.
+1

Je ne comprends pas comment vous envoyez les données deux fois. Pourriez-vous montrer un exemple de sortie si vous mettez un 'echo' dans' foreach'? – KLee1

Répondre

11

Voulez-vous dire quelque chose comme:

foreach($_POST['something'] as $key => $something) { 
    $example = $_POST['example'][$key]; 
    $query = mysql_query("INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"); 
} 
+0

Si $ _POST [exemple] a plus de valeurs que $ _POST [quelque chose] alors certaines valeurs seront perdues – Cfreak

+0

J'essaie d'interpréter exactement ce que l'OP demande, basé sur son commentaire sur l'envoi des données à la base de données deux fois . Mon soupçon est que c'est ce qu'il veut dire, mais a de la difficulté à expliquer –

+1

Eh bien, cela fonctionne, cependant je reçois une erreur: 'Warning: argument invalide fourni pour foreach() dans example.php sur la ligne 63' mais j'ai utilisé exactement tu as écrit. – Adam

1

Votre solution ne semble pas envoyer les données deux fois. Sauf si des enregistrements avec les mêmes valeurs apparaissent à la suite de l'envoi de vos requêtes. Cela peut signifier que vous devez traiter vos données avant de construire vos requêtes.

Une solution pourrait être:

$sql = array(); 

foreach($_POST['something'] as $something){ 
    foreach($_POST['example'] as $example){ 
    $sql[] = "INSERT INTO table (row, row2) VALUES ('{$something}','{$example}')"; 
} 
} 

foreach($sql as $query){ 
    mysql_query($query); 
} 
1
$cnt = count($_POST['something']); 
$cnt2 = count($_POST['example']); 

if ($cnt > 0 && $cnt == $cnt2) { 
    $insertArr = array(); 
    for ($i=0; $i<$cnt; $i++) { 
     $insertArr[] = "('" . mysql_real_escape_string($_POST['something'][$i]) . "', '" . mysql_real_escape_string($_POST['example'][$i]) . "')"; 
    } 

    $query = "INSERT INTO table (column, column2) VALUES " . implode(", ", $insertArr); 
    mysql_query($query) or trigger_error("Insert failed: " . mysql_error()); 
} 

est une autre méthode ici. Celui-ci utilise des insertions étendues, donc devrait être plus efficace et plus rapide, et utilise mysql_real_escape_string pour des raisons de sécurité. La vérification de compte est juste de s'assurer que les deux champs ont le même nombre, sinon je prends ceci est une mésaventure. S'ils sont autorisés à avoir un nombre différent de champs, vous pouvez simplement utiliser la fonction isset() pour vérifier qu'ils contiennent une valeur.

EDIT

Cela suppose bien sûr, que vous ne voulez pas « quelque chose » à itérer sur tous les « exemple » des valeurs et être affecté à chacun. Si vous voulez bien, c'est un peu un changement.

Ajout d'un test d'insertion de tableau, s'il n'y a pas d'éléments à mettre à jour. Merci Gumbo pour ça.

+1

Vous devriez tester si $ insertArr possède des éléments. – Gumbo

+0

Oui, bon appel. Ajouté dans une instruction if pour cela. –

+0

@premiso: Pourquoi ne pas simplement ajouter la condition '$ cnt> 0' à' $ cnt == $ cnt2'? – Gumbo

1

Je pense que la meilleure façon serait comme une seule boucle pour construire une requête. Cela devrait fonctionner même si vos tableaux ne sont pas la même longueur:

$size1 = count($_POST['something']); 
$size2 = count($_POST['example']); 
if($size1 >= $size2) { 
    $size = $size1; 
} else { 
    $size = $size2; 
} 

$sql = "INSERT INTO table (row, row2) VALUES"; 
$values = array(); 
for($i=0; $i<$size; $i++) { 
    $values[] = "('" . mysql_real_escape_string($_POST['something'][$i]) . "','" . mysql_real_escape_string($_POST['example'][$i]) . "')"; 
} 

$sql .= implode(",", $values); 

mysql_query($sql); 

également plus sûr parce qu'il échappe à votre entrée. Cela serait également plus facile en utilisant des espaces réservés avec PDO.

1

Bien que vous ayez déjà sélectionné une réponse, n'oubliez pas que ce script peut échouer si les valeurs POST ne sont pas des tableaux.Vous pouvez surmonter cela avec un petit morceau de code:

$something = is_array($_POST['something']) ? $_POST['something'] : array(); 
$example = is_array($_POST['example']) ? $_POST['example'] : array(); 

/* Get all the keys from both arrays 
* If they don't share the keys, none will be lost 
*/ 
$keys = array_merge(array_keys($something),array_keys($example)); 
$keys = array_unique(); 

if (count($keys)) { 
    $sql = 'INSERT INTO table (row, row2) VALUES '; 
    $values = array(); 

    foreach ($keys as $key) { 
     // Single quotes for PHP, we are not expanding variables 
     // If the element cannot be converted into a string, don't show the error on screen 
     $values[] = '("' . @mysql_real_escape_string($something[$key]) . '","' . @mysql_real_escape_string($example[$key]) . '")'; 
    } 

    $sql .= implode(',', $values); 
    mysql_query($sql); 
} 
2

SOLUTION POUR Arrays PLUSIEURS

TRY -

1)

<?php 
$ZZ = array('a', 'b', 'c', 'd'); 
$KK = array('1', '2', '3', '4'); 

foreach($ZZ as $index => $value) { 
    echo $ZZ[$index].$KK[$index]; 
    echo "<br/>"; 
} 
?> 

ou 2)

<?php 
$ZZ = array('a', 'b', 'c', 'd'); 
$KK = array('1', '2', '3', '4'); 

for ($index = 0 ; $index < count($ZZ); $index ++) { 
    echo $ZZ[$index] . $KK[$index]; 
    echo "<br/>"; 
} 
?> 
+0

Pourquoi publiez-vous la même réponse sur chaque même poste comme celui-ci? Un seul suffit ... – j0k

+0

La première solution a fonctionné pour moi. Merci :) –

0

Foreach boucle avec plusieurs tableaux:

foreach($_POST['quantity'] as $key=>$quantity) 
{ 
    $product_no=$_POST['product_id'][$key]; 
    echo $product_no; 
    echo $quantity; 
}