PHP文件下载结合MySQL数据库条目(文件显示在浏览器中)

时间:2014-09-09 20:33:40

标签: php mysql mysqli header

我有这个用于下载文件的PHP代码。它一直有效,但现在我已经改变了我的服务器提供商,它不再有效。

在我让用户下载文件之前,我想为该下载添加一个数据库条目,包括信息(下载文件的名称,用户的IP地址,用户的主机,当前时间)。

  • 如果我只添加没有“下载代码”的数据库条目(注释// DL下面的代码),它可以工作并添加条目,但当然不会下载文件。

  • 如果我省略了mysql代码并且只使用下载代码,它会正常下载代码,但当然我没有数据库条目。

因此,如果我不使用另一个,这两件事情会有效,但结合起来它们就不起作用了。如果我合并它们,它会添加条目,但只是在网站上显示文件的内容而不是下载文件

这是代码:

<?php

$file = "./files/MyFile.zip";

if(!file_exists($file)){
  echo "File \"" . $file . "\" not found";
} else {
  $download_ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
  $host = gethostbyaddr($download_ip);

  // Connect
  $db = new mysqli('host', 'user', 'password', 'database');
  if ($db->connect_error) { die('Database error (' . $db->connect_errno . ') ' . $db->connect_error); }
  echo 'Successfully connected to database ' . $db->host_info . "<br />";

  // Query
  if($db->query("INSERT INTO downloads (name,ip,host,time) VALUES('".mysql_real_escape_string($id)."' , '$download_ip' , '$host' , NOW())") == true) {
    echo 'query was successful';
  } else {
    echo 'query failed';
  }

  // Close
  $db->close();

  // DL
  header('Content-type: application/octet-stream');
  header('Content-Length: ' . filesize($file));
  header('Content-Disposition: attachment; filename="' . basename($file) . '"');
  ob_clean();
  flush();
  readfile($file);
  exit();
}

?>

我只是一个随意的PHP用户,所以有人可以帮助我吗?我非常感激。

PHP版本为5.6(但我也可以将其更改为5.5或5.3)

1 个答案:

答案 0 :(得分:1)

删除所有&#34; echo&#34;命令,因为你不能在那之后发送标题。