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;
   } 
?>
4

1 回答 1

0

基本上,您假设一切正常 - 但它不起作用。采取相反的方法,假设一切都会失败——因为它总是会失败。编写完成后,复制并粘贴到您的下一个项目中。然后,当发生意外情况时,您有代码可以准确地告诉您发生了什么。

几个问题:

  1. 您没有正确地将条目“转义”到数据库中。您可以使用“add_slashes”使其工作,但您应该使用 mysql_real_escape_string() 来确保所有 sting 输入安全。更好的是,使用带有PDOormysqli_()函数的准备好的语句,因为mysql_()函数要折旧。使用准备好的语句将自动转义字符串并使其安全。

  2. 您使用 sql 插入隐藏所有错误 - '@mysql_query()',并且不检查它是否有效。你万if (!mysql_query()) {' then show errors (use 'mysql_error())。这可能是您出错的地方 - 输入失败并且您没有检查原因。

  3. 您也不会检查您的“fread”和“fopen”等工作。他们可能有错误。使用 'file_get_contents()' 并检查返回值 - 它更整洁。如果它返回 false 则失败 - 显示错误以找出原因。

  4. 您实际上并没有检查文件是否正确上传。检查 $_FILES["image"]["error"] 是否大于零。

  5. 随着SELECT你假设该行已经找到 - 但如果它不是(例如,有人给你一个狡猾的 id)那么 $row 将是错误的(你有其他错误)。所以在继续之前检查 $row 是一个数组而不是 false。

  6. 如果图像类型不匹配(in_array),则不会出现错误消息。您继续前进,使用不存在的 ID 并重定向到注定会失败的页面(参见第 5 点)。

  7. 您实际上在重定向之前有“退出”。这是预期的吗?您基本上是说“如果我有一个有效的有效文件,请停止,但如果我没有有效文件,请重定向到不存在的文件...

所以 - 很多要修复。不要隐藏错误,而是在出现错误时给自己一些反馈。

于 2012-09-23T07:11:09.373 回答