使用jQuery的.ajax()函数从php脚本中检索变量的最佳方法是什么?

时间:2009-10-14 17:22:41

标签: php javascript jquery ajax json

- 我已经读过关于json是一种简单的方法,但是在读取数据后也读取了使用eval()的不良做法。所以我不知道如何使用返回的数据。

- 我能够从php脚本中检索数据的唯一方法是,如果我回显已经格式化的结果(这不是很方便)。此外,如果php脚本中存在重定向,则整个重定向页面html将被传递回javascript。

有人可以推荐一种从php发送变量或数组回javascript的方法吗?

6 个答案:

答案 0 :(得分:3)

jQuery可以安全地为您解析JSON。您可以使用.ajax()函数和相应的参数,也可以使用.getJSON()函数。

jQuery.getJSON( url, data, callback )

您应该能够找到一个PHP库,通过谷歌搜索将数据结构转换为JSON,但我无法推荐任何具体的。

答案 1 :(得分:2)

使用jQuery,您可以使用JSON数据,而且非常安全,如果从同一域加载数据,则更加重要,我看不到安全漏洞。

在PHP中说(从版本5.2.0开始),您有将PHP数据转换为JSON的本机函数,反之亦然。 The function are json_encode and json_decode

例如:

$result = array();
$result['data1'] = "askdjaksd";
$result['data2'] = array(1,2,3);

echo(json_encode($result));

PHP为您完成所有工作。它也很快成为原生扩展。

答案 2 :(得分:1)

我认为没有任何其他可用的序列化方法明显优于JSON。你没有被迫使用eval()。有可用的解析器,如Douglas Crockford的this one

答案 3 :(得分:1)

由于JavaScript对XmlHttpRequests具有相同的域策略,除非您有 man in the middle 攻击或者您的服务器遭到入侵(在任何一种情况下,您和您的客户都有更大的问题),您不应该不必担心从服务器中评估一个JSON字符串(因为你控制了这些数据)。

正如其他人所说,还有其他口译员可供选择。此外,如果您真的需要,可以将数据作为XML发回。

要在另一个答案中回答您的评论:如果您希望您的网站使用和不使用JavaScript,我建议在会话中存储一个标记,而不是将其传递到整个网站。

答案 4 :(得分:1)

与其他人提到的一样,同域策略可以保护您免受eval()从服务器发送的json的恶意....

回答你对另一个答案的评论:

Jquery使用每个ajax请求发送此标头

HTTP_X_REQUESTED_WITH= "XMLHttpRequest"

因此,在PHP脚本上,您可以执行类似

的操作
if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) &&
   ($_SERVER["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest")){
   //do stuff assuming javascript is enabled
}else{
  //do stuff assuming javascript is disabled
}

答案 5 :(得分:1)

的jQuery

$.post('somewhere.php',{ file: file, text: text },function(data) { //do stuff you can tell it to call a function or w/e you need to do },"json");

要访问数据,这很简单,函数(数据){允许您通过data.var访问json编码}

PHP

$file = $_POST['file'];
$text = $_POST['text'];

// do w/e you want with theses
// when your done and want to pass the vars back

echo json_encode("file" => $file,"text" => $text,"mynewvar" => $somevar);

现在,当你想要访问那些数据时,一个简单的例子就是在函数(数据)中:

function(data) {  
  var mynewvar = data.mynewvar;
  var file = data.file;
  var text = data.text;
  //do w/e
}

希望能为你提供如何处理它的方向。