Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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/8/file/3.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/7/symfony/6.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 持久URL参数_Php - Fatal编程技术网

Php 持久URL参数

Php 持久URL参数,php,Php,有没有一种方法可以在您点击时在整个站点中持久保存url参数?我正在一个演示站点上工作,该站点在第一页上设置一个url参数,以确定在接下来的页面上显示的内容。我会使用会话变量,但内部用户很可能会共享彼此之间的链接,而会话将不存在。我尝试过谷歌搜索,但返回的都是与php框架相关的文章,比如Cake。有没有一种不用框架就能实现的方法 流程示例: 选择页面>用户选择用例并按提交以查看演示站点 内部页面>检测URL参数并根据用例显示数据 当用户点击演示站点时,该参数将持续显示相关数据 当用户返回选择页面

有没有一种方法可以在您点击时在整个站点中持久保存url参数?我正在一个演示站点上工作,该站点在第一页上设置一个url参数,以确定在接下来的页面上显示的内容。我会使用会话变量,但内部用户很可能会共享彼此之间的链接,而会话将不存在。我尝试过谷歌搜索,但返回的都是与php框架相关的文章,比如Cake。有没有一种不用框架就能实现的方法

流程示例:

  • 选择页面>用户选择用例并按提交以查看演示站点
  • 内部页面>检测URL参数并根据用例显示数据
  • 当用户点击演示站点时,该参数将持续显示相关数据
  • 当用户返回选择页面时,他们可以选择一个新用例并重复上述操作

我认为最好的解决方案是将其初始选择存储在
$\u会话
变量中,然后简单地将该变量附加到整个站点结构的URL中,例如:

$url = (isset($_SESSION['use_case'])) ? $_SESSION['use_case'] : 'default';
echo 'my-page.php?use_case='.urlencode($url);

您只需在选择中添加一个url参数,并确保它始终位于所有内部链接中。我想你不想这么做,因为有太多的变化

一些替代想法:

想法1:

将初始选择保存在会话或cookie中。还为所有页面添加一个可选的url参数,该参数也保存所选内容。为了避免更改所有内部链接,请检查服务器端是否提供了selection url参数。如果不是,则立即重定向到相同的url,只需添加url参数(根据会话/cookie)。这样,url参数将始终显示,而不更改任何地方的所有内部链接,用户仍然可以共享链接

为了实现,我们假设会话变量是
$\u session['sel']
,可选的URL参数是
psel
。假设站点中的所有页面都是通过php提供的。以下几行php应该出现在所有页面的顶部(可以放在单独的php文件中,并包含在每个页面中):

这是伪代码,我在我的iPad上,所以请原谅,如果它有点短,不完美。这一行的作用是检查URL参数是否已定义,如果未定义,则重定向(到同一页面)并根据会话变量定义它。这样,即使我们有一个不包含URL参数的内部链接,这个重定向也会添加它。请求uri中有一个关于
的小错误,我会让您修复它

此代码不会更改所有内部链接,它所做的只是以下操作:当访问内部链接并省略URL参数时(正常情况下),此代码将停止显示没有参数的页面,并重定向到具有参数的同一页面

另一段重要的代码是在定义URL参数的情况下更改会话变量。这可以通过将此else块添加到上述代码中来实现:

else $_SESSION['sel'] = $_REQUEST['psel'];
这样,当URL由2个用户共享时,它将始终包含
psel
URL参数,当新用户首次访问它时,它将相应地设置他的会话变量

想法2:

为每个选择创建一个“假”目录。例如,假设您的站点是,然后您将拥有和。这些目录不是真实的,使用.htaccess重写(甚至在FS中使用符号链接)实际上会指向原始文件。除了,现在在路径中有了这个神奇的参数。这很有用,因为路径在所有相对链接中保持不变,这意味着您不必更改所有内部链接。如果需要访问当前选择,可以通过解析当前url的路径轻松地获得它

我认为这个想法更好一点,因为它在没有重定向的情况下实现了同样的效果。使用符号链接进行解释是最容易的,但请记住,使用.htaccess重写规则也可以做到这一点。Linux中的符号链接是链接到另一条路径的路径。如果我运行以下控制台命令(通常在服务器上使用SSH):

它将在内部创建2个目录。(本地目录),命名为sel1和sel2,但它们只是指向原始当前目录的链接。如果此当前目录是我的web服务器文档根目录,其效果是访问:

http://example.com/sel1/index.php
将实际访问:

http://example.com/index.php
请注意,这不是目录的副本。如果我对index.php或本地目录中的任何其他文件进行更改,这些更改也将反映在
/sel1
/sel2

这有什么帮助?如果我想显示选择2,我将使用URL
http://example.com/sel2/index.php
。由于符号链接,此URL的行为将与我的原始网站完全相同
http://example.com/index.php

现在,假设我想在php中检查是否显示选择2,我只需检查变量
$\u SERVER['REQUEST\u URI']
,看看它是否包含路径
/sel2


此路径将在所有内部URL之间保持持久性,因为它们通常是相对的。

如果只是基于案例的问题,您可以在$\u会话上设置案例,只需为每个案例使用一个开关即可


您描述的是cookies,但它们不会出现在URL中

对于您的用例,最佳解决方案是URL中的路径前缀和相对链接,正如talkol在其第二个想法中所描述的。只要保持链接的相对性,就不需要在服务器端做任何额外的工作

第二种选择是使用输出缓冲URL重写器(请参阅),解析应用程序生成的输出并替换链接。但这有点愚蠢。当您有大型应用程序并且不想修改它时,这是合理的

所有其他
http://example.com/sel1/index.php
http://example.com/index.php