繁体   English   中英

从数据库存储和检索照片

[英]Storing and retrieving photo from database

我想存储一张照片并从数据库中检索它,但是遇到了麻烦。 我浏览了其他帖子,但找不到解决方案。 照片正在上传到数据库,但我似乎无法将它们撤回。 另外,在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;
   } 
?>

基本上,您假设一切都会正常工作-但它没有工作。 采取相反的方法,并假设一切都会失败-总是会失败。 编写完成后,复制并粘贴下一个项目。 然后,当发生意外情况时,您可以在其中找到确切的代码。

几个问题:

  1. 您没有正确地将条目“转义”到数据库中。 您可以使它与“ add_slashes”一起使用,但应使用mysql_real_escape_string()使所有字符串输入安全。 更好的是,将准备好的语句与PDOmysqli_()函数一起使用,因为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将为false(并且您会遇到其他错误)。 因此,在继续之前,请检查$ row是一个数组,而不是false。

  6. 如果图像类型不匹配( in_array ),则没有错误消息。 继续耕作,使用不存在的ID,然后重定向到注定会失败的页面(请参阅第5点)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM