上传包含图片的对象 (PHP/Html)

Posted

技术标签:

【中文标题】上传包含图片的对象 (PHP/Html)【英文标题】:Upload object including image (PHP/Html) 【发布时间】:2021-11-19 23:18:22 【问题描述】:

我正在尝试创建一种将带有数据的图像上传到我的服务器的方法。我已成功将图像移至服务器文件夹,但数据不会插入数据库。

这是一个网页,它有一个填写和选择文件的表格,还建立了与 DB 的连接:

<?php
session_start();
    include("shopconnection.php");
    include("shopfunctions.php");

    $user_data = check_admin($con);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../Presidio-Plants/style.css">
    <link rel="stylesheet" href="../public/shopitem.css">
    
    <title>Presidio Plants | Shop</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <div class="header">
    </div>
    <div class="navbar">
        <nav>
            <ul>
              <li><a href="index.html">Home</a></li>
              <li><a href="gardening.html" class="active">Gardening Forum</a></li>
              <li><a href="plant_exchange.html">Plant Exchange</a></li>
              <li><a href="about.html">About</a></li>
              <li><a href="login.html">Log in</a></li>
            <li><a href="signup.html">Sign up</a></li>
            </ul>
        </nav>
    </div>
    <!-- Shop upload area -->
    <div id="upload-container">
        <!--div to contain form for css purposes-->
        <div id="data">
            <!--form input-->
            <form action="upload.php" method="POST" enctype="multipart/form-data">
                <label for="plantimage">Plant Image:</label><br>
                <input type="file" id="plantimage" name="plantimage"/><br>
                <label for="plantName">Plant name:</label><br>
                <input type="text" id="plantName" name="plantName"/><br>
                <label for="price">Price:</label><br>
                <input type="text" id="price" name="price"/><br>
                <label for="description">Description:</label><br>
                <input type="text" id="description" name="description"/><br>
                <button type="submit" name="upload">Add to Shop</button>



            </form>

        </div>
        
    </div>

</body>
</html>

这是 shopconnection.php:

<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "admin_list";

if(!$con = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname))

    die("failed to connect");

最后上传.php文件:

<?php
/* if submit is clicked*/
if ($_SERVER['REQUEST_METHOD'] == "POST")
    $plantimage = $_FILES['plantimage'];
    $plantname = $_POST['plantName'];
    $plantprice = $_POST['price'];
    $plantdesc = $_POST['description'];

    $fileExt = explode('.',$_FILES['plantimage']['name']);
    $fileActualExt = strtolower(end($fileExt));

    /* create filename for image */
    $imagename = $plantname.".".$fileActualExt;
    $destination = 'items/'.$imagename;

    /* SAVE IMAGE TO DB */
    move_uploaded_file($_FILES['plantimage']['tmp_name'], $destination);

    /* PUSH OBJECT VALUES TO DB TABLE */
    $query = "INSERT INTO plants (imgloc,plantname,price,desc) VALUES ('$destination','$plantname','$plantprice','$plantdesc');";
    mysqli_query($con, $query);
    header("Location: shopupload.php?fileuploaded");
    die();

【问题讨论】:

确保打开 PHP 和 MySQL 错误报告。在进行此类工作时,您的代码应该停在问题行。例如,如果数据没有进入数据库,请不要执行重定向或死机,只需让您的代码继续运行,并可能将变量转储出来查看。可能会显示错误,并且您正在使用重定向丢失它 除了@ChrisHaas 评论,请在将其插入数据库之前使用 PDO 或至少转义用户发布的数据。现在您的代码容易受到 SQL 注入的攻击。 检查您的插入查询!双引号中有分号 感谢您的提示,我发现问题有两个方面:a)未建立从输入页面上传的连接,b)我在数据库中有一个标题为 desc 的列,它搞砸了查询 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! 【参考方案1】:

我发现问题是双重的:

    未建立从输入页面上传的连接。 我在数据库中有一个标题为 desc 的列,它搞砸了 查询,因为它是一个关键字。

【讨论】:

以上是关于上传包含图片的对象 (PHP/Html)的主要内容,如果未能解决你的问题,请参考以下文章

jQuery:[1]实现图片上传并预览

如何等待值然后返回一个对象

h5图片上传简易版(FileReader+FormData+ajax)

ThinkPHP6上传图片七牛云 如何上传文件到七牛云对象储存cos

玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传

html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题