Foreach到2个数组只循环第一个元素

时间:2015-03-25 05:59:42

标签: php arrays foreach

我从表单输入创建了2个不同的数组$postvalues$filut。然后我按下按钮将数组发送到我的数据库表。这些数组由文件名和一个小介绍组成。

for($i=0; $i<count($_FILES['upload']['name']); $i++) 
{
    $filut = basename($_FILES['upload']['name'][$i]);
}
if(isset($_POST['subi'])) 
{
     $data1 = $_POST['answers'];
     foreach($data1) as $postValues) 
     {
         $sql4 = 'INSERT INTO db_image (text, image) VALUES("'.$postValues.'","'.$filut.'")';
         $my->query($sql4);
     }
}    

这里的问题是输出。 foreach循环正确输出$postValues但仅复制$filut第一个元素。

错误输出的示例:

 this is picture1  picture1.png
 this is picture2  picture1.png  //Supposed to say 2nd element of $filut: "picture2.png"

Foreach正确浏览第一个数组但只复制$filut数组。我尝试过寻找答案,但我尝试过将数组合并但没有任何成功。

如何正确遍历两个数组并将它们插入数据库?

3 个答案:

答案 0 :(得分:0)

您的数据库查询不安全,因为它将原始POST数据直接发送到数据库。验证您的输入,并使用预准备语句。

你的错误在这里:

for($i=0; $i<count($_FILES['upload']['name']); $i++) {
    $filut = basename($_FILES['upload']['name'][$i]);
}

$ filut被重新分配给$ _FILES的最后一个元素。因此只持有一个值。 $ filut应该是一个数组吗?

试试这个:

$filut = array();
for($i=0; $i<count($_FILES['upload']['name']); $i++) 
{
    $filut[$i] = basename($_FILES['upload']['name'][$i]);
}

$i = 0; //Reset
if(isset($_POST['subi'])) 
{
    $data1 = $_POST['answers'];
    foreach($data1 as $postValues) 
    {
        $sql4 = 'INSERT INTO db_image (text, image) VALUES("'.$postValues.'","'.$filut[$i].'")';
        $my->query($sql4);
        $i++ //Increment
    }
}

答案 1 :(得分:0)

听起来你试图使用嵌套循环,但实际上你在开始时有一个循环关闭,然后你循环完成剩下的循环。您需要移动下面标记的右手大括号:

for($i=0; $i<count($_FILES['upload']['name']); $i++) {
  $filut = basename($_FILES['upload']['name'][$i]);
 } <<<<<<<<<=========== This curly brace closes the "for loop"
if(isset($_POST['subi'])) {
 $data1 = $_POST['answers'];
 foreach($data1) as $postValues) {
 $sql4 = 'INSERT INTO db_image (text, image) VALUES("'.$postValues.'","'.$filut.'")';
 $my->query($sql4);
 }
} 
??? <<<<<======== For a nested loop you should close it here

或者您可能尝试将$filut指定为数组,在这种情况下,起始for...循环需要如下所示:

for($i=0; $i<count($_FILES['upload']['name']); $i++) {
  $filut[] = basename($_FILES['upload']['name'][$i]);
 }

(请注意在[]之后添加$filut。)

但是,如果这是你想要的(将$ filut变成数组),那么你需要在下面做一些不同的事情才能访问数组中的一个元素。这是嵌套foreach可以解决问题的地方 - 也许这就是你打算完成它的方式:

if(isset($_POST['subi'])) {
    $data1 = $_POST['answers'];
    foreach($data1 as $postValues) {
        foreach ($filut as $f) {
            $sql4 = 'INSERT INTO db_image (text, image)
                     VALUES("'.$postValues.'","'.$f.'")';
            $my->query($sql4);
        }
    }
}

对于$ _POST [&#39; answers&#39;]中的每个值,这将为$ filut中的每个值插入一行。那是你想要的吗?或者是$ filut和$ _POST [&#39;答案&#39;]并行,你想要插入1-1的相关性?

最后,我建议您使用prepare和bind,因为您从用户那里获取数据。此示例从here复制/修改:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* Prepare an insert statement */
$query = "INSERT INTO db_image (text, image) VALUES (?,?)";
$stmt = $my->prepare($query);

#### NOTE THE USE OF YOUR VARIABLES HERE IN THE BIND - the "ss" means they are strings
$stmt->bind_param("ss", $postValues, $f);

#### HERE IS WHERE YOUR CODE IS GETTING INSERTED
foreach($data1 as $postValues) {
    foreach ($filut as $f) {
        /* Execute the statement */
        $stmt->execute();
    }
}

/* close statement */
$stmt->close();

/* close connection */
$my->close();
?>

我无法保证我将所有变量都更改为符合您的代码,但希望它足够接近您的想法。这个解决方案(1)保护您免受SQL注入(否则这是您的代码中的严重缺陷),并且(2)通过准备/执行周期将更快。

请注意我的示例中的小心缩进,其中每个缩进都有3个或更多空格完美排列 - 我无法告诉您有多少次我看到马虎(或太少)缩进使人错过了很明显的问题。

答案 2 :(得分:0)

假设上传的文件数量等于$ data数组的长度,我试试这个:

$data1 = $_POST['answers'];
for($i=0; $i<length($data); $i++){
    $filut = basename($_FILES['upload']['name'][$i]);
    if(isset($_POST['subi'])) {
        $postValue = $data[$i];
        $sql4 = 'INSERT INTO db_image (text, image) VALUES("'.$postValues.'","'.$filut.'")';
        $my->query($sql4);
    }
}