【问题标题】:MySQL server has gone away when upload image larger than 1.0MB上传大于 1.0MB 的图片时 MySQL 服务器已消失
【发布时间】:2013-10-25 05:18:12
【问题描述】:

我在上传大小为 1.5MB 的图像时收到警告,并且图像没有存储到数据库中,它适用于小于 1MB 的图像。

请帮忙,因为我在这些警告中坚持了几天。

这是我的代码:

<?php

print_r($_FILES);

//connect to the database//

try {
$pdo = new PDO('mysql:host=localhost;dbname=forms1', 'root', 'root',array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$file = $_FILES['image']['tmp_name']; 

$upload=0;

for($count = 0; $count < count($_FILES['image']); $count++)
{
if(!empty($_FILES['image']['name'][$count])){
$image_name[$count] = addslashes($_FILES['image']['name'][$count]); echo '<br \>';
$image_size[$count] = @getimagesize($_FILES['image']['tmp_name'][$count]);
$error[$count] = $_FILES['image']['error'][$count];

if($image_size[$count] == FALSE  || ($image_size[$count]) == 0)
    echo "That's not an image";

$upload++;
echo $upload;

// Temporary file name stored on the server
 $tmpName[$count]  = $_FILES['image']['tmp_name'][$count];

// Read the file
$fp[$count]   = fopen($tmpName[$count], 'r');
$data[$count] = fread($fp[$count], filesize($tmpName[$count]));
$data[$count] = addslashes($data[$count]);
fclose($fp[$count]);

// Create the query and insert into database.

$stmt = $pdo->prepare('INSERT INTO files (name,image) VALUES (:name,:image)');
$stmt->execute(array('name' => $image_name[$count],'image' => $data[$count]));

    if(!$stmt)
    echo "Problem uploding the image. Please check your database";  
}
}
} catch (PDOException $e) {
print "Error!: " . $e->getMessage();
die();
}

?>

这些是我收到的警告:

Warning: PDOStatement::execute(): MySQL server has gone away in C:\xampp\htdocs\testing\test.php on line 56

Warning: PDOStatement::execute(): Error reading result set's header in C:\xampp\htdocs\testing\test.php on line 56

此行的警告点:

$stmt->execute(array('name' => $image_name[$count],'image' => $data[$count]));

【问题讨论】:

  • 你检查过php.ini文件。你可以在那里增加上传大小。
  • 不要在数据库中存储文件。
  • @YourCommonSense 是对的。只需将图像的引用存储在您的数据库中即可。

标签: php html mysql pdo


【解决方案1】:

答案很简单:

不要将文件存储在数据库中。

这样你一次解决的不是一个而是十几个问题。
只是因为关系数据库不是存放二进制文件的地方。

您收到的这条错误消息是一个警告标志,上面写着:“您正在给您的服务器带来巨大的不必要负载”。当您需要恢复文件时,这种负载甚至会增加。

虽然存储在文件系统中,但二进制文件不会妨碍任何人,而且 - 最重要的是 - 服务速度极快,不会花费您宝贵的资源

【讨论】:

  • 感谢您的回答。但是您能否指导我或为我提供有关如何上传和检索图像的最佳解决方案?我可以参考任何链接或示例代码吗?
  • 据我所知,它通常非常简单,以至于没有人为任何教程而烦恼。只需创建一个目录来存储文件,然后使用move_uploaded_file() 将上传的文件移动到那里,将 filename 存储在数据库中。然后当您需要向用户展示它时 - 只需像这样链接它&lt;img src = '/images/$stored_filename'&gt; - 就是这样
  • @alvin890101 发生这种情况的真正答案是dev.mysql.com/doc/refman/5.7/en/packet-too-large.html 默认为 1 Mb .. 但是使用数据库作为文件系统是不好的.. 但是文件系统确实尊重 innodb 的回滚,所以你可以有你自己需要处理的幻影文件..“你的常识”,但对于这个答案仍然 +1
【解决方案2】:

虽然将图像存储在Database 中会增加服务器负载。这也不是一个好习惯。您必须将图像存储在一个文件夹中,并将该图像的路径或名称存储在您的Database 中。重要的是在这种情况下,您必须考虑的是,您必须提供一些方法来唯一标识每个图像。否则,具有相同名称的图像将被您文件夹中的新图像替换。

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2012-09-12
    • 2012-05-25
    • 2011-06-07
    • 2010-12-20
    相关资源
    最近更新 更多