2015-09-27 147 views
0

我必須使用JavaScript呈現圖表。但是圖表的數據在服務器中。谷歌搜索後,我發現這可以通過使用服務器端scrpting語言如php和客戶端語言JavaScript或jQuery來完成。
客戶端腳本中的服務器端變量

var php_data= $.parseJSON('<?php echo json_encode($chart_data); ?>'); 

上面的代碼工作正常,我可以將服務器中的數據傳送到客戶端。

但我很好奇,如何做到這一點,因爲我們正在讀取客戶端的服務器端變量,我們不在這裏使用AJAX。這真是令人困惑,因爲php代碼在服務器上運行,並且javascript在客戶端運行。有沒有人知道這背後的理論?一個javascript如何訪問服務器?

如果我們可以通過JavaScript訪問任何php腳本中的變量,我們將不得不明確採取一些措施來確認php腳本的安全性。

回答

3

這是因爲它執行的順序。服務器端腳本首先執行(在服務器上)並生成發送給客戶端的輸出。因此,您可以使用服務器端代碼動態生成服務器上所有客戶端腳本的一部分。這基本上就是你在這裏做的。

另一種方式 - 將數據從服務器端傳遞迴服務器端需要AJAX或類似服務器,因爲服務器端腳本在客戶端腳本運行時已經運行。

就安全性而言,JavaScript中唯一可用的服務器端變量是那些明確呈現爲JavaScript變量/對象的變量。 (或者當然你通過API/AJAX調用公開的那些)。在這種情況下,你說暴露在JavaScript中$chart_data變量:

var php_data= $.parseJSON('<?php echo json_encode($chart_data); ?>'); 

如果你看一下生成的頁面的源代碼,也不會提$chart_data,它將會像

var php_data= $.parseJSON('[{"a": "1"}, {"b": "2"}]'); 

你沒有訪問PHP變量,只是簡單地打印它的內容(在這一點上 - 這一點後,你的PHP腳本中的$chart_data所做的任何更改將而不是反映在JavaScript中的版本)作爲JavaScript變量。

+0

是的,但我的觀點是如何php腳本知道js需要該變量?是js在頁面加載時請求它嗎? –

+0

號你作爲程序員正在告訴它將該變量的內容作爲輸出中的js變量寫出來 - 就像你將文本寫入頁面一樣。如果你說'

<?php echo $ title; ?>

' - HTML沒有請求'title'變量,您正在將它寫入輸出的一部分。這裏完全一樣。當客戶端(瀏覽器)接收到頁面時,js變量被定義爲靜態字符串,而不是對PHP變量的調用。 – Adam

1

RESTFul API's是你在找什麼。所提供的示例使用了Zend PHP Framework,但是您可以使用simple router執行相同的操作,並導出爲JSON以供JS解析。

一個方面的說明我建議你可能移動到DOM渲染使用客戶端路由與RESTFul API的新的方法& XMLHttpRequests;一些偉大的快速原型框架是angular, knockout, backbone etc

好處在於,客戶端正在處理頁面呈現與服務器之間的關係,從而導致服務器的內存消耗用於更重要的任務。

+0

謝謝你的快速回答。我會詳細介紹你提供的鏈接。這是一個前所未知的有趣的一面。 –