PHP在插入多个“时上载多个图像”;选择";将数据导入Mysql

PHP在插入多个“时上载多个图像”;选择";将数据导入Mysql,php,Php,我有一个包含以下内容的图像上载页面: 一个多选择框,其中列出了9个类别。 图像alt文本的文本输入字段。 多文件上载字段 目标是能够一次上载多个图像,将alt文本的文本输入与每个图像一起存储,还可以将任何选定的类别与每个图像一起存储 我编写的脚本不一定会失败,因为我遇到的错误是脚本中内置的错误抱歉,上载图像时出现问题。 全文如下: <?php include($_SERVER['DOCUMENT_ROOT'].'/settings/functions.php'); include($_S

我有一个包含以下内容的图像上载页面:

一个多选择框,其中列出了9个类别。 图像alt文本的文本输入字段。 多文件上载字段

目标是能够一次上载多个图像,将alt文本的文本输入与每个图像一起存储,还可以将任何选定的类别与每个图像一起存储

我编写的脚本不一定会失败,因为我遇到的错误是脚本中内置的错误
抱歉,上载图像时出现问题。

全文如下:

<?php 
include($_SERVER['DOCUMENT_ROOT'].'/settings/functions.php');
include($_SERVER['DOCUMENT_ROOT'].'/settings/config.php');
include($_SERVER['DOCUMENT_ROOT'].'/php/top-notification.php');
include($_SERVER['DOCUMENT_ROOT'].'/php/nav.php');
?>

<div class="container">
<?php
// Connect to database
$conn = getConnected("lucycypher"); 
// Don't execute upload script unless "upload" is clicked
if(isset($_POST['submit'])) { 
    // This is the directory where images will be saved
    $target = $_SERVER['DOCUMENT_ROOT']."/gallery/";

    // This gets all the other information from the form
    $img_category = implode(',', $_POST['img_category']);
    $img_name = $_POST['img_name'];

    // Count the image files
    if(count($_FILES['img_file']['tmp_name'])) {
        // Loop through each file
        foreach ($_FILES['img_file']['tmp_name'] as $img_file) {
            // moves the image
            if(move_uploaded_file($img_file, $target)) {
                // if upload is a success query data into db 
                mysqli_query($conn, "INSERT INTO gallery_img (img_name, img_category, img_location) VALUES ('$img_name', '$img_category', '$img_file')") ;
                echo '<div class="alert alert-success margin-top">Your imags were successfuly uploaded.</div>';
            }
            else {
                echo '<div class="alert alert-danger margin-top">Sorry, there was a problem uploading your images.</div>';
            }
        }
    }
}
?>

<form class="form-horizontal" method="POST" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
<fieldset>

<!-- Form Name -->
<legend>Upload Image</legend>

<!-- Select Multiple -->
<div class="form-group">
      <label class="col-md-4 control-label" for="img_category">Category</label>
      <div class="col-md-4">
            <select id="img_category" name="img_category[]" class="form-control" multiple="multiple">
                  <option value="horror">Horror</option>
                  <option value="occult">Occult</option>
                  <option value="goth">Goth</option>
                  <option value="industrial">Industrial</option>
                  <option value="fashion">Fashion</option>
                  <option value="fetish">Fetish</option>
                  <option value="avante-garde">Avante-Garde</option>
                  <option value="cosplay">Cosplay</option>
                  <option value="nude">Nude</option>
            </select>
      </div>
</div>

<!-- Text input-->
<div class="form-group">
      <label class="col-md-4 control-label" for="img_name">Name:</label>  
      <div class="col-md-4">
      <input id="img_name" name="img_name" type="text" placeholder="Image Name" class="form-control input-md" required="">

      </div>
</div>

<!-- File Button --> 
<div class="form-group">
      <label class="col-md-4 control-label" for="img_file">Image</label>
      <div class="col-md-4">
            <input id="img_file" name="img_file[]" class="input-file" type="file" multiple>
      </div>
</div>

<!-- Button -->
<div class="form-group">
      <label class="col-md-4 control-label" for="submit">Ready?</label>
      <div class="col-md-4">
            <button type="submit" name="submit" class="btn btn-primary">Upload</button>
      </div>
</div>

</fieldset>
</form>


</div>

<?php include($_SERVER['DOCUMENT_ROOT'].'/php/footer.php'); ?>
当我选择多个类别,选择一个图像文件,并在文本框中输入文本时,不会向数据库添加任何内容,图像也不会上载到服务器

我只是得到了
抱歉,上传图像时出现问题。
错误


我的
gallery
目录确实具有
775
权限。

