簡體   English   中英

當用戶單擊鏈接時插入到MySQL數據庫中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM