使用javascript ajax调用执行PHP脚本

Performing a PHP script using javascript ajax call

本文关键字:PHP 脚本 执行 调用 javascript ajax 使用      更新时间:2023-09-26

我有以下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()中获取一些数据,所有这些都运行良好。然而,由于我的后端技能相当有限。我想知道这是否是一种合适的方式(主要考虑安全性),或者我是否应该采取另一种方法。

您应该避免通过HTTP头传递参数数据。HTTP标头用于HTTP层正确传输其数据。它有自己的目的,但不适用于应用程序参数。代理、防火墙、网关、负载均衡器等都可以出于HTTP传输的目的检查并重写报头。您的自定义"parameters"可能会被重写、删除或运行到其他标头的相同namspace中。

相反,我建议您使用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') {
...

是的,这取决于您

首先是对使用本地XMLHttpRequest的赞扬,它受到包括移动浏览器在内的所有浏览器的支持。使用jQuery的ajax只是性能损失。

安全

当谈到javascript时,没有安全性。零

我回答了一个关于如何混淆(保护)JavaScript的问题?前段时间。。。一旦你把它放到网上,你真的没有什么可以隐瞒的。你唯一能做的就是惹恼"黑客"。此外,仅仅使用本机XMLHttpRequest就增加了所有jQuery粉丝不了解您所做工作的机会!)

在上面的帖子中,我使用了标题来验证引用人。。。

性能

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

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

由于您可能希望将ajax用于不止一个操作,我建议您查看我前段时间编写的函数。

如何从异步调用返回响应?

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秒钟内,你什么都做不了。鼠标/触摸事件不起作用,每个动画元素都将是frozen.gifs/videos/cssstyles.

如何发送参数

安全性稍高。。。短参数,最佳性能??是的,使用headers,在发送任何其他内容之前发送头。但事实上,我认为没有太大的变化,因为最终的二进制数据可能与通过GET&POST

GET还是POST

如果最后发送头的安全性还不够,所以你想用"正常"的方式发送,那么只有一件重要的事情需要考虑:你需要发送多少数据。我更喜欢邮寄。。它允许发送更多的数据。我使用FormData来做到这一点。

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

JSON似乎不是很明显

我看不到任何提到JSON的地方。没有JSON的Ajax是无用的。js&没有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文件尽可能简单。因为它需要更多的时间。不要发送元素、样式或其他与html相关的东西。你应该在客户方面这样做。以保持服务器的灵活性。

mysql到json

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


现在,查看注释,您可以使用NODEJS:)

使用webSockets什么都用它。忘记ajax,用websocket做任何事情!!!!!双向通信。并且您只发送所需的数据。没有请求,没有标头。。。没有慢东西。

支持

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

如果这是一个问题,就不要使用这些技术。在ie6上使用jQuery允许ajax也是一个笑话。。。。

顺便说一句,现在ff,即opera,android,safari,ios,甚至那些浏览器的4-5年前的版本都支持ajax,websocket&SSE

webSockets

我真的很喜欢php,mysql-nnginx-apache。。。但是nodejs、websocket&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侧。。。。

https://github.com/websockets/ws

查看CCD_ 13或将数据单独发送给每个用户。