【问题标题】:Insert into MySQL database when user clicks on a Link当用户单击链接时插入 MySQL 数据库
【发布时间】:2025-12-22 11:10:11
【问题描述】:

我正在创建一个网站,让用户登录并选择他们想要下载的 pdf 文档。当他们打开文档进行查看并可能下载时,我希望同时将数据记录到数据库中。

将数据发送到数据库的代码有效(不包括:未定义索引: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);
?>

【问题讨论】:

  • 您是否希望他们能够下载文件的最大次数?还是您只是在记录活动?
  • 你可以尝试在 PHP 中处理表单数据后重定向:*.com/a/768472/806975
  • 我只是想在每次有人打开文件时记录下来。

标签: javascript php mysql


【解决方案1】:

您的文件只是您的网络服务器返回的普通文件:

<a href='../documents/test.pdf' ...

因此,虽然您可能能够建议用户或浏览器他们应该在下载此文件之前调用一些代码,但您实际上并不需要它。任何用户都可以直接请求文件。由于 PDF 文件不执行 PHP 代码(谢天谢地),您的服务器端 PHP 代码无法知道该文件已被请求。

可以做的就是在 PHP 请求后面隐藏文件本身。您可以创建类似 download.php 页面的内容,该页面接受文件名 (test.pdf) 和 returns that file

这样做时要非常小心。不要只允许用户请求任何文件并盲目地返回他们请求的任何内容。用户可以请求诸如“../../../../../../../../../../etc/passwd”之类的内容,并且如果您的代码只是构建路径并且返回文件,那么您刚刚为用户提供了敏感文件。最好的做法是保留一个有限的已知文件列表(可能在数据库表中),并让用户通过标识符而不是文件路径本身进行请求。这样,实际路径只有在您控制的数据中服务器端才知道。

然而,这里的要点是,通过使用这样的页面,您可以在用户和文件之间注入一些 PHP 代码。为了获取文件,用户需要向 PHP 页面发出请求。在该页面上,您可以记录用户请求文件的行为。 (以及执行授权检查以验证用户是否允许查看文件等)

永远不要假设客户端代码会做你期望它做的事情。如果您想确保任何接近安全或审计目的的事情发生,它需要发生在服务器端代码中。

【讨论】:

    【解决方案2】:

    按照您的方式,单击链接将覆盖正在提交的表单。这会导致文件打开并且表单永远不会通过。

    相反,您可以尝试通过将 target="_blank" 添加到标签来在新窗口中打开文件,或者将文件 URL 发送到 PHP,执行数据库代码然后添加到末尾:

    header("Location: http://yourdomain.com/yourfile.pdf");
    

    【讨论】: