Foreach通过2个数组只循环第一个元素
我从表单输入创建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
阵列。我试过寻找答案,我试过把这些数组组合起来,但没有成功。
如何正确地循环访问两个数组并将其插入数据库?
这听起来像你试图使用嵌套循环,但实际上有一个循环,在其收出开始,然后你遍历休息。您需要将下面标明您的右大括号:
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个或更多的空格完美排列 - 我不能告诉你我看过多少次(或者太少)缩进让人们错过了哪些问题否则会很明显。
我终于开始工作了。所有的答案或多或少都有所帮助,但我主要使用了这一答案。谢谢您的帮助! – Santona 2015-03-25 16:21:38
如果回答这个问题,请标记为已接受的答案。谢谢。 – 2015-03-25 19:15:52
您的数据库查询不安全,因为它正在将原始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
}
}
假设上传的文件数量等于$ 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);
}
}
声明了$ filut广告的阵列? – kiks73 2015-03-25 06:03:24