使用php表单将图像上传到mysql


Uploading images to mysql using php form

我有这个表单可以将图片上传到我的mysql数据库:

<h4>Add Photo</h4>
<form enctype="multipart/form-data" method="post">
    <?php
    require_once 'config.php';
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if (isset($_POST['upload'])){
        $caption   = $_POST['caption'];
        $albumID   = $_POST['album'];
        $file      = $_FILES ['file']['name'];
        $file_type = $_FILES ['file']['type'];
        $file_size = $_FILES ['file']['size'];
        $file_tmp  = $_FILES ['file']['tmp_name'];
        $random_name = rand();
        if (empty($file)){
            echo "Please enter a file <br>";
        } else {
            move_uploaded_file($file_tmp, 'uploads/'.$random_name.'.jpg');
            mysqli_query(
                $mysqli,
                "INSERT INTO photos (caption, image_url, date_taken, imageID) "
                . "VALUES('"
                . addslashes($caption) . "', '"
                . $random_name . ".jpeg', NOW(), ?)"
            );
            echo "Photo successfully uploaded!<br>";
        }
    }
    ?>
    Caption: <br>
    <input type="text" name="caption">
    <br><br>
    Select Album: <br>
    <select name="album">
    <?php
    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $result = $mysqli->query("SELECT * FROM albums");
    while ($row = $result->fetch_assoc()) {
        $albumID = $row['albumID'];
        $title   = $row['title'];
        echo "<option value='$albumID'>$title</option>";
    }
    ?>
    </select>
    <br><br>
    Select Photo: <br>
    <input type="file" name="file">
    <br><br>
    <input type="submit" name="upload" value="Upload">
</form>

我可以成功地将图片上传到服务器上的"上传"文件夹,但数据库上的"照片"表中没有添加任何内容。我的照片文件夹的架构是:标题,image_url,date_taken,imageID

我的结构有什么问题吗?mysqli代码?任何帮助都将不胜感激!提前谢谢!

正如Fred-ii所提到的,问题是您使用"?"作为列imageID的值,但您没有使用准备好的语句。你没有检查错误,但如果你检查了,你会得到这样的东西:

您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,了解在"?"附近使用的正确语法在xx行

此外,您使用addslash将用户数据获取到查询中,这是不安全的(您应该使用mysqli_real_escape_string)。

解决这两个问题的一个好办法是使用事先准备好的语句。你应该这样做:

    move_uploaded_file($file_tmp, 'uploads/'.$random_name.'.jpg');
    $ret = mysqli_prepare($mysqli, "INSERT INTO photos (caption, image_url, date_taken)
    VALUES(?, ?, NOW())");
    $filename = $random_name + ".jpeg";
    mysqli_stmt_bind_param($ret, "ss", $caption, $filename);
    mysqli_stmt_execute($ret);
    echo "Photo successfully uploaded!<br>";

更新:由于id是自动生成的,我从查询中完全删除了该列。