使用多个数组的foreach循环

4

This is what I want:


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

}

$_POST['something']$_POST['example']是从名为something[]example[]的输入中得到的数组。

问题:


这样我将向数据库发送两次数据。因此,我需要一种解决方案,可以循环遍历两个数组而不会重复发送数据。

编辑

  • 这两个数组将始终具有相同的大小
  • 在mysql_query中,除了row、row2之类的数组外,还将有其他元素,这些元素将是静态的,没有任何数组。

1
我不明白您是如何发送数据两次的。如果在“foreach”中放置“echo”,您能否展示一些样本输出? - KLee1
事实上,没有人应该再像这样编写代码了。一个预处理语句应该被定义一次,并且可以根据需要执行多次。 - mickmackusa
8个回答

11

您是指像这样的东西吗:

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

如果 $_POST[example] 比 $_POST[something] 有更多的值,那么其中一些值将会丢失。 - Cfreak
我正在尝试根据OP在将数据发送到数据库两次的评论中准确解释他所要求的内容。我的怀疑是这就是他的意思,但他很难解释清楚。 - Mark Baker
1
好的,这个可以运行,但是我收到了一个错误信息:警告:在example.php的第63行foreach()函数提供了无效参数,但是我使用的是你写的代码。 - Adam Halasz
嘿,那真是另一回事,我读错了那一行:D 哈哈,非常感谢,这正是我想要的方式;) - Adam Halasz
只要记得在插入数据之前转义它,就像其他人建议的那样。 - Mark Baker

2

多数组解决方案

尝试 -

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/>";
}
?>

或者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/>";
}
?>

你为什么要在每个类似的帖子上发布相同的答案?只需要一个就足够了... - j0k

1

你的解决方案好像没有发送数据两次。除非发出查询后出现相同值的记录。这可能意味着在构造查询之前应该处理数据。

一种解决方案可以是:

$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());
}

这里有另一种方法。这个方法使用扩展插入,因此应该更有效率和更快,并且出于安全原因利用mysql_real_escape_string。计数检查只是为了确保两个字段具有相同的计数,如果不是,则认为这是一个错误。如果允许它们具有不同数量的字段,则可以简单地使用isset()函数来检查以确保它们包含一个值。

编辑

当然,这是假设您不想要“something”迭代所有“example”值并分配给每个值。如果您想要那样,那么需要进行一些更改。

添加了一个插入数组测试,如果没有元素,则无需更新。感谢Gumbo提供的帮助。


1
你应该测试 $insertArr 是否有任何元素。 - Gumbo
@premiso:为什么不直接将条件“$cnt> 0”添加到“$cnt == $cnt2”中呢? - Gumbo
因为早上很长时间了! - Jim
嘿,感谢@permiso的回答,看起来很不错。但是,我应该如何在mysql_query中放置除somethingexample之外的其他元素?我想在它们之前加一个id。我尝试了这样的代码,但它不起作用:| $query = "INSERT INTO table (id, something, example) VALUES " ."({$id}, ". implode(", ", $insertArr). ")"; - Adam Halasz

1

我认为最好的方法是使用单个循环来构建查询。即使您的数组长度不同,这也应该可以工作:

$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);

这样更安全,因为它可以转义您的输入。如果使用PDO占位符,这将变得更加容易。


1

虽然您已经选择了一个答案,但不要忘记如果POST值不是数组,则此脚本可能会失败。 您可以通过一小段代码来解决这个问题:

$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);
}

0

你的例子在我这里不起作用。 我是这样做的:

if($_POST[add_all]) 
{
$n=0;
foreach($_POST['pieces'] as $checked)    
  {
  if ($checked!=0) 
    {
    $box=$_POST['box'];
    echo $box[$n]."  ".$checked . ' <br>';
    $n++;
    }

  }

<input type="submit" id="coin" name="add_all" value="..Test.."><BR> 
<select name="pieces[]"> 
    <?php for ($x=0;$x<=20;$x++){ echo "<option>$x</option>";} ?>
<input type="checkbox" name="box[]" value="<?php echo"$row_produkt";?>"> 


如果 $_POST['pieces'] 是一个索引数组,那么您不需要手动递增 $n。只需在 foreach 循环中的签名中声明索引变量即可。[...] as $n => $checked) { - mickmackusa
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Jeremie

0

使用多个数组的foreach循环:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接