2010-11-27 142 views
0

因为我的不高兴而再次遇到困难。我不知道如果我这样做是正确的,但我需要通过foreach循环发布一个数组的id变量到MySQL数据库。如果没有任何意义,那可能是因为我缺乏用技术术语表达的能力,所以生病只是发布代码。请查看PHP代码中的注释。foreach循环中的两个数组?

任何帮助总是赞赏。

干杯,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 
} 

回答

2

我觉得你有你的逻辑缺陷。你不想有一个嵌套的foreach循环。想想看:

你正在循环每个文件名。 对于每个文件名,您正循环所有ID并使用ID阵列中的每个值更新文件名ID。每调用一次UPDATE,您基本上都会覆盖数据库中的ID,最后将该值设置为$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()做的那样。


更新:

,您可以通过一次插入多个值甚至最好只与一个 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); 

参考:sprintfarray_mapimplode

+0

完美!谢谢!并感谢您解释我错误的地方:) – Lea 2010-11-27 00:53:52