這個答案將會是我迄今爲止在這裏看到的大部分內容的綜述,但更精細些。
您似乎對什麼是服務器端和什麼是客戶端代碼感到困惑。 PHP代碼在頁面內容發送到客戶端之前執行。此頁面包含您的JavaScript。因爲PHP在服務器上執行,所以在發送給客戶端之前,我們稱之爲服務器端代碼。由於php是一種在服務器端執行的編程語言,我們稱之爲服務器端語言。
所以你的包含javascript和html的頁面被髮送到客戶端。瀏覽器現在解釋html,並突然發現一個<script>
標籤。它立即開始在腳本標籤之間執行JavaScript。因爲這個腳本是在客戶端的瀏覽器中執行的,所以我們說它是在客戶端執行的。然而,說現在像node.js這樣的東西被使用的時候,javascript是一種純粹的客戶端語言是錯誤的,但是,因爲它似乎只是開始弄清楚所有這些東西,所以我會堅持使用php作爲服務器側。如果你掌握php,以及客戶端和服務器端腳本的概念,nodejs絕對是值得關注的東西。但現在,我正在擺脫這個答案的主要觀點。爲了回到它,讓我們來看看你發佈的代碼。所有這些代碼被放置在一個.php文件中:
<script type="text/javascript">
function saveReason()
{
var reason=prompt("I'm saving this because","");
if (reason!=null && reason!="")
{
<?php
mysql_query("INSERT INTO `save` (reason) VALUES ('reason'))");
?>
}
}
</script>
現在讓我們來看看當請求這個頁面時會發生什麼。 當服務器開始查看一個php文件時,它處於HTML模式。這意味着它遇到的任何事情都將被添加到輸出中。 因此,您的JavaScript將被添加到輸出,直到第6行,因爲在第7行,你打開php標籤。服務器現在進入PHP模式,這意味着它執行遇到的PHP代碼,將PHP代碼的任何輸出添加到已處理的輸出中。
您的sql查詢已處理。該查詢在'reason'列中添加一行到'save'列,得到'reason'的值,因爲那是你傳遞給它的字符串。在這個查詢之後,服務器遇到最後的php標籤。它現在將其餘的html添加到輸出中,並將其發送給用戶。用戶現在將收到的頁面如下所示:
<script type="text/avascript">
function saveReason()
{
var reason = prompt("I'm saving this because");
if (reason!=null && reason!="")
{
}
}
您應該這樣做的方式是使用AJAX。 AJAX代表 異步 Javascript 和 XML。
這基本上意味着發送一個請求到服務器而不重新加載頁面。這在原生JavaScript中是可行的,但由於瀏覽器之間的差異,使用JavaScript框架更容易。您使用框架編寫的代碼也更具可讀性。我會告訴你如何使用jQuery,這是最容易學習的框架之一。
$.post("save.php", { reason: reason});
此代碼發送POST請求到服務器
在你的服務器上,創建一個名爲save.php它將處理數據。使用您發佈的代碼,php文件是這樣的:
<?php
$reason = $_POST['reason']; // gets the data it received from the request
mysql_query("INSERT INTO `save` (reason) VALUES ('"+$reason+"'))");
?>
現在,爲了安全,你應該讓你從用戶安全地放入數據庫中獲取數據,從而使黑客無法使用SQL注入,所以你應該改變管線2
$reason = mysql_real_escape_string($_POST['reason']);
你可能還需要確保用戶不能添加額外的HTML,或者更糟的是,額外的JavaScript到您的網頁。您可以通過添加一個額外的行您的mysql_query之前,像這樣實現這一點:
$reason = strip_tags($reason);
您可以通過編輯第2行縮短這
$reason = mysql_real_escape_string(strip_tags($_POST['reason']));
我希望幫助。
它不會工作,因爲你需要通過ajax或其他東西,以便您的php腳本獲取數據... – Andre 2011-04-20 17:37:08
因爲如果我在一個html頁面中使用這個,我首先需要添加處理程序來關聯。 HTML與.php也 – Kyle 2011-04-20 17:37:12