我正在尝试上传并将图像存储在MySQL中,出于某种原因,我在提交照片时收到了破损的照片。我认为$ image = $ image-> fetch_object()存在问题;当我点击破碎的照片时,我收到以下错误消息:致命错误:在非对象上调用成员函数fetch_object()任何建议如何解决此问题
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload an Image</title>
</head>
<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
File:
<input type="file" name='image'/> <input type="submit" value="submit">
</form>
<?php
//connect to database
try{
$db = new mysqli('','','','');
}catch(Exception $e){
echo $e->getMessage();
}
if(isset($_FILES['image'])){
$file = $_FILES['image']['tmp_name'];//['tmp_name'] is the temporary location
}
if(!isset($file)){
echo 'please select an image';
}else{
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = $_FILES['image']['name'];
$image_size = getimagesize($_FILES['image']['tmp_name']);
if($image_size == false){
echo 'thats not an image';
}else{
$insert = $db->prepare("INSERT INTO store VALUES (?, ?, ?)");
$insert->bind_param('bsi', $image, $image_name, $image_size);
if(!$insert->execute()){
echo "Problem uploading file";
}else{
printf("%d Row inserted.\n", $insert->affected_rows);
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src=get.php?id=$lastid>';
}
}
}
?>
</body>
</html>
这是更新后的代码,我不再收到错误,但图片仍然没有损坏 的getMessage(); }
$id = $_REQUEST['id'];//request because we going to use it inside an image tag
$image = $db->prepare("SELECT * FROM store WHERE id=?");
$image->bind_param('s',$id);
if($image->execute()){
$image = $image->fetch();
}
$image = $image->image;
header('Content-type: image/jpeg');
echo $image;
?>
答案 0 :(得分:3)
对不起,我错过了重点。
以下代码无效:
不会评估第一个语句中的$image = $db->query('SELECT * FROM store WHERE id=$id'); $image = $image->fetch_object();
$ id,因为它是单引号中的字符串。
图像损坏的原因可能是使用addslashes()来屏蔽输入,即二进制数据。我会使用带参数的预准备语句并绑定输入数据。
旧答案
PHP-manual说(http://www.php.net/manual/en/features.file-upload.post-method.php):
默认情况下,文件将存储在服务器的默认临时文件中 目录,除非已经给出了另一个位置 php.ini中的upload_tmp_dir指令。
[...]
无论逻辑如何,您都应该从中删除文件 临时目录或将其移动到其他地方。
[...]
在使用之前,您应该使用move_uploaded_file()移动上传的文件。我也不鼓励在数据库中存储图像......
答案 1 :(得分:1)
您的保存脚本:
if(!$_FILES['image']['tmp_name']){
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = addslashes($_FILES['image']['name']);
$image_size = getimagesize($_FILES['image']['tmp_name']);
if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
echo "Problem uploading file";
}else{
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
}
}
这样当您需要图像时,您可以从数据库中获取数据并重新使用它。