2011-12-12 75 views
7

如果我使用Jquery .load(file.php)加載PHP頁面,那麼包含的文件是否可以使用在頁面上定義的調用load()的php變量?Jquery load()和PHP變量

+2

喜@ user1091856 - 歡迎SO。如果它適用於你(不僅僅是這個問題,而且還包括你以前的任何四個問題),接受一個答案是一個好習慣。乾杯! – themerlinproject

回答

13

你誤解是如何工作的。

  • PHP運行之前的任何瀏覽器響應頒發給客戶端,所有的代碼運行服務器上。所有PHP代碼運行後,PHP文件中聲明的變量將被銷燬;他們「消失」。
  • JavaScript運行後瀏覽器響應已經開始,所有代碼都在客戶端上運行。通過「加載」PHP文件的輸出結果,您將無法訪問PHP的變量,只能訪問輸出。

如果你想從PHP轉移某些變量的JavaScript,你可以放棄一些輸出到JSON在你的PHP腳本,像這樣:

<?PHP 
    header("Content-Type: application/json"); 

    $myVariable = "hello world"; 

    echo json_encode(array(array("myVariable" => $myVariable))); 

    /* Output looks like this: 
     [ 
      { 
       "myVariable": "hello world" 
      } 
     ] 
    */ 
?> 

你的JavaScript/JSON應該是這個樣子:

$.getJSON("test.php", function(result) { 
    console.log(result[0].myVariable); 
}); 

這有道理嗎?

+0

我喜歡你清楚的解釋*爲什麼*它不會起作用,這是wny我upvoted的答案。但是,使用簡單的非轉義'echo'語句生成JSON的提示非常可怕;這就是爲什麼[json_encode()](http://php.net/json_encode)存在。 –

+0

對,我的道歉。我只是試圖讓它容易理解。自從我使用PHP以來已經有一段時間了,而且我過去並不需要從PHP序列化JSON,所以我的不好。 –

+0

編輯我的答案,使用'json_encode'。 –

0

變量範圍PHP腳本加載的JavaScript與載入PHP腳本的頁面不同,所以答案是否定的。

但您可以定義全局變量或使用超級全局變量(如$_GET,$_POST等)來獲取所需內容。

+0

您可以使用PHP動態地定義Javascript在頁面中傳遞的變量。 –

+0

@WatermarkStudios由Javascript傳遞的變量與OP所要求的不同:'包含的文件是否可以使用在調用load()'的頁面上定義的php變量。 – fardjad

+0

您可以完全按照TK Kocheran描述的方式使用它們(儘管強烈建議使用json_encode())。你說得對,javascript不能直接訪問PHP變量,因爲在RESPONSE循環中加載的順序是一樣的,但添加一行PHP來定義一個與PHP變量具有相同值的Javascript變量是沒有聽說過的,也沒有這是不好的做法,除非PHP變量的值是敏感的。如果敏感數據是一個問題,使用會話變量可能是最好的。 –

13

不行,你必須通過你想用你的file.php變量:

$('#yourdiv').load('file.php?var1=xyz&var2=xyz&var3=xyz'); 

然後你就可以讓那些在你的file.php:

$var1 = $_GET['var1']; 
$var2 = $_GET['var2']; 
$var3 = $_GET['var3']; 

如果有很多變量然後使用POST方法:

$('#yourdiv').load('file.php', {var1:x, var2:y, var3:z}) 

然後獲取file.php中的變量:

$var1 = $_POST['var1']; 
$var2 = $_POST['var2']; 
$var3 = $_POST['var3']; 
+0

This works too ...我只是用file.php替換''file.php?var1 = xyz&var2 = xyz&var3 = xyz'' var1 = {$ xyz}&var2 = {$ xyz}&var3 = {$ xyz}''如果您使用從當前PHP文件填充的變量。同樣,整條線將不得不從PHP標籤中迴應。 –

+0

我很欣賞這種方法,因爲它使用了原生的jQuery'load'函數。 – RCNeil

0

您將不得不通過.load函數將這些變量傳遞給加載的PHP文件。

例子:

$("#objectID").load("test.php", { 'choices[]': ["{$choice1}", "{$choice2}"] }); 

在當前的PHP文件中定義的變量將成爲加載新的PHP文件中的Javascript的一部分。

+0

當然這條線將不得不從PHP標籤中迴應出來。 –

5

是,使用數據參數,請參閱http://api.jquery.com/load/

$('#someelement').load(
    "test.php", 
    { 
     'key1': '<?php echo $value1; ?>', 
     'key2': '<?php echo $value2; ?>' 
    } 
); 

參數被髮布到文件test.php並作爲訪問:

$_POST['key1'] 
$_POST['key2'] 
+0

這是一個乾淨的解決方案,但請記住,如果您想使用當前PHP文件中定義的變量,則必須使用PHP變量中回顯的PHP變量替換值。 –

0

JQuery加載函數的第二個參數(params)應該是對象或回調函數,但也可以是空字符串。根據不同的情況,負載會發送帖子或獲取請求。

我的想法是在get和post之間自動切換(例如,如果設置了cookie),因爲get更快並且緩存可用,並且post更加節省。

其糟糕的編寫,包括回調函數裏面的內容加載函數兩次比寫類似的東西:

//get 
var url="cache_dir/my_bag.html"; 
var params=""; 
if(document.cookie){ 
    //post 
    url="post.php"; 
    params="{my:bag}"; 
    } 
$(selector).load(url,params,function(){ 
... 

    });