2011-12-12 122 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(){ 
... 

    });