foreach循环中的两个数组?

时间:2010-11-27 00:40:54

标签: php mysql

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

任何帮助总是受到赞赏。

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

1 个答案:

答案 0 :(得分: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