将SESSION变量添加到URL

时间:2017-01-18 06:19:18

标签: php session

我网站上的用户有一个主页,其中包含所有详细信息,可通过以下网址访问。所有细节都是通过会话变量收集的,因此没有变量传递到URL中,但我不希望这样。

网址如下所示

Traceback (most recent call last): File "C:\Program Files (x86)\JetBrains\PyCharm 2016.3\helpers\pydev\pydevd.py", line 1596, in <module> globals = debugger.run(setup['file'], None, None, is_module) File "C:\Program Files (x86)\JetBrains\PyCharm 2016.3\helpers\pydev\pydevd.py", line 974, in run pydev_imports.execfile(file, globals, locals) # execute the script File "C:\Program Files (x86)\JetBrains\PyCharm 2016.3\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/v-zhaom/OneDrive/speakerRNN/main.py", line 5, in <module> speakerTagger.main() File "C:/Users/v-zhaom/OneDrive/speakerRNN\speakerChangeTagger\tagger.py", line 152, in main self.model = RecurrentModel(self.args, self.textData) File "C:/Users/v-zhaom/OneDrive/speakerRNN\speakerChangeTagger\RecurrentModel.py", line 29, in __init__ self.buildNetWork() File "C:/Users/v-zhaom/OneDrive/speakerRNN\speakerChangeTagger\RecurrentModel.py", line 36, in buildNetWork context_vectors = self._buildUttNetwork(last_outputs) File "C:/Users/v-zhaom/OneDrive/speakerRNN\speakerChangeTagger\RecurrentModel.py", line 136, in _buildUttNetwork tf.while_loop(cond=my_cond, body=add_inputs, loop_vars=[idx]) File "C:\Python35\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2636, in while_loop result = context.BuildLoop(cond, body, loop_vars, shape_invariants) File "C:\Python35\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2469, in BuildLoop pred, body, original_loop_vars, loop_vars, shape_invariants) File "C:\Python35\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 2441, in _BuildLoop next_vars.append(_AddNextAndBackEdge(m, v)) File "C:\Python35\lib\site-packages\tensorflow\python\ops\control_flow_ops.py", line 635, in _AddNextAndBackEdge v = ops.convert_to_tensor(v) File "C:\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 669, in convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) File "C:\Python35\lib\site-packages\tensorflow\python\framework\constant_op.py", line 176, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name) File "C:\Python35\lib\site-packages\tensorflow\python\framework\constant_op.py", line 165, in constant tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape)) File "C:\Python35\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 360, in make_tensor_proto raise ValueError("None values not supported.") ValueError: None values not supported.

我希望它看起来像这样

http://localhost/account/users

例如

http://localhost/account/users/$_SESSION["username"]

我知道这可以使用http://localhost/account/users/ethan来完成,但是如何使用会话变量呢? URL中的变量不会执行任何外观的操作。

1 个答案:

答案 0 :(得分:0)

从你的问题来看,你想要的并不是很清楚,因此我有点撇开我的答案。

从URL

设置会话变量

据我所知,没有直接可以从URL设置会话变量。这会将整个会话概念视为服务器端数据,仅由会话ID引用。

假设你有一个脚本users.php。您基本上可以致电http://[...]/account/users.php?username=[...]。使用以下脚本,您可以将$_GET超全局变量分配给$_SESSION超全局。

<?php
    session_start();
    $_SESSION['username'] = $_GET['username']
    [...] //whatever you'll want to do
?>

使用网址重写,您可以将网址简化为http://[...]/account/users/[...]

无论如何,你应该确保你知道自己在做什么。无论如何,当你传递用户名时,我在这里看不到$_SESSION的优点。 你可能想做一些输入验证。这不应该允许访问相应的用户应该有权访问的资源。

只显示用户页面

当您只想显示用户页面时,您并不真正需要$_SESSION超全球,而只需要$_GET,就像我上面写的那样。请考虑以下脚本

<?php
    $user = get_user_by_name($_GET['username']);
    display_user_page($user);
?>

无需开课。只需在运行中从db加载用户数据并打印出用户页面。

将用户名传递给URL

基于此引用

  

网址中的变量不会做任何可能只是用于外观的内容。

我想这就是你想做的事情。以及如何实现这种取决于。

如果在PHP脚本的某处生成链接,这很简单。只需将$_SESSION['username']添加到链接中的网址,然后创建相应的重写规则,即可将您重定向到account/users

如果您希望能够拨打http://[...]/account/users并将浏览器移至http://[...]/account/users/username,则会更复杂一些。首先,您必须有一个重写规则,将http://[...]/account/users/username指向某种http://[...]/account/users.php?username=username。如果用户名为空,则从$_SESSION获取当前用户名,创建<meta http-equiv="refresh" content="0; URL=http://[...]/account/users/$username">标记以将浏览器指向正确的地址。如果用户名不为空,则只显示用户页面。

  

我知道这可以使用$ _GET来完成,但是如何使用会话变量呢?

由于根本没有使用变量,所以实际上可以使用整个事物而不使用$_GET。您将有两个脚本

// users_redirect.php
<?php
    start_session();
    $username = $_SESSION['username'];
    echo "<meta http-equiv='refresh' content='0; URL=http://[...]/account/users/$username'>";
?>

和第二个显示用户页面

<?php
    $user = get_user_by_name($_SESSION['username']);
    display_user_page($user);
?>

当然,您必须在服务器中设置正确的URL重写规则才能调用正确的脚本。

只是旁注

你应该用心去学习不同的概念。 GETSESSION不仅不同,而且根本不同。看起来好像你在这里混淆了很多,你应该得到正确的基础知识,而不是完全搞砸了。