将图像路径插入数据库

时间:2018-03-09 00:20:33

标签: php mysqli prepared-statement

我一直在创建一个网站,对于一个uni项目,我的代码被指出是易受攻击的,因为我没有使用准备好的语句进行SQL注入。我正在纠正这个问题,而且我已经碰到了墙,并上传了图片。当我刚刚使用标准的MYSQLi查询时,我理解它被分配给变量的方式,现在因为我使用占位符和绑定参数,我有点迷失。最初我无法将图像放到目录中,尽管我现在通过阅读论坛解决了这个问题。现在我的图像路径没有存储在数据库中,我已经尝试了很多东西来让它工作并在论坛中广泛阅读。我只是无法在MYSQLi中使用Prepare Statement获取图像上传的示例。希望有人可以指出我正确的方向,所以我理解得更好。

if(isset($_POST['add_product'])) {

    $destination = "C:/Ampps/www/Adaptive_Dev/images/".$_FILES['image']['name'];

    move_uploaded_file($_FILES['image']['tmp_name'], $destination);

    print_r($_FILES);

    $stmt = $connection->prepare("INSERT INTO products
                                (productBrand,
                                productModel,
                                productModelNo,
                                productPrice,
                                productDesc,
                                productSpec,
                                productInTheBox,
                                productGuarantee,
                                productImage)
                                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("sssdsssis",
        $_POST['productBrand'],
        $_POST['productModel'],
        $_POST['productModelNo'],
        $_POST['productPrice'],
        $_POST['productDesc'],
        $_POST['productSpec'],
        $_POST['productInTheBox'],
        $_POST['productGuarantee'],
        $_FILES['ProductImage'] );
    $stmt->execute();

我暂时将列设置为接受空值,因此数据会传递到数据库。我试图在图像中放置一个变量'占位符位置,它抛出了所有类型的错误。我只是不知道如何将它传递给绑定参数。

Array ( [image] => Array ( [name] => b&oM5Banner.jpg [type] => image/jpeg [tmp_name] => C:\Ampps\tmp\phpB39.tmp [error] => 0 [size] => 269481 ) )

我已将print_r结果放在此处,我真的不知道我能提供什么其他信息,我显然做错了什么,我无法解决问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您的错误相当明显,与准备好的陈述无关。

你说这个

  

我暂时将列设置为接受空值,

为什么要这样做,因为它告诉你什么是错的。您提供的路径为空。听取警告和错误通常是一个好主意,因为他们会告诉你在哪里看。

此外,如果您启用了错误报告,那么您应该收到使用未定义索引的警告。你可以这样打开它:

<?php
    error_reporting(-1);
    ini_set('display_errors', 1);

但回到手头的问题,让我们看一下你为图像路径投入的内容:

   $_FILES['ProductImage']

在最好的情况下,这是一个数组,而不是路径(字符串)。 $_FILES数组是PHP中的超级全局数组,它有一个特殊用途。也就是说,此数组包含有关通过HTTP上载的文件的信息。您应该知道这一点,因为您使用它来移动文件来自&#34; temp&#34;文件夹到永久的家。

所以解决方案真的非常简单。只需使用$destination变量,这是放置文件的路径。您可以在此处看到代码中使用的内容:

  move_uploaded_file($_FILES['image']['tmp_name'], $destination);

只是详细说明,$_FILES超级全局数组的内容示例如下:

 $_FILES = [
      'image' => [
            'name' => 'b&oM5Banner.jpg',
            'type' => 'image/jpeg',
            'tmp_name' => 'C:\Ampps\tmp\phpB39.tmp',
            'error' => 0, 
            'size' => 269481
       ],
 ];
  //I know this because you output it with print_r

因此,当您尝试使用$_FILES['ProductImage']时,难道它不起作用吗?

希望有助于解释发生的事情以及如何解决问题。

干杯。

答案 1 :(得分:1)

$destination似乎不存在,但您确实使用路径创建了一个名为if(isset($_POST['add_product'])) { $destination = "C:/Ampps/www/Adaptive_Dev/images/".$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], $destination); print_r($_FILES); $stmt = $connection->prepare("INSERT INTO products (productBrand, productModel, productModelNo, productPrice, productDesc, productSpec, productInTheBox, productGuarantee, productImage) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("sssdsssis", $_POST['productBrand'], $_POST['productModel'], $_POST['productModelNo'], $_POST['productPrice'], $_POST['productDesc'], $_POST['productSpec'], $_POST['productInTheBox'], $_POST['productGuarantee'], //$_FILES['ProductImage'] ); $destination ); $stmt->execute(); 的变量,所以我假设你应该使用它。

ini_set('display_errors', 1); 
ini_set('log_errors',1); 
error_reporting(E_ALL); 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  

将来测试时将这些行添加到脚本的顶部,并且错误将显示在浏览器上,即使您正在开发错误发送关闭,如托管站点。

$('input:checkbox').change(function(){
if ($(this).is(':checked')) {
    var targetClass = $(this).parent().prop('class');

    $('.'+targetClass).each(function(i) {
    	
    	$(this).children("input[type='checkbox']").prop('checked', false);
    });         
    $(this).prop('checked', true);
}   
});