Два массива в цикле foreach?

0

снова возникли трудности из-за моей нужности. Я не знаю, выполняю ли я это правильно, но мне нужно отправить переменную id с массивом через цикл foreach в mysql db. Если это не имеет никакого смысла, то, вероятно, из-за моей неспособности сформулировать с техническим жаргоном, так что просто отправьте код. Просмотрите примечания в коде PHP.

Любая помощь всегда ценится.

Cheers, Lea

FORM:

<form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">

 <?php
    $num = 0;
    while($num < $num_uploads)
    {
        ?>
<input type="hidden" name="item_id[]" value="<?php echo $stockno; ?>" />
<input type="file" id="myfile" name="userfile[]" size="40">

        <?php $num++;
    }
 ?>
<input type="submit" name="Preview" value="Preview" />
</form>

PHP скрипт:

if(isset($_POST['Preview']) ) {
// START PHOTO QUERY

    if(isset($_FILES['userfile']['tmp_name']))
    {
        /** loop through the array of files ***/
        for($i=0; $i < count($_FILES['userfile']['tmp_name']);$i++)
        {
            // check if there is a file in the array
            if(!is_uploaded_file($_FILES['userfile']['tmp_name'][$i]))
            {
                $messages[] = 'No file uploaded';
            }
            /*** check if the file is less then the max php.ini size ***/
            elseif($_FILES['userfile']['size'][$i] > $upload_max)
            {
                $messages[] = "File size exceeds $upload_max php.ini limit";
            }
            // check the file is less than the maximum file size
            elseif($_FILES['userfile']['size'][$i] > $max_file_size)
            {
                $messages[] = "File size exceeds $max_file_size limit";
            }
            else
            {
                // copy the file to the specified dir 
                if(@copy($_FILES['userfile']['tmp_name'][$i],$upload_dir.'/'.$_FILES['userfile']['name'][$i]))
                {
                    /*** give praise and thanks to the php gods ***/
                    $messages[] = $_FILES['userfile']['name'][$i].' uploaded';
                    $name[] = $_FILES['userfile']['name'][$i];
                    $id[] = $_POST['item_id'];

// HAVING DIFFICULTIES HERE

foreach( $name as $value ) {
$sql = "INSERT INTO stock_photos (photo_filename) VALUES ('$value')";
mysql_query($sql);
foreach( $id as $val ) {
$sql2 = "UPDATE stock_photos SET photo_item_id = '$val' WHERE photo_filename = '$value'";
mysql_query($sql2) or die(mysql_error());
}
}
// END DIFFICULTIES HERE
                }
                else
                {
                    /*** an error message ***/
                    $messages[] = 'Uploading '.$_FILES['userfile']['name'][$i].' Failed';
                }
            }
        }
    }

// END PHOTO QUERY
}
Теги:

1 ответ

2
Лучший ответ

Я думаю, что у вас есть недостаток в вашей логике. Вы не хотите иметь вложенный цикл foreach. Подумайте об этом:

Вы перебираете каждое имя файла. Для каждого имени файла вы перебираете все идентификаторы и обновляете идентификатор имени файла с каждым значением из массива идентификаторов. Вы в основном перезаписываете идентификатор в базе данных с каждым вызовом UPDATE, в конечном итоге устанавливая значение в последнее значение массива $id.

Таким образом, вы должны иметь петли один за другим.


Предполагая, что ваши $name и $id заполнены правильно, и оба содержат одинаковое количество элементов, вы можете сделать еще лучше, используя обычный цикл for:

for($i = 0; $i < count($name); $i++ ) {
    $sql = "INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES ('".   mysql_real_escape_string($name[$i]) . "', '" . mysql_real_escape_string($id[$i] . "')";
    mysql_query($sql);
}

Примечание: Никогда не доверяйте пользовательскому вводу, поэтому принимайте меры предосторожности с помощью фильтрации и экранирования, как я сделал с mysql_real_escape_string().


Update:

И вы можете сделать еще лучше только с одним запросом MySQL, вставив сразу несколько значений:

function prepare($name, $id) {
    return sprintf("'%s', '%s'",
           mysql_real_escape_string($name),
           mysql_real_escape_string($id));
}

$values = array_map('prepare', $name, $id); 
$sql = 'INSERT INTO stock_photos (photo_filename, photo_item_id) VALUES (' . implode('),(', $values) . ')';  
mysql_query($sql);

Ссылка: sprintf, array_map, implode

  • 0
    Отлично! Спасибо! И спасибо, что объяснили, где я ошибался :)
  • 0
    @Lea: Пожалуйста. Удачного кодирования! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню