【问题标题】:Uploading images to mysql using php form使用php表单将图像上传到mysql
【发布时间】:2015-05-25 18:40:21
【问题描述】:

我有这个表格可以上传图片到我的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代码? 任何帮助将不胜感激!提前谢谢!

【问题讨论】:

  • 您在值中使用? 作为占位符。那是prepared statements 语法,你没有为此做任何准备。将or die(mysqli_error($mysqli)) 添加到mysqli_query() 并找出失败的原因。您会看到语法错误。

标签: php mysql mysqli image-uploading


【解决方案1】:

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

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 xx 行的 '?)' 附近使用正确的语法

此外,您正在使用 addlashes 将用户数据放入查询中,这是不安全的(您应该使用 mysqli_real_escape_string instead)。

这两个问题的一个很好的解决方案是使用准备好的语句。你可以这样做:

    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 是自动生成的,我从查询中完全删除了该列。

【讨论】:

  • Which is what I said 16 mins. prior to this.。所以,谁知道 OP 想为他们的imageID 列使用什么。
  • 你是对的,我添加了一个当之无愧的参考。确实,我们不知道该列可能是什么,但是添加一个完整的示例以便他可以看到使用准备好的语句的代码看起来会很有用。
  • 我们来看看 OP 怎么说。很难说他们是否看过你的回答/我的评论。时间会证明一切的 ;-)
  • 非常感谢您的帮助!我的 imageID 列是一个整数,我设置为 auto_increment。我应该如何处理代码?是一样的还是我需要更改您发布的代码? @Anxo
  • 我更新了示例的外观。基本上,您只需从查询中删除该列。不提它意味着它获得了默认值,即自动生成的值。
猜你喜欢
  • 2020-10-10
  • 2018-08-26
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2016-05-28
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多