在 PHP 和 SQL 中保存图像路径

Posted

技术标签:

【中文标题】在 PHP 和 SQL 中保存图像路径【英文标题】:Saving Image Path in PHP and SQL 【发布时间】:2019-06-24 01:51:30 【问题描述】:

我在一个项目中工作,我有一个产品表,我在其中为每个产品上传了一些图像 (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"  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">&times;</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">&times;</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”的声明,但我不知道为什么它错了。

希望能帮到我!

向大家致以最诚挚的问候!

【问题讨论】:

【参考方案1】:

最佳做法是仅将目录和产品名称保存在数据库中,然后将文件上传到文件夹以供以后检索。因此,使用良好实践值得称赞。

如您所料,问题在于您的应用无法识别该变量:

$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') ";

还要确保在执行数据库操作时使用prepared statement 以避免 SQL 注入。

【讨论】:

好的,我明白了,现在它似乎工作得更好了。但是现在,当我点击提交按钮时,它没有插入数据,没有任何反应。没有错误,什么都没有。 我认为它与 "if(isset($_FILES['imag1_prod']['name'])) "..... 它应该在哪里关闭?我编辑了你可以看到它完成的代码。 @CarlosAgustinGuanipaAlvarez:你能做到吗?如果你得到一个空白页,就会出现难以置信的错误。将此添加到页面顶部以报告错误:ini_set('display_errors', 1); ini_set('html_errors', 0);ini_set('log_errors',-1); error_reporting(E_ALL); 另外,文件上传到文件夹了吗? if(isset) 在插入语句的末尾关闭。 谢谢!你帮助真的帮助我!这很好,这就是 Ajax 的问题!我忘了提到,我必须更改为 formData 变量来获取 $_POST 和 $_FILES,而不仅仅是 $_POST。其余的,一切都好!谢谢!

以上是关于在 PHP 和 SQL 中保存图像路径的主要内容,如果未能解决你的问题,请参考以下文章

PHP和Ajax将文件路径上传到Mysql并将重命名的图像保存到文件夹失败

在 iOS 中使用 URL 将 Imageview 图像保存在 SQL 数据库中

使用 JSON 从 Android 发送 Base64 图像到 php webservice,解码,保存到 SQL

php 图像处理类

谁能告诉在 SQL 中存储图像的最佳方法是啥

我正在尝试将图像路径数据库和图像本身保存到项目中的文件夹[关闭]