上传包含图片的对象 (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)的主要内容,如果未能解决你的问题,请参考以下文章
h5图片上传简易版(FileReader+FormData+ajax)
ThinkPHP6上传图片七牛云 如何上传文件到七牛云对象储存cos