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

Php Foreach到2个数组只循环第一个元素,php,arrays,foreach,Php,Arrays,Foreach,我从表单输入创建了两个不同的数组$postvalues和$filut。然后单击按钮将数组发送到数据库表。数组由文件名和一个小的介绍组成 for($i=0; $i<count($_FILES['upload']['name']); $i++) { $filut = basename($_FILES['upload']['name'][$i]); } if(isset($_POST['subi'])) { $data1 = $_POST['answers'];

我从表单输入创建了两个不同的数组
$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正确地遍历第一个数组,但只复制
$filut
数组。我尝试过搜索答案,也尝试过组合数组,但都没有成功


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

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

您的错误如下:

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

对于($i=0;$i听起来您试图使用嵌套循环,但事实上,您在开始时有一个循环已关闭,然后循环其余的循环。您需要移动下面标记的关闭大括号:

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
之后添加了
[]

但是,如果这是您想要的(将$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);
        }
    }
}
这将为$filut中的每个值插入一行,为$U POST['answers']中的每个值插入一行。这是您想要的吗?或者$filut和$U POST['answers']是并行的,并且您想要在插入上有1-1的相关性吗

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


我不能保证我更改了所有变量以匹配您的代码,但希望它足够接近您的想法。此解决方案(1)保护您免受SQL注入(否则这是您代码中的一个严重缺陷)的影响,(2)通过准备/执行周期将更快


请注意我的例子中仔细的缩进,每个缩进都有3个或更多的空格,我不能告诉你我见过多少次马虎(或太少)缩进会使人们忽略其他明显的问题。

假设上载的文件数等于$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);
    }
}
$data1=$\u POST['answers'];
对于($i=0;$iquery($sql4);
}
}

你宣布$filut为数组了吗?我终于让它工作了。所有的答案或多或少都有帮助,但我主要使用了这个。谢谢你的帮助!
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);
        }
    }
}
<?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();
?>
$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);
    }
}