2012-09-23 51 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. 实际上你在重定向之前有“退出”。这是预期的吗?基本上,你说:“如果我有一个工作,有效的文件,停止,但如果我没有有效的文件,重定向到一个不存在的文件...

所以 - 大量的修复。不要隐藏错误,但在出现错误时给自己一些反馈意见。