Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript ajax调用执行PHP脚本_Javascript_Php_Ajax - Fatal编程技术网

使用javascript ajax调用执行PHP脚本

使用javascript ajax调用执行PHP脚本,javascript,php,ajax,Javascript,Php,Ajax,我有以下XMLHttpRequest: 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中获取一些数据,所有这些都可以正常工作。然而,由于我的后端

我有以下XMLHttpRequest:

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传输的目的,代理、防火墙、网关、负载平衡器等都可以检查并重新写入报头。您的自定义“参数”可能会被重新写入、删除或运行到其他标头的相同空间中

相反,我建议您使用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时,没有安全性。零

不久前我回答了一个问题。。。一旦你把它放到网上,你就真的没有什么可以隐藏的了。你唯一能做的就是骚扰黑客。仅仅使用原生XMLHttpRequest也会增加所有jQuery粉丝不了解您所做工作的可能性

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

演出

XMLHttpRequest它是本地的。。。因此,这是最快的方法

所有其他LIB都包含许多用户友好的检查,简化了所有操作。许多检查意味着性能损失

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

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

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

真的吗

不要那样做。这是不应该使用的。即使是静态文件也不行。Ajax是异步的!如果php文件的响应速度不够快,将导致用户浏览器崩溃。我所说的崩溃是指浏览器在加载ajax内容之前不会移动。因此,如果加载文件需要5秒钟,那么在5秒钟内你什么都不能做。鼠标/触摸事件也不起作用。每个动画元素都将被冻结。gifs/videos/cssstyles

如何发送参数

稍微安全一点。。。短参数,最佳性能??是的,首先使用发送的标题。但实际上,我认为变化不大,因为最终二进制数据的大小可能与通过GET&POST发送数据的大小相同

得到还是邮寄

如果最后发送头的安全性还不够,因此您希望以正常方式发送,那么只需要考虑一件重要的事情:需要发送多少数据。我喜欢邮递。。它允许发送更多数据。我过去经常这样做

var fd=new FormData(form);// this is the whole form including upload files.
ajax(url,callback,'post',fd);
JSON似乎不是很明显

我看不到有人提到他。没有JSON的Ajax是无用的。没有json的js&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

一些ppl可能会建议,phpajax可以处理压缩文件,甚至可以添加正确的mimetype

//header('Content-Type: application/json'); // not needed
echo json_encode($data);
但在这两种情况下都需要更多的时间。所以不要

让php文件尽可能简单。因为它需要更多的时间。 不要发送元素、样式或其他与html相关的内容。你应该这样做。使服务器保持敏捷

mysql到json

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

使用WebSocket。一切都要用它。 忘掉ajax,用websockets做任何事情!!!!!双向通信。您只发送所需的数据。没有请求,没有标题。。。没有慢的东西

支持

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

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

顺便说一句,现在ff、ie、opera、android、safari、ios甚至4-5年前的版本都支持ajax、websockets和SSE

网袋

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


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

这取决于您,如果您擅长javascript,那么这种方法很好,否则jquery ajax很方便!到底是什么问题?实际上没有真正的问题
据我所知。我的问题是如何找到一种适当的方式来考虑安全性、性能、语言使用等,因为我远不是一个有经验的开发人员。我已经读了很多关于如何使用nodejs、ruby-on-rails、php框架等开发服务器端应用程序的书。关于我的需求,这似乎完成了我需要完成的工作。谢谢根据您提供的代码和信息,我们无法判断您的实现是否良好。它主要取决于两个因素:Common::sanitize背后的代码是什么;以及:每个会话有多少个请求。你应该把更多的代码放在CodeReview Stackexchange平台上。这绝对不是关于清理内容,而是关于使用javascript、ajax和php请求内容。谢谢@coccoYou不应该通过HTTP头传递参数数据为什么不呢?你可以说是纯粹主义者。但是HTTP头是HTTP层用来正确传输其数据的。它有自己的用途,但不用于应用程序参数。为了HTTP传输的目的,代理、防火墙、网关、负载平衡器等都可以检查并重新写入报头。您的自定义“参数”可能会被重新写入、删除或运行到其他标头的相同空间中。应用层有各种各样的方法来传递其参数。为什么要冒险呢?打开一个大网站,查看标题。。舒尔的“获取日期”可能不合适。但另外一点是,顺便说一句,你应该在回答中加上这一点,因为评论被删除了,这是一个非常有效的观点。标题的滥用-我只是说它应该是什么,不应该是什么。当然,通过http头传递数据在某些方面是有效的。但对于新手来说,这不是我鼓励的。有很多自定义http头,但主要用于代理/网关/负载平衡器通信。新手应该远离或冒着调试时间过长的风险。此答案太长且令人困惑,它包含了很多个人意见,并没有真正提供有用的答案。您能更准确地说明什么是令人困惑的吗?所以我重新编辑了这一部分,我觉得这不是一个好的答案,因为OP问到了PHP,而你的回答是NodeJS。这些概念可能是可传递的,但是当OP甚至没有提到使用实时通信时,你会对WebSocket产生一种误解,有些信息是完全错误的。发送同步文件不会使用户浏览器崩溃。您肯定会阻止服务器,但这不会使浏览器崩溃,这只会破坏服务器的效率。不,这是错误的。所有的客户端操作都可以正常工作-最坏的情况下,客户端只会收到一个连接超时HTTP 500或一个上游错误HTTP 503(如果在转发代理之后)。这不会“使浏览器崩溃”,在这种程度上,你可以说任何未捕获的异常都会“使用户的浏览器崩溃”。这种方法的主要问题是,在发送同步文件时,服务器无法为同一线程上的其他任何人提供服务,并在等待I/O传输时阻塞。关键是,如果加载文件需要3秒钟,浏览器将被卡住3秒钟。没有使用、触摸甚至动画的事件。这是最糟糕的事情。Ajax同步
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);
//header('Content-Type: application/json'); // not needed
echo json_encode($data);
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);
};