存储和检索数据库中的照片
我正在寻找存储照片并从数据库中检索它,但我遇到了麻烦。我查看了其他帖子,但找不到解决方案。照片正在上传到数据库,但我似乎无法将其退出。另外,在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;
}
?>
基本上,你的假设一切都去上班 - 但它不工作。采取相反的做法,并假设一切都会失败 - 就像它总是会这样。一旦你写完了,复制并粘贴你的下一个项目。然后,当发生意外事件时,你有代码来告诉你究竟是什么。
几个问题:
你不正确的 “逃离” 进入数据库。你可以使它与“add_slashes”一起工作,但你应该使用mysql_real_escape_string()来使所有的sting输入安全。更好的是,使用
PDO
或mysqli_()
函数的准备好的语句,因为mysql_()
函数将被折旧。使用准备好的语句将自动逃离字符串并使其安全。您可以隐藏所有的错误,你的SQL插入 - “@mysql_query()”,并没有检查,如果它的工作与否。你要
if (!mysql_query()) {' then show errors (use 'mysql_error()
)。这可能是你错误的地方 - 输入失败,你不检查原因。你也不会检查你的“FREAD”和“的fopen”等方面的工作。他们可能有错误。使用'file_get_contents()'并检查返回值 - 它很整洁。如果返回false,则失败 - 显示错误以解决原因。
你实际上并没有检查文件是否正确上传。检查$ _FILES [“图像”] [“错误”]为大于零的东西。
与
SELECT
你假设已找到该行 - 但如果它不是(例如某人给你一个不好的ID),那么$行将是假的(你得到其他错误)。因此,在继续之前,请检查$ row是一个数组而不是false。如果图像类型不匹配没有错误消息(的
in_array
)。你继续研究,使用一个不存在的ID并重定向到一定会失败的页面(见第5点)。实际上你在重定向之前有“退出”。这是预期的吗?基本上,你说:“如果我有一个工作,有效的文件,停止,但如果我没有有效的文件,重定向到一个不存在的文件...
所以 - 大量的修复。不要隐藏错误,但在出现错误时给自己一些反馈意见。