php - 在 PHP 和 SQL 中保存图像路径
问题描述
我在一个项目中工作,我有一个产品表,我在其中为每个产品上传了一些图像 (3)。我正在处理上传文件的问题,因为在数据库中只保存 dir 而不是 file 。使用此代码和图像,我可以更好地解释它。我只想上传文件并将其保存路径,以便稍后在产品布局页面和其他页面中显示它。
这是我的 HTML:
<div class="col form-group">
<label class="form-label" for="imag1_prod"><b>Imagen 1: </b></label>
<input type="file" class="filestyle" id="imag1_prod" name="imag1_prod" alt="Imagen del Producto 1" data-btnClass="btn-primary">
</div>
我在 CRUD 中工作,我通过模态添加产品。
接下来,我的 PHP:编辑后的代码
<?php
require_once ("../paginas/conexion_bd.php"); //Contiene Funcion que Conecta a la Base de Datos
// escaping, additionally removing everything that could be (html/javascript-) code
if(isset($_FILES['imag1_prod']['name'])) {
//post variables
$ident_prod = mysqli_real_escape_string($con,(strip_tags($_POST["ident_prod"],ENT_QUOTES)));
$ident_cate = mysqli_real_escape_string($con,(strip_tags($_POST["ident_cate"],ENT_QUOTES)));
$nombr_prod = mysqli_real_escape_string($con,(strip_tags($_POST["nombr_prod"],ENT_QUOTES)));
$desco_prod = mysqli_real_escape_string($con,(strip_tags($_POST["desco_prod"],ENT_QUOTES)));
$desla_prod = mysqli_real_escape_string($con,(strip_tags($_POST["desla_prod"],ENT_QUOTES)));
$preci_prod = mysqli_real_escape_string($con,(strip_tags($_POST["preci_prod"],ENT_QUOTES)));
$pesoo_prod = mysqli_real_escape_string($con,(strip_tags($_POST["pesoo_prod"],ENT_QUOTES)));
$taman_prod = mysqli_real_escape_string($con,(strip_tags($_POST["taman_prod"],ENT_QUOTES)));
$stock_prod = mysqli_real_escape_string($con,(strip_tags($_POST["stock_prod"],ENT_QUOTES)));
$estad_prod = mysqli_real_escape_string($con,(strip_tags($_POST["estad_prod"],ENT_QUOTES)));
//get filename
$filename = $_FILES['imag1_prod']['name'];
//rename file
$temp = explode(".", $_FILES["imag1_prod"]["name"]);
$newfilename = round(microtime(true)) . '.' . end($temp);
//set path
$target_dir = "../imagen/productos/";
//upload files in folder
move_uploaded_file($_FILES['imag1_prod']['tmp_name'], "$target_dir/$newfilename");
//rename file with directory name
$filenamedirectory = $target_dir/$newfilename;
$statu_prod = 1;
// Registrar en la Base de Datos
$sql = "INSERT INTO tabma_prod(ident_prod, ident_cate, nombr_prod, desco_prod, desla_prod, preci_prod, pesoo_prod, taman_prod, stock_prod, estad_prod, imag1_prod, statu_prod) VALUES ('$ident_prod',(SELECT ident_cate FROM tabma_cate WHERE ident_cate = '$ident_cate'),'$nombr_prod','$desco_prod','$desla_prod','$preci_prod','$pesoo_prod','$taman_prod','$stock_prod','$estad_prod','$filenamedirectory','$statu_prod') ";
$query = mysqli_query($con,$sql);
// Si ha sido Agregado Exitosamentee
if ($query) {
$messages[] = "El producto ha sido registrado con éxito.";
} else {
$errors[] = "Lo sentimos, el registro falló. Por favor, regrese y vuelva a intentarlo.";
}
}
if (isset($errors)){
?>
<div class="alert alert-danger" role="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Error!</strong>
<?php
foreach ($errors as $error) {
echo $error;
}
?>
</div>
<?php
}
if (isset($messages)){
?>
<div class="alert alert-success" role="alert">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>¡Bien hecho!</strong>
<?php
foreach ($messages as $message) {
echo $message;
}
?>
</div>
<script type="text/javascript">
$(".alert").delay(2000).slideUp(200, function() {
$(this).alert('close');
});
</script>
<?php
}
它旨在为每个产品上传 3 张图片,但目前只有一张用于测试。
现在,一些关于它的外观和错误的图像:
这里是已经保存在数据库中的内容:
看到这个,错误必须与“imag1_prod”的声明有关,但我不知道为什么它错了。
希望能帮到我!
向大家致以最诚挚的问候!
解决方案
最佳做法是仅将目录和产品名称保存在数据库中,并将文件上传到文件夹以供以后检索。因此,使用良好实践值得称赞。
如您所料,问题在于您的应用程序无法识别变量:
$imag1_prod=$_FILES["imag1_prod"][ "name" ];
因为你在这里重命名它:
move_uploaded_file($_FILES["imag1_prod"][" tmp_name "]
这里的另一个问题是您忘记存储文件名和目录。
试试这个 :
if(isset($_FILES['imag1_prod']['name'])) {
//post variables
$ident_prod = mysqli_real_escape_string($con,(strip_tags($_POST["ident_prod"],ENT_QUOTES)));
$ident_cate = mysqli_real_escape_string($con,(strip_tags($_POST["ident_cate"],ENT_QUOTES)));
$nombr_prod = mysqli_real_escape_string($con,(strip_tags($_POST["nombr_prod"],ENT_QUOTES)));
$desco_prod = mysqli_real_escape_string($con,(strip_tags($_POST["desco_prod"],ENT_QUOTES)));
$desla_prod = mysqli_real_escape_string($con,(strip_tags($_POST["desla_prod"],ENT_QUOTES)));
$preci_prod = mysqli_real_escape_string($con,(strip_tags($_POST["preci_prod"],ENT_QUOTES)));
$pesoo_prod = mysqli_real_escape_string($con,(strip_tags($_POST["pesoo_prod"],ENT_QUOTES)));
$taman_prod = mysqli_real_escape_string($con,(strip_tags($_POST["taman_prod"],ENT_QUOTES)));
$stock_prod = mysqli_real_escape_string($con,(strip_tags($_POST["stock_prod"],ENT_QUOTES)));
$estad_prod = mysqli_real_escape_string($con,(strip_tags($_POST["estad_prod"],ENT_QUOTES)));
//get filename
$filename = $_FILES['imag1_prod']['name'];
//rename file
$temp = explode(".", $_FILES["imag1_prod"]["name"]);
$newfilename = round(microtime(true)) . '.' . end($temp);
//set path
$target_dir = "../imagen/productos/";
//upload files in folder
move_uploaded_file($_FILES['imag1_prod']['tmp_name'], "$target_dir/$newfilename");
//rename file with directory name
$filenamedirectory = $target_dir/$newfilename;
$statu_prod = 1;
// Registrar en la Base de Datos
$sql = "INSERT INTO tabma_prod(ident_prod, ident_cate, nombr_prod, desco_prod, desla_prod, preci_prod, pesoo_prod, taman_prod, stock_prod, estad_prod, imag1_prod, statu_prod)
VALUES ('$ident_prod',(SELECT ident_cate FROM tabma_cate WHERE ident_cate = '$ident_cate'),'$nombr_prod','$desco_prod','$desla_prod','$preci_prod','$pesoo_prod','$taman_prod','$stock_prod','$estad_prod','$filenamedirectory','$statu_prod') ";
}
还要确保在执行数据库操作时使用准备好的语句来避免 SQL 注入。
推荐阅读
- python-3.x - 想要一个具有最大总和的子集代码的失败测试用例,以便其中没有两个元素彼此相邻
- java - 如何使用 Axis 1 在 Tomcat 7 中解决此 LinkageError
- r - 需要帮助将匹配因子转换为向量以创建虚拟变量
- python - Django 通道 2 异步检索数据并将数据保存到数据库
- git - 如何使用 GIT 同步计算机和笔记本电脑之间的项目?
- ios - CVPixelBuffer 到 CGImage 并按比例缩小
- xaml - Xamarin Forms Label & Entry on one line using XAML
- sql - 条件 Where 语句
- python - 为什么比较浮点结果时循环不开始?
- python - 比较每一行的数据框列中的元素 - Python