[英]Insert into MySQL database when user clicks on a Link
我正在創建一個網站,讓用戶登錄並選擇他們要下載的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);
?>
以您的方式,單擊鏈接將覆蓋正在提交的表單。 這將導致文件打開,並且表單永遠無法通過。
相反,您可以嘗試通過在標簽中添加target =“ _ blank”在新窗口中打開文件,或通過URL將文件發送到PHP,執行數據庫代碼,然后添加到末尾:
header("Location: http://yourdomain.com/yourfile.pdf");
您的文件只是Web服務器返回的普通文件:
<a href='../documents/test.pdf' ...
因此,盡管你可以向用戶建議或他們應該下載此文件之前,調用一些代碼的瀏覽器,你不能真正需要它。 任何用戶都可以直接直接請求文件。 而且,由於PDF文件沒有執行PHP代碼(非常感謝),因此服務器端PHP代碼無法知道是否已請求文件。
您可以做的是在PHP請求后隱藏文件本身。 您可以創建類似download.php
頁面的內容,該頁面接受文件名( test.pdf
)並返回該文件 。
這樣做時要非常小心 。 不要只允許用戶請求任何文件並盲目返回他們所請求的內容。 用戶可以請求“ ../../../../../../../../../../etc/passwd”之類的內容,如果您的代碼只是構建路徑和返回文件,那么您剛剛為用戶提供了一個敏感文件。 最佳做法是保留已識別文件的有限已知列表(也許在數據庫表中),並讓用戶通過標識符而不是文件路徑本身進行請求。 這樣,實際路徑僅在您控制的數據中才是服務器端已知的。
但是,這里的要點是,通過使用這樣的頁面,您可以在用戶和文件之間注入一些PHP代碼。 為了獲取文件,用戶需要向PHP頁面發出請求。 在該頁面上,您可以記錄用戶請求文件的行為。 (以及執行授權檢查以驗證是否允許用戶查看文件等)
永遠不要假設客戶端代碼將按照您的期望去做。 如果您想確保某些事情出於安全或審核目的而發生,則需要在服務器端代碼中進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.