会话变量从while循环发送特定变量
我有这个简单的while循环 ,它从mysql查询中检索数据并在我的主页上显示几个链接。
我想避免使用php get函数并将查询字符串添加到我的URL
我正在考虑使用会话变量,但我需要帮助,我很确定无法做到这一点。
当访问者点击while循环显示的几个链接时,该特定变量将在会话中设置。
在我的代码中,会话将始终发送最后一个var。
可以这样做吗?
<a href="https://stackoverflow.com/questions/8615348/session-variables-sending-specific-variable-from-a-while-loop/">
您可以通过使用javascript函数来完成您的操作,该函数将使AJAX请求将所单击的名称发送到服务器。 然后,服务器端代码将存储所需的会话变量
session_start(); // Start Session Variables $result = mysql_query("my query"); $name = ''; while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> echo $name; ?> }
现在,setSession将通过AJAX调用传递获得的值。 然后可以通过简单的服务器端代码将其保存为会话URL
与包含链接的页面在同一页面上显示的JavaScript代码
要存在的PHP服务器端代码,以将所需的url设置为会话值
我认为你不能以简单的方式做你正在谈论的事情……传递数据的最好方法是在url中,用$ _GET检索。
您可以使用while循环来回显单个表单,并在每个表单中将隐藏变量设置为$ name的值。 然后你必须输出一个调用javascript函数的链接来提交该特定表单。 在下一页中,您将能够从上一页表单中隐藏值提交的$ _POST变量中获取$ name的值…
但这需要javascript才能运行,而这只是一种奇怪的方式。
就像是:
echo ''; echo ''.$name.';
然后在下一页($ url),您将使用php获取隐藏变量的值,如下所示:
$name = $_POST['value'];
再说一次,这是一个奇怪的方式……
我无法告诉您如何解决问题,因为从您的问题中不清楚脚本将如何确定是否已单击特定链接。
但是,我发现你的代码存在缺陷。 您将会话变量始终设置为循环后的最后一个条目:
$_SESSION['name'] = $name; // Store session data
$name
包含最后一个mysql结果行的名称。 这显然不是你想要做的。
如果您在问题中提供了更多信息/代码,以确定如何确定已单击特定链接,则应该可以向您展示如何正确设置会话变量。
在while循环之前声明名称
session_start(); // Start Session Variables $result = mysql_query("my query"); $name = ''; while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> echo $name; ?> } $_SESSION['name'] = $name; // Store session data ?>
现在可以在名称中访问最后的值。
因此,当用户单击链接时,您希望在会话范围中存储值。 如何解决这个问题应该取决于用户点击时应该发生什么。 点击是否会导致导航和新的获取请求,还是只是在会话中注册名称值?
如果仅在客户端上需要该信息,则应考虑使用sessionStorage。 https://developer.mozilla.org/en/DOM/Storage#sessionStorage
使用jQuery,您可以像这样设置sessionStorage的值:
$('a').click(function(){ sessionStorage.setItem('name', $(this).attr('data-name'); });
…稍后访问:
sessionStorage.getItem('name');
请记住,旧浏览器不支持sessionStorage。 如果旧浏览器很重要,则可以使用cookie。 每次请求都会将Cookie发送到服务器,因此如果您在click事件中使用javascript进行设置,则该值将包含在下一个请求中,因此您可以从$ _COOKIE数组中读取它。
document.cookie = 'name=' + $(this).attr('data-name'); $value = $_COOKIE['name'];
您可以使用function检测来回退旧浏览器:
if(sessionStorage){ /* do the session storage part */ } else{ /* do the cookie part :) */ }
如果你需要立即将值发送到服务器,你应该考虑使用ajax请求,就像Prashant Singh在他的回答中提到的那样。
我的示例使用自定义数据属性。 我不确定您的名称值的内容,并且不清楚您的标记是什么样的。 如果mysql中的名称在语义上符合attrbute,则可以使用name属性。 或者,如果名称描述了列表与链接目标之间的关系,则可以使用rel属性。
为此,您需要两个文件
index.php文件中的jQuery代码
$("a.myUrl").click(function() { // Get the name from the link var linkName = $(this).text(); // Send Ajax request to set-session.php, // with linkName set as "name" in the POST data $.post("/set-session.php", {"name": linkName}); });
你的set-session.php文件中的php代码将是:
在我看来,使用cookie是实现您所需要的最便宜/最简单的方法。
只需将cookie设置为点击链接的URL即可; 然后,您可以在目标页面上检索它。
但这并没有回答这个问题:为什么你需要知道被点击的URL? 一旦用户点击链接,他们就会自动被带到被引用的页面。 一旦在页面上,您可以通过全局$ _SERVER [REQUEST_URI]变量获取页面的URL。 除非绝对需要,否则我建议将服务器内存保存为其他function。