您的代码中几乎没有缺陷,例如:

  • 看这条线

    if(move_uploaded_file($img_file, $target)) { ...
    
    $target
    应该是指定目标文件名的字符串,而不应该是目录路径

  • 由于您正在服务器中上载图像,因此也没有必要将它们保存在数据库中。只需将图像上传到服务器并将路径保存到数据库中即可。因此,将
    img_location
    列的数据类型更改为
    VARCHAR

总的来说,您的代码应该如下所示:

if(isset($_POST['submit'])) { 
    $count = count($_FILES['img_file']['name']);

    for($i = 0; $i < $count; ++$i){
        $target = $_SERVER['DOCUMENT_ROOT']."/gallery/";
        $target = $target . basename($_FILES['img_file']['name'][$i]);

        $img_category = implode(",", $_POST['img_category']);
        $img_name = $_POST['img_name'];
        if(move_uploaded_file($_FILES['img_file']['tmp_name'][$i], $target)){
            mysqli_query($conn, "INSERT INTO gallery_img (img_name, img_category, img_location) VALUES ('$img_name', '$img_category', '$target')") ;
            echo '<div class="alert alert-success margin-top">Your imags were successfuly uploaded.</div>';
        }else {
            echo '<div class="alert alert-danger margin-top">Sorry, there was a problem uploading your images.</div>';
        }
    }
}
if(isset($_POST['submit']){
$count=count($_文件['img_文件']['name']);
对于($i=0;$i<$count;++$i){
$target=$\u服务器['DOCUMENT\u ROOT'].“/gallery/”;
$target=$target.basename($_文件['img_文件']['name'][$i]);
$img_category=内爆(“,”,$u POST['img_category');
$img_name=$_POST['img_name'];
如果(移动上传的文件($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\{
mysqli_查询($conn,“插入到库中_img(img_名称、img_类别、img_位置)值(“$img_名称”、“$img_类别”、“$target”);
echo“您的图像已成功上传”;
}否则{
echo“抱歉,上载图像时出现问题。”;
}
}
}

您的目标必须是一个目录:`$target=$\u SERVER['DOCUMENT\u ROOT'].“/gallery/”;`这可能是正确的,但您正在添加要上载到目标的文件,因此不再有目标目录。所以你需要删除这一行<代码>$target=$target。基本名称($_文件['img_文件']['tmp_名称'])删除它。重试上载。相同的结果。为什么
img_location
列的数据类型是
blob
?你还在服务器上上传文件吗?我读了一篇关于上传倍数的文章,建议使用
blob
@JesseElser。我在下面给出了答案。希望这能解决你的问题。这确实解决了一个问题。图像现在上传。然而,所有信息都没有输入数据库。@JesseElser啊,我有一个错误。我的第一点答案是错误的,它应该是
$img_category=introde(“,”,$_POST['img_category')。我已经更新了我的答案。现在数据正在输入,但是当我出于某种原因试图上传两张图片时,第二张图片会附加第一张图片的名称。也就是说,如果我上传了一张名为
house.jpg
的图片,而另一张名为
car.jpg
的图片,由于某种原因
car.jpg
会被重命名为
house.jpgcar.jpg
。虽然我会更新这个脚本,以重命名文件到文本框无论如何,一旦我明白了。例如,如果我在文本框
日落图像
中输入,则与该文本一起上载的任何图像都将重命名为
日落图像.jpg
和日落图像.jpg
这是因为这一行
$target=$target。基本名称($_文件['img_文件']['name'][$i])
,之前的
$target
值将追加到循环的当前迭代中。只需将此语句
$target=$\u SERVER['DOCUMENT\u ROOT'].“/gallery/”内部
用于
循环,您不会看到这种行为。我已经更新了我的答案。太好了。谢谢你的帮助。
if(isset($_POST['submit'])) { 
    $count = count($_FILES['img_file']['name']);

    for($i = 0; $i < $count; ++$i){
        $target = $_SERVER['DOCUMENT_ROOT']."/gallery/";
        $target = $target . basename($_FILES['img_file']['name'][$i]);

        $img_category = implode(",", $_POST['img_category']);
        $img_name = $_POST['img_name'];
        if(move_uploaded_file($_FILES['img_file']['tmp_name'][$i], $target)){
            mysqli_query($conn, "INSERT INTO gallery_img (img_name, img_category, img_location) VALUES ('$img_name', '$img_category', '$target')") ;
            echo '<div class="alert alert-success margin-top">Your imags were successfuly uploaded.</div>';
        }else {
            echo '<div class="alert alert-danger margin-top">Sorry, there was a problem uploading your images.</div>';
        }
    }
}