使用javascript ajax调用执行PHP脚本

时间:2015-11-26 05:20:33

标签: javascript php ajax

我有以下XMLHttpRequest

# ....
var request = new XMLHttpRequest();
request.open('GET', 'controllers/get_date.php', true);
request.setRequestHeader('Cache-Control', 'no-cache');
request.setRequestHeader('fn', 'get_date');
request.setRequestHeader('day', '27/11'  );
# ....

get_date.php看起来像这样:

if($_SERVER['HTTP_FN'] == 'get_date'):
   $day = Common::sanitize($_SERVER['HTTP_DAY']);
   $data = new MyFunction($day);
   echo $data->my_data();
endif;

基本上我试图从$data->my_data()获取一些数据并且所有这些都正常工作。然而,由于我的后端技能非常有限。我想知道这是否是一种正确的方式(主要考虑安全性)或者我是否应该采取另一种方法。

2 个答案:

答案 0 :(得分:2)

您应该避免通过HTTP标头传递参数数据。 HTTP标头用于HTTP层正确传输其数据。它有自己的目的,但不适用于应用程序参数。代理,防火墙,网关,负载平衡器等都可以检查和重写标头以用于HTTP传输。您的自定义“参数”可能会被重写,删除或运行到其他标题的同一个空间中。

相反,我建议您使用GET或POST数据传递查询字符串。

例如:

request.open('GET', 'controllers/get_date.php?fn=get_date&day=27%2F11', true);

在PHP中,使用以下方法获取参数:

$fn = $_REQUEST['fn'];
$day = $_REQUEST['day'];
if($fn == 'get_date') {
...

答案 1 :(得分:-2)

是的,由您决定!

首先使用原生XMLHttpRequest的赞美,所有浏览器都支持这种浏览器,包括移动浏览器。使用jQuery的ajax只是性能损失。

安全

在谈论javascript时,没有安全性。零。

前段时间我回答了一个关于How can I obfuscate(protect) JavaScript?的问题......一旦你把它放到网上,你真的没有什么可以隐藏的。你唯一能做的就是惹恼"黑客"。同样只使用原生XMLHttpRequest增加了所有jQuery粉丝不了解你所做的事情的机会! ;)

在上面的帖子中,我使用了标题来验证引荐来源......

<强>性能

XMLHttpRequest它是原生的...所以这是最快的方法..

所有其他库包括许多用户友好的检查,简化了一切。许多检查意味着性能损失。

由于你可能想要使用ajax而不仅仅是一个动作,我建议你看一下我前一段时间写的功能。

How do I return the response from an asynchronous call?

function ajax(a,b,e,d,c){ // Url,callback,method,formdata or {key:val},placeholder
 c=new XMLHttpRequest;
 c.open(e||'get',a);
 c.onload=b;
 c.send(d||null)
}

我将它用于各种REST API。大多数情况下,您不需要设置标题和其他内容。 您可以修改它并添加对添加标题信息的支持。

我在您的代码中看到了一件非常糟糕的事情。

request.open('GET', 'controllers/get_date.php', true);

真???

不要这样做。应该永远不会使用。甚至没有静态文件。 Ajax意味着异步!如果php文件的响应速度不够快,您将崩溃用户浏览器。通过崩溃我的意思是浏览器卡住没有任何动作,直到加载ajax内容。因此,如果加载文件需要5秒钟,那么5秒钟就无法执行任何操作。鼠标/触摸事件也不起作用,每个动画元素都将被冻结.gifs / videos / cssstyles。

如何发送参数

稍微安全一点......短款,最佳性能?是的,使用headers之前发送的标题。但实际上我认为没有太大的变化,因为最终的二进制数据可能与您通过GET&amp; POST

GETPOST

如果最终获得的发送标题的安全性不够,那么你想要这样做&#34;正常&#34;那么,只有一件重要的事情需要考虑:你需要发送多少数据。我更喜欢发帖..它允许发送更多数据。我使用FormData来执行此操作。

var fd=new FormData(form);// this is the whole form including upload files.
ajax(url,callback,'post',fd);

看似不太明显的是JSON。

我看到JSON没有提到。没有JSON的Ajax是没用的。 js&amp;没有json的php是没用的。你不能只发送字符串......所以

php

//php array to jsonstring
json_encode($array);

//jsonstring to php array
json_decode($string);

js

//jsonstring to js array
JSON.parse(string);

//js array to jsonstring
JSON.stringify(array);

在这两种情况下(如果服务器nginx,apache,lighthttp设置正确),您不必担心编码。 JSON在utf8中自动编码。

<强> PHP

有些人可能会建议使用php(ajax可以处理压缩文件),甚至可以添加正确的mimetype。

//header('Content-Type: application/json'); // not needed
echo json_encode($data);

但在这两种情况下都需要更多时间。 所以不要

保持php文件尽可能简单。因为它是花费更多时间的人。 不要发送元素,样式或其他相关内容。你应该做那个客户方。保持服务器敏捷。

mysql to json

https://stackoverflow.com/a/20948686/2450730

现在,看看评论,你使用NODEJS :)。

使用webSockets。将其用于所有内容。 忘掉ajax,用websockets做任何事!!!!!双向通信。而且您只发送所需的数据。没有请求,没有标题......没有缓慢的东西。

<强>支持

旧版浏览器不支持ajax和websockets,也支持服务器发送事件。

如果这是一个问题,请不要使用这些技术。同样使用jQuery来允许ie6上的ajax只是一个笑话......

顺便说一下现在ff,即opera,android,safari,ios甚至这些浏览器的4-5岁版本都支持ajax,websockets&amp; SSE

<强>的WebSockets

我真的很喜欢php,mysql nginx apache ...但是nodejs,websockets&amp; json ..

这很有趣纯粹

简单的js例子。

var ws=new WebSocket('ws://YOURIP:YOURPORT');
ws.onopen=function(){ //those events are also aviable with sse
 ws.send('WS open!');//sending data to the server
 // server handles each user individually very easely.
};
ws.onclose=function(){
 console.log('WS closed!');
};*/
ws.onmessage=function(e){
 //USE JSON
 var Everythingyouneed=JSON.parse(e.data);
};

@ nodejs side ....

https://github.com/websockets/ws

查看broadcast或将数据单独发送给eah用户。