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
为什么在PHP中使用JavaScript进行位置更改是一种糟糕的做法?_Javascript_Php_Redirect - Fatal编程技术网

为什么在PHP中使用JavaScript进行位置更改是一种糟糕的做法?

为什么在PHP中使用JavaScript进行位置更改是一种糟糕的做法?,javascript,php,redirect,Javascript,Php,Redirect,在堆栈溢出问题上,经常会出现这样一个问题:如何在输入时或值被更改后重定向用户,在PHP中,标准的答案是修改标题以实现这一点 然而,在PHP中,在发布任何html或文本之前,必须在开始时修改标题 因此,我定期发布自己的个人解决方案,如下所示: “如果要执行重定向,请结束PHP标记并编写以下内容: <script> location.replace("Whatever.php"); </script> location.replace(“Whatever.php”)

在堆栈溢出问题上,经常会出现这样一个问题:如何在输入时或值被更改后重定向用户,在PHP中,标准的答案是修改标题以实现这一点

然而,在PHP中,在发布任何html或文本之前,必须在开始时修改标题

因此,我定期发布自己的个人解决方案,如下所示:

“如果要执行重定向,请结束PHP标记并编写以下内容:

 <script>
 location.replace("Whatever.php");
 </script>

location.replace(“Whatever.php”);
然后最后再次拿起PHP标记来完成代码。”

每次我发布这个帖子,答案都被否决,几乎立刻被遗忘。然而,据我所知,它在整体上是有效的

所以我的问题是,为什么这次投票被否决得如此之多?使用这种备受反对的解决方案有什么意义

完整使用示例(不包括转义函数):

if(isset($\u GET['role']){//if值在GET中设置
$role=$\u GET['role']
如果($role==“Admin”){?>//删除PHP标记
location.replace(“AdminPage.php”);//解决方案
location.replace(“StandardPage.php”);//解决方案
//最后一次拿起标签并关闭isset。

首先,客户端可以关闭Javascript。因此,您的代码会立即被破坏

不要给客户任何机会改变或破坏你的工作流程


第二,糟糕的做法是因为不可管理。将它与样式、脚本和php代码分开。

仅仅因为它可以工作并不意味着你不应该选择更合适的方式。那么,你可能会问,为什么标题更可取

  • JavaScript可以被禁用,如果您因为需要授权而重定向(在您的示例中,看起来您是基于此重定向的),某人可以禁用JavaScript并查看该页面上的“秘密内容”,如果后端缺少授权检查,甚至可以通过链接触发操作(删除数据)
  • 如果使用头重定向,则在客户端获取头后会立即发生。不必传输任何内容(在某些情况下仍然可以,但在位置头之后使用
    exit;
    将防止这种情况发生)。这意味着最终用户的开销更少,反应速度更快

  • 如果你正在重定向一个用户,那么输出任何文本或html实际上没有任何意义,那么为什么你不做一个
    标题('Location…')
    不用等待浏览器呈现html,而是运行javascript,然后处理位置更改。但据我所知,您甚至不能在PHP中运行或测试条件,然后使用标题做出决定。这对我来说,位置更改的标题实际上是无意义的。“在PHP中运行或测试条件”这取决于您所谈论的条件。显然,您无法测试用户的桌面分辨率,但在您的示例中,您并没有显示这一点,您只是显示了测试一个GET参数,您可以在PHP中完全测试该参数,正如您已经显示的那样
    if(isset($_GET['role'])){ //If value set in GET
       $role = $_GET['role']
    
       if($role == "Admin"){ ?> // Drop PHP tag
    
       <script>location.replace("AdminPage.php");</script> //Solution
    
       <?php else{ ?>
    
        <script>location.replace("StandardPage.php");</script> //Solution
    
       <?php } } ?> //Pick up Tag final time and Close isset.