2013-02-27 53 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'"; 

這是值得一試嗎?