以下代码中的数据库突然断开连接

时间:2009-10-24 04:44:48

标签: php mysql

我正在使用以下代码记录用户下载特定文件的时间。但是,在此代码中,最初的下载时间即将到来,但稍后它将断开客户端与服务器之间的数据库连接。如果我删除“exit”(如图所示),一切都会好起来,但下载的文件可能会损坏或损坏。

任何人都可以查看此代码并解释它有什么问题吗?我认为问题在于退出,但是我可以使用什么而不是退出?

<?php

$f_name = $_POST["fn"];

$file = "../mt/sites/default/files/ourfiles/$f_name";

if (file_exists($file)) {
   header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
   header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
  //ob_clean();
  // flush();
    readfile($file);
  //  exit;
}
$con = mysql_connect("localhost","mt","mt");
if (!$con) {
  die('Could not connect: ' . mysql_error());
} else {
  echo "Connected";
}

// Create table
mysql_select_db("mt", $con);

mysql_query("INSERT INTO down_time (FileName,DateTime)
VALUES ('".$f_name."',NOW())");
mysql_close($con);

?>

3 个答案:

答案 0 :(得分:0)

如果在大型文件和/或慢速连接上发生这种情况,请尝试调整max_execution_time中的php.ini或使用ini_set函数调整脚本。

答案 1 :(得分:0)

如果您包含退出,那么您的代码就不会到达应该将文件名插入db的位置。

如果您不包含退出,则发送文件内容并将“已连接”附加到其中,以便文件必须已损坏。

也许你可以尝试ob_start和ob_end_clean你的数据库内容:http://php.net/manual/en/function.ob-start.php

这可以防止将任何内容发送到输出,因此您不必使用exit,但在文件之后没有任何内容被发送到输出,因此它不会被损坏

类似的东西:

    readfile($file);
}
ob_start();
$con = mysql_connect("localhost","mt","mt");
//all the DB stuff
mysql_close($con);
ob_end_clean();
?>

你可以在ob_end_clean()之后包括退出以确定但是这应该可以正常工作。

答案 2 :(得分:0)

尝试:

<?php
$f_name = $_POST["fn"];
$file = "../mt/sites/default/files/ourfiles/$f_name";

if (!file_exists($file)) { die('File not found'); }

if (!$con = mysql_connect("localhost","mt","mt")) { die(mysql_error()); }
if (!mysql_select_db("mt")) { die(mysql_error()); }
$q = "INSERT INTO `down_time` (`FileName`, `DateTime`) VALUES ('"
   . mysql_real_escape_string($f_name) . "',NOW())";
if (!mysql_query($q)) { die(mysql_error()); }

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
readfile($file);