PHP和MySQLi - 上传多个图像

时间:2017-06-03 17:53:27

标签: php mysql mysqli

我计划使用PHP和MySQL作为数据库来制作图像。

我已经使用PHP制作了多个上传图片,但是我遇到了问题。当我在数据库中上传 8张图片时,只显示1行数据。但是在文件夹中有我上传的 8张图片

这是我的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<form action="a.php" method="post" enctype="multipart/form-data">
<input type="file" name="file_img[]" multiple>
<input type="submit" name="btn_upload" value="Upload">    
</form>

<?php
include_once 'koneksi.php';
if(isset($_POST['btn_upload']))
{
    for($i = 0; $i < count($_FILES['file_img']['name']); $i++)
    {
        $filetmp = $_FILES["file_img"]["tmp_name"][$i];
        $filename = $_FILES["file_img"]["name"][$i];
        $filetype = $_FILES["file_img"]["type"][$i];
        $filepath = "uploads/".$filename;

    move_uploaded_file($filetmp,$filepath);

    $sql = "INSERT INTO files (file,path,type) VALUES ('$filename','$filepath','$filetype')";
    if($connect->query($sql) === TRUE) {        
header("Location: a.php");    
} else {        
header("Location: a.php");    
}     
    }

    $connect->close();}
?>

</body>
</html>

有人能帮助我吗?感谢您的反馈:)

2 个答案:

答案 0 :(得分:1)

header location重定向移到for循环之外。 另请参阅Upload multiple images and store their path in database

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<form action="a.php" method="post" enctype="multipart/form-data">
<input type="file" name="file_img[]" multiple>
<input type="submit" name="btn_upload" value="Upload">    
</form>

<?php
include_once 'koneksi.php';
if(isset($_POST['btn_upload']))
{
    for($i = 0; $i < count($_FILES['file_img']['name']); $i++)
    {
        $filetmp = $_FILES["file_img"]["tmp_name"][$i];
        $filename = $_FILES["file_img"]["name"][$i];
        $filetype = $_FILES["file_img"]["type"][$i];
        $filepath = "uploads/".$filename;

    move_uploaded_file($filetmp,$filepath);

    $sql = "INSERT INTO files (`file`,`path`,`type`) VALUES ('$filename','$filepath','$filetype')";
    $connect->query($sql);

    }
if($connect->query($sql) === TRUE) {        
header("Location: a.php");    
exit; // always add exit after header Location:
} else {        
header("Location: a.php");  
exit;  // always add exit after header Location:
}  
    $connect->close();}
?>

</body>
</html>

答案 1 :(得分:0)

经过一些代码美化你的代码段答案变得明显 - 你只在数据库中获得一个新行,因为在你的for循环中,你在插入这一行后立即将用户重定向到a.php。 换句话说,您的for循环将始终只执行一步。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
</head>
<body>
    <form action="a.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file_img[]" multiple>
        <input type="submit" name="btn_upload" value="Upload">
    </form>

    <?php
    include_once 'koneksi.php';

    if (isset($_POST['btn_upload'])) {
        for ($i = 0; $i < count($_FILES['file_img']['name']); $i++) {
            $filetmp = $_FILES["file_img"]["tmp_name"][$i];
            $filename = $_FILES["file_img"]["name"][$i];
            $filetype = $_FILES["file_img"]["type"][$i];
            $filepath = "uploads/".$filename;

            move_uploaded_file($filetmp, $filepath);

            $sql = "INSERT INTO files (file, path, type) VALUES ('$filename','$filepath','$filetype')";
            // #NOTICE: Read about SQL Injection and why above SQL is bad.

            // #SOLUTION: Place 1

            if ($connect->query($sql) === true) {
                header("Location: a.php");
                exit;  // #NOTICE: Always add `exit` after "header Location:"
            } else {
                header("Location: a.php");
                exit;  // #NOTICE: Always add `exit` after "header Location:"
            }
        }

        $connect->close();

        // #SOLUTION: Place 2
    }
    ?>
</body>
</html>

你现在能看到吗?

以下结帐链接!执行一些清理后,文件[1]是您的文件。它还包含两个标记为#SOLUTION的注释。 Place 1是您应移至Place 2的代码。移动后,您还应更改if条件以检查是否所有文件都已正确上传。另一方面,文件[2]由我编辑(可能)正确解决您的问题。

我希望我帮忙!

https://github.com/broiniac/stackoverflow/blob/master/44346949/

编辑:@AdhershMNair: 我认为,由于解决方案中的行if($connect->query($sql) === TRUE) {,上次上传文件的数据将被插入数据库两次(一次用于for循环中的最后一次迭代,一次用于if语句)。 / p>