我正在通过 PHP 将文件上传到 MySql DB。
我能够上传最大 1MB 的文件(通过反复试验发现)。
大小超过 1 MB 的文件不会上传。
PHP中mysql_error()函数打印的MySql错误为:
MySQL服务器消失了
有人可以帮我解决这个问题吗?
MySql 服务器仅在请求 > 1MB 时启动并运行,并给出此错误。
问候,
玛雅克。
附:
我正在使用表单上传文件。<FORM METHOD="post" ACTION="fileUpload.php" ENCTYPE="multipart/form-data">
<INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="300000000">
<INPUT TYPE="hidden" NAME="action" VALUE="upload">
Description: <TEXTAREA NAME="txtDescription" ROWS="1" COLS="80"></TEXTAREA>
<INPUT TYPE="file" NAME="binFile" ID="binFile">
<INPUT TYPE="submit" NAME="Upload" VALUE="Upload">
</FORM>
你的sql查询可能超出了最大允许数据包 http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet大小,在这种情况下服务器将断开连接。
您可能感兴趣mysqli_stmt::send_long_data http://php.net/mysqli-stmt.send-long-data它允许您以块的形式发送超过 max_allowed_packet 的参数。
更新:“我该如何更改它?使用 mysqli 是唯一的选择吗?”
据我所知,该值不能在每个会话的基础上更改,即,如果您无法更改服务器配置(my.cnf 或启动参数),则该值将是只读的。编辑:正如评论所建议的,如果您有的话,您可以在启动后更改 mysql 服务器的全局值适当的权限 http://dev.mysql.com/doc/refman/5.0/en/privileges-provided.html#priv_super。
PDO/PDO_MYSQL(从 phpversion 5.3.0 开始)似乎不支持 send_long_data,但我也不确定。这样就离开了mysqli http://php.net/mysqli作为唯一的选择。我最近注意到韦兹·弗隆 https://stackoverflow.com/users/149111/wez-furlong加入了堆栈溢出。由于他是 PDO 实现的作者之一,他可能知道(尽管他没有编写 pdo_mysql 模块)。
(完全未经测试且丑陋)示例
// $mysqli = new mysqli(....
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen');
//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error);
//$chunkSize = $result->fetch_all();
//$chunkSize = $maxsize[0][0];
$chunkSize = 262144; // 256k chunks
$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error);
// silently truncate the description to 8k
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192);
$stmt->bind_param('sb', $desc, null);
while(!feof($fp)) {
$chunk = fread($fp, $chunkSize);
$stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error);
}
$result = $stmt->execute();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)