2011-04-20 84 views
1
<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> 

我覺得自己很愚蠢,因爲我不認爲我的想法會起作用。從提示()框中獲取數據並將其保存到mysql的正確方法是什麼?保存javascript提示()到mysql

+0

它不會工作,因爲你需要通過ajax或其他東西,以便您的php腳本獲取數據... – Andre 2011-04-20 17:37:08

+0

因爲如果我在一個html頁面中使用這個,我首先需要添加處理程序來關聯。 HTML與.php也 – Kyle 2011-04-20 17:37:12

回答

11

這個答案將會是我迄今爲止在這裏看到的大部分內容的綜述,但更精細些。

您似乎對什麼是服務器端和什麼是客戶端代碼感到困惑。 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'])); 

我希望幫助。

+0

+1提供安全建議 – 2014-03-08 14:52:30

0

Javascript是客戶端語言,PHP是服務器端語言。您必須發出ajax請求,將所需的數據發送到服務器,然後按照您的要求進行操作(在此情況下插入原因)。

0

它不能這樣做,因爲PHP是服務器端,並在甚至加載JavaScript(客戶端)之前執行。如果你真的想這樣做,我認爲你必須看看AJAX,它允許你使用JavaScript向另一個頁面發出請求。通過這種方式,您可以訪問anotherfile.php?reason = reasonhere並在該頁面上執行查詢。

3

您需要使用AJAX將數據從提示發送到服務器端PHP腳本。

如果你正在使用JQuery,你的Javascript會是這個樣子:

function saveReason() 
{ 

    var reason=prompt("I'm saving this because",""); 
    if (reason!=null && reason!="") 
    { 
     $.post("save.php", { reason: reason}); 
    } 
} 

在 'save.php' 你的PHP代碼會是這個樣子:

$reason = mysql_escape_string($_POST['reason']); 
mysql_query("INSERT INTO `save` (reason) VALUES ($reason))"); 
+0

jQuery聽起來很可靠。感謝Adam。 – Kyle 2011-04-20 18:06:52

6

正確方式將是忘記 mysql完全談到JS時。 你不能與JS與MySQL交互。你可以打電話給PHP腳本,它將與mysql交談。
但它會是另一個 PHP腳本,而不是一個你運行顯示這個頁面。

您需要了解瀏覽器如何工作。

在服務器端執行整個PHP腳本,導致瀏覽器中出現純HTML。僅限HTML和JS。瀏覽器中沒有PHP。

這就是爲什麼你不能在同一個PHP腳本中編寫HTML表單和它的處理程序,只需在第一個腳本之後放置後者。你將不得不再次調用服務器來使處理器工作。它將完全是另一個調用,同一個腳本的另一個實例,而前一個已經很久以前就已經死了 - 這是你必須知道的關於PHP的另一件事:

PHP腳本執行是原子的。它不像桌面應用程序一直在瀏覽器中運行,甚至不是持續連接到桌面應用程序的惡魔。它更像是一個命令行工具 - 執行它並退出。它運行離散:

  1. 一個瀏覽器會調用
  2. PHP醒來,創建一個HTML頁面,將其發送到瀏覽器和模具
  3. 瀏覽器呈現HTML和它顯示給用戶。
  4. 用戶點擊一個鏈接
  5. 一個瀏覽器會調用
  6. 另一個PHP實例,一無所知以前的號召,喚醒
+0

感謝知識兄弟,我真的很感激它。你是否從自我體驗中學到了這些東西? – Kyle 2011-04-20 18:03:47

1

當你找出技術途徑實現你在這裏嘗試了什麼(Ajax調用到處理SQL插入的serverphp)不要這樣做!您打開的安全鴻溝讓任何人都可以將任何他們想要的東西發送到您的數據庫中,以至於3歲的孩子將能夠通過它驅動惡意代碼。讓用戶提供一些值,然後自己編寫SQL以利用這些值。