2015-03-25 179 views
0

我从表单输入创建2个不同的数组$postvalues$filut。然后我发送数组到我的数据库表按钮单击。这些数组由文件名和一个小介绍组成。Foreach通过2个数组只循环第一个元素

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阵列。我试过寻找答案,我试过把这些数组组合起来,但没有成功。

如何正确地循环访问两个数组并将其插入数据库?

+0

声明了$ filut广告的阵列? – kiks73 2015-03-25 06:03:24

回答

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成为一个数组),那么你需要在下面做一些不同的操作来访问jus t数组中的一个元素。这是一个嵌套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每个值的行为$ _ POST每一个值[“答案” ]。那是你想要的吗?或者是$ filut和$ _POST ['answers']并行,并且您希望插入内容为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个或更多的空格完美排列 - 我不能告诉你我看过多少次(或者太少)缩进让人们错过了哪些问题否则会很明显。

+0

我终于开始工作了。所有的答案或多或少都有所帮助,但我主要使用了这一答案。谢谢您的帮助! – Santona 2015-03-25 16:21:38

+0

如果回答这个问题,请标记为已接受的答案。谢谢。 – 2015-03-25 19:15:52

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 
    } 
} 
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); 
    } 
} 
相关问题