我正在创建一个用户登录并选择他们要下载的pdf文档的网站。当他们打开要查看和下载的文档时,我希望数据同时登录到数据库中。
将数据发送到数据库的代码有效(除了:Undefined index:learningMaterial)。但是当我想打开pdf文档并同时记录用户和其他数据时,所有发生的事情就是打开文档。
任何建议都会受到赞赏,即使是总体上更好的方法来实现我想要实现的目标。仍缺乏PHP经验。
见下面的代码。
HTML
<form name="myform" method='post' action="../includes/writeStats.php">
<input type='hidden' name='learningMaterial' id='learningMaterial' value='learningMaterial'>
<a href='../documents/test.pdf' id='mylink' class='courses' name='Driver Training'> Driver Training </a>
</form>
JS - 标题
<script type="text/javascript">
function submitform(){
document.myform.submit(); }
var form = document.getElementById("myform");
document.getElementById("mylink").addEventListener("click", function () {
submitform();
});
</script>
PHP
<?php
$con=mysqli_connect("localhost","root","password","qmptest");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
//Get latest log nr
$result = mysqli_query($con,"SELECT * FROM logbook ORDER BY log DESC LIMIT 1");
while($row = mysqli_fetch_array($result)) {
$log = $row['log'] + 1;
//If statement to check if log is 0(first entry) to go here
}
$date = date("Y/m/d");
session_start(); // Start a new session
$person = $_SESSION['currentUser'];
//Not sure if this is correct along with my HTML input
$material = mysqli_real_escape_string($con, $_POST['learningMaterial']);
//Insert into database
$sql="INSERT INTO logbook (log, date, person, learningMaterial)
VALUES ('$log', '$date', '$person', '$material')";
if (!mysqli_query($con,$sql)) {
die('Error: ' . mysqli_error($con));
}
mysqli_close($con);
?>
答案 0 :(得分:1)
按照您的方式,点击该链接将覆盖正在提交的表单。这导致文件打开,表单永远不会通过。
相反,您可以尝试通过向标记添加target =“_ blank”在新窗口中打开文件,或者将文件URL发送到PHP,执行数据库代码然后添加到结尾:
header("Location: http://yourdomain.com/yourfile.pdf");
答案 1 :(得分:1)
您的文件只是您的网络服务器返回的普通文件:
<a href='../documents/test.pdf' ...
因此,当 能 向用户或浏览器建议他们应该在下载此文件之前调用某些代码时,您实际上并不需要它。任何用户都可以直接请求该文件。由于PDF文件不执行PHP代码(幸运的是),您的服务器端PHP代码无法知道该文件已被请求。
您可以做的事情是在PHP请求后面隐藏文件本身。您可以创建类似于download.php
页面的内容,该页面接受文件名称(test.pdf
)和returns that file。
执行此操作时 非常小心 。不要只是允许用户请求任何文件,并盲目地返回他们要求的任何内容。用户可以请求类似“../../../../../../../../../../etc/passwd”的内容,如果您的代码只是构建了一个路径,返回文件,然后你刚刚给用户一个敏感文件。最佳做法是保留已知标识的有限文件列表(可能在数据库表中),并让用户通过标识符而不是文件路径本身进行请求。这样,实际路径在您控制的数据中只知道服务器端。
然而,这里的要点是,通过使用这样的页面,您可以在用户和文件之间注入一些PHP代码。为了获取文件,用户需要向PHP页面发出请求。在该页面上,您可以记录已请求文件的用户的行为。 (以及执行授权检查以验证用户允许查看文件等)。
永远不要假设客户端代码会按照您的预期执行。如果您想确保任何接近安全或审计目的的事情发生,则需要在服务器端代码中进行。