2012-09-23 80 views
0

我正在尋找存儲照片並從數據庫中檢索它,但我遇到了麻煩。我查看了其他帖子,但找不到解決方案。照片正在上傳到數據庫,但我似乎無法將其退出。另外,在url中,$ id = 0 但即使當我將$ id更改爲相應的數據庫編號時,它仍然只是加載一個空白頁面...我知道這是很多代碼,所以任何響應都會不勝感激!!存儲和檢索數據庫中的照片

CHOOSE_PHOTO.PHP

<form enctype="multipart/form-data" action="process_photo.php" method="POST"> 
<input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
Choose a file to upload: <input name="image" type="file" /><br /> 
<input type="submit" value="Upload File" /> 
</form> 

PROCESS_PHOTO.PHP

MY_LOGIN_INFO_AND_DATABASE_CONNECTION 

if ($_FILES) { 
    $image_types = array 
    ("image/bmp", 
    "image/jpeg", 
    "image/pjpeg", 
    "image/gif", 
    "image/x-png"); 
if (is_uploaded_file ($_FILES["image"]["tmp_name"])) { 
    $image = addslashes (fread 
     (fopen ($_FILES["image"]["tmp_name"], "r"), 
     filesize ($_FILES["image"]["tmp_name"]))); 
$file_name = $_FILES["image"]["name"]; 
$file_size = $_FILES["image"]["size"]; 
$file_type = $_FILES["image"]["type"]; 
if (in_array (strtolower ($file_type), $image_types)) { 
    $sql = "INSERT INTO image_table " 
    . "(image_type, image, image_size, image_name, image_date) "; 
    sql.= "VALUES ("; 

    $sql.= "'{$file_type}', '{$image}', '{$file_size}', " 
    . "'{$file_name}', NOW())"; 
    @mysql_query ($sql, $conn); 

exit(); 
    } 
} 
} 


$id = mysql_insert_id($conn); 

mysql_close($conn); 

header("Location: photo_preview.php?id=$id"); 

PHOTO_PREVIEW.PHP

MY_LOGIN_INFO_AND_DATABASE_CONNECTION 

$result = mysql_query("SELECT * FROM image_table WHERE image_id= " 
. mysql_real_escape_string($_GET["id"]), $conn); 

if(!$result) die(mysql_error()); 

$row = mysql_fetch_assoc ($result); 


    if (mysql_num_rows($result) > 0) 
    { 
    $row = @mysql_fetch_assoc ($result); 
    $image_type = $row["image_type"]; 
    $image = $row["image"]; 
    Header ("Content-type: $image_type"); 
    print $image; 
    } 
?> 

回答

0

基本上,你的假設一切都去上班 - 但它不工作。採取相反的做法,並假設一切都會失敗 - 就像它總是會這樣。一旦你寫完了,複製並粘貼你的下一個項目。然後,當發生意外事件時,你有代碼來告訴你究竟是什麼。

幾個問題:

  1. 你不正確的 「逃離」 進入數據庫。你可以使它與「add_slashes」一起工作,但你應該使用mysql_real_escape_string()來使所有的sting輸入安全。更好的是,使用PDOmysqli_()函數的準備好的語句,因爲mysql_()函數將被折舊。使用準備好的語句將自動逃離字符串並使其安全。

  2. 您可以隱藏所有的錯誤,你的SQL插入 - 「@mysql_query()」,並沒有檢查,如果它的工作與否。你要if (!mysql_query()) {' then show errors (use 'mysql_error())。這可能是你錯誤的地方 - 輸入失敗,你不檢查原因。

  3. 你也不會檢查你的「FREAD」和「的fopen」等方面的工作。他們可能有錯誤。使用'file_get_contents()'並檢查返回值 - 它很整潔。如果返回false,則失敗 - 顯示錯誤以解決原因。

  4. 你實際上並沒有檢查文件是否正確上傳。檢查$ _FILES [「圖像」] [「錯誤」]爲大於零的東西。

  5. SELECT你假設已找到該行 - 但如果它不是(例如某人給你一個不好的ID),那麼$行將是假的(你得到其他錯誤)。因此,在繼續之前,請檢查$ row是一個數組而不是false。

  6. 如果圖像類型不匹配沒有錯誤消息(的in_array)。你繼續研究,使用一個不存在的ID並重定向到一定會失敗的頁面(見第5點)。

  7. 實際上你在重定向之前有「退出」。這是預期的嗎?基本上,你說:「如果我有一個工作,有效的文件,停止,但如果我沒有有效的文件,重定向到一個不存在的文件...

所以 - 大量的修復。不要隱藏錯誤,但在出現錯誤時給自己一些反饋意見。