2010-11-27 3 views
0

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

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

Приветствия, Lea

ФОРМА:

<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 SCRIPT:

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 
} 

ответ

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

Отлично! Спасибо! И спасибо за объяснение, где я ошибся :) – Lea 2010-11-27 00:53:52

Смежные вопросы