2013-02-27 190 views
1

我目前正在研究一个图像上传脚本,但是在尝试将图像的详细信息存储到数据库时遇到了一个小问题。 上传表单抓取图像,检查其详细信息并获取图像的扩展名。这工作正常,但它不会将图像路径存储到数据库中。存储到数据库中 - 问题

这是代码的有问题的部分:

 $file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn; 
     echo $file_path; 

     try { 
      $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
      $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $sql = "UPDATE user SET img=$file_path WHERE userID = $username"; 
      $stmt = $con->prepare($sql); 
      $stmt->bindValue("file_path", $this->file_path, PDO::PARAM_STR); 
      $stmt->execute(); 

      if ($stmt->rowCount() > 0) { 
      echo ('Complete'); 
      } 
      else { 
      echo ('Error'); 
      } 
      }catch(PDOException $e) { 
      return $e->getMessage(); 
     } 
} 

现在我的理由“回声$ FILE_PATH;”有确保值正确传递,他们是。

它目前Echo的这一点,如果图像被上传:图片/资料/ f1b4edb293.jpg

所以一切工作正常,它只是failes在实际存储点。

现在为了进一步测试我甚至从FILE_PATH变量去除字符串和路径的细节,只是添加在那里e.g虚值:

$test = "test"; 
    $file_path = $test; 

果然,它的工作,并插入测试到数据库中。

所以这让我相信有一个与此格式的问题:

 $file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn; 

什么的一部分是从保存到数据库停止它的任何想法?

回答

1

您注射PHP字符串到您的SQL代码,从而产生不带引号的SQL字符串(和打开你的脚本SQL注入):

$file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn; 
$sql = "UPDATE user SET img=$file_path WHERE userID = $username"; 

如果var_dump($sql),你会看到你正在生成无效的SQL。 (我不知道为什么没有异常被抛出。)

然而,我们看到这个以后:

$stmt->bindValue("file_path", $this->file_path, PDO::PARAM_STR); 

所以我猜你知道预处理语句,但你混淆占位符语法(无论是:file_path?)与PHP的字符串插值($file_path)。同样,你应该得到一个异常,因为你绑定了一个不存在的参数: - ?

此外,您有$file_path$this->file_path。其中之一可能是一个错字。

您需要更换此:

$sql = "UPDATE user SET img=$file_path WHERE userID = $username"; 
$stmt = $con->prepare($sql); 
$stmt->bindValue("file_path", $this->file_path, PDO::PARAM_STR); 

...这一点:

$sql = "UPDATE user SET img=:file_path WHERE userID = :username"; 
$stmt = $con->prepare($sql); 
$stmt->bindValue("file_path", $file_path, PDO::PARAM_STR); 
$stmt->bindValue("username", $username, PDO::PARAM_STR); 
+0

是的,没有例外被抛出。运行var_dump,你是对的。我更新了查询,现在它成为一种魅力。我仍在学习PDO,所以我的方法还不完善。谢谢 – JPDP 2013-02-27 09:32:47

+0

@JPDP - 你在'catch()'块中有''get $ e-> getMessage();''。你真的检查返回值吗? – 2013-02-27 09:33:42

1

使用此代码

$sql = "UPDATE user SET img=:file_path WHERE userID = :username"; 
$stmt = $con->prepare($sql); 
$stmt->bindValue(":file_path", $file_path, PDO::PARAM_STR); 
$stmt->bindValue(":username", $username, PDO::PARAM_STR); 
$stmt->execute(); 
+0

试过,但是那部分工作正常。正如我所说的,如果我删除$ file_path元素并在其中添加单词Test,它将正确插入。这个问题似乎与这个格式有关:'images/profile /'。 substr(md5(time()),0,10)。 '' 。 $ file_extn; – JPDP 2013-02-27 09:17:55

+0

@JPDP这行'images/profile /'的输出是什么。 substr(md5(time()),0,10)。 '' 。 $ file_extn;'。 – 2013-02-27 09:24:15

0

你并不需要有一个像 '$ newfile中',即文件路径

$sql = "UPDATE user SET img='$file_path' WHERE userID = '$username'"; 

这是值得一试吗?