2015-03-25 3 views
0

Я создаю 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 массив. Я попытался найти ответ, и я попытался объединить массивы, но без каких-либо успехов.

Как выполнить правильную обработку обоих массивов и вставить их в базу данных?

+0

Заявили вы $ filut объявления массив? – kiks73

ответ

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 ['отвечает'] параллельно, и вам нужна корреляция 1-1 на вставке?

Наконец, я собираюсь предложить использовать подготовку и привязку, так как вы получаете данные от пользователя. В этом примере выполняется копирование/редактировалось 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 Injection (что является серьезным недостатком вашего кода в противном случае) и (2) будет намного быстрее с помощью цикла подготовки/выполнения.

Обратите внимание на точные отступы в моих примерах, где все выстраивается идеально с 3 или более пробелами на отступ - я не могу сказать вам, сколько раз я видел неаккуратное (или слишком малое) отступы, чтобы люди пропускали проблемы, которые было бы иначе очевидно.

+0

Я получил его, чтобы работать наконец. Все ответы помогли более или менее, но я использовал это в основном. Спасибо за помощь! – Santona

+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 
    } 
} 
0

Если предположить, что количество файлов закачано равно длине массива данных $ я бы попробовать это:

$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); 
    } 
} 
Смежные вопросы