внезапное отключение базы данных в следующем коде - PullRequest
0 голосов
/ 24 октября 2009

Я записываю время, когда пользователь скачал определенный файл, используя следующий код. Тем не менее, в этом коде изначально время загрузки наступает, но позже оно разрывает соединение базы данных между клиентом и сервером. Если я удалю '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 голосов
/ 24 октября 2009

хорошо, если вы включите выход, ваш код просто не доходит до точки, где он должен вставить имя файла в БД.

если вы не включите выход, вы отправляете содержимое файла и добавляете к нему «Подключено», чтобы файл был поврежден.

может быть, вы можете попробовать ob_start и ob_end_clean для вашей базы данных: http://php.net/manual/en/function.ob-start.php

это предотвращает отправку чего-либо на выход, поэтому вам не нужно использовать выход, но ничего не отправляется на выход после вашего файла, чтобы он не был поврежден

что-то вроде:

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

вы можете включить exit после ob_end_clean () просто для уверенности, но это должно работать просто отлично.

0 голосов
/ 25 октября 2009

Попробуйте:

<?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);
0 голосов
/ 23 октября 2009

Если это происходит с большими файлами и / или медленными соединениями, попробуйте настроить max_execution_time в php.ini или из скрипта, используя функцию ini_set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...