Php 会话变量从while循环发送特定变量

Php 会话变量从while循环发送特定变量,php,jquery,ajax,Php,Jquery,Ajax,我有一个简单的while循环,它从mysql查询中检索数据,并在我的主页上显示几个链接 我希望避免使用PHPGET函数,并将查询字符串添加到我的URL中 我正在考虑使用会话变量,但我需要帮助,我很确定这是不可能的 当访问者单击while循环显示的几个链接中的一个链接时,该特定变量将在会话中设置 在我的代码中,会话将始终发送最后一个var 这能做到吗 <? session_start(); // Start Session Variables $result = mysql

我有一个简单的while循环,它从mysql查询中检索数据,并在我的主页上显示几个链接

我希望避免使用PHPGET函数,并将查询字符串添加到我的URL中

我正在考虑使用会话变量,但我需要帮助,我很确定这是不可能的

当访问者单击while循环显示的几个链接中的一个链接时,该特定变量将在会话中设置

在我的代码中,会话将始终发送最后一个var

这能做到吗

    <? session_start(); // Start Session Variables

    $result = mysql_query("my query");

    while($slice = mysql_fetch_assoc($result)){
        $url = $slice['url'];
        $name  = $slice['name']; ?>

        <a href="<? echo $url; ?>"><? echo $name; ?></a>

    <? } 

    $_SESSION['name'] = $name; // Store session data  ?>

在while循环之前声明名称

<? session_start(); // Start Session Variables

$result = mysql_query("my query");
$name = '';
while($slice = mysql_fetch_assoc($result)){
    $url = $slice['url'];
    $name  = $slice['name']; ?>

    <a href="<? echo $url; ?>"><? echo $name; ?></a>

<? } 

$_SESSION['name'] = $name; // Store session data  ?>


现在名称中可以访问最后的值。

我不认为您可以用一种简单的方式来做您所说的。。。传递数据的最佳方式是在url中,使用$\u GET检索

您可以使用while循环回显各个表单,并将每个表单中的隐藏变量设置为$name的值。然后,您必须输出一个调用javascript函数的链接以提交该特定表单。在下一页中,您将能够从上一页表单中的隐藏值提交的$\u POST变量中获取$name的值

但这需要javascript才能发挥作用,这只是一种奇怪的方式

比如:

echo '<form action="'.$url.'" method="post" name="myform1" id="myform1">';
echo '<input type="hidden" name="value" id="value" value ="'.$name.'">';
echo '</form>';
echo '<a onclick="document.forms['myform1'].submit();">'.$name.'</a>;

尽管如此,还是有一种奇怪的方法…

您希望做的事情可以通过使用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']; ?>

        <a href="<? echo $url; ?>" onclick='setSession(<? echo $url;?>);'><? echo $name; ?></a>

    <? } 


因此,当用户单击链接时,您希望在会话范围中存储一个值。如何解决这个问题应该取决于用户单击时应该发生什么。单击是导致导航和新的get请求,还是只是在会话中注册名称值

如果客户机只需要这些信息,就应该考虑使用SeScess存储。

使用jQuery,您可以像下面这样设置sessionStorage的值:

$('a').click(function(){
  sessionStorage.setItem('name', $(this).attr('data-name');
});
…并在以后访问它:

sessionStorage.getItem('name');
请记住,旧浏览器不支持会话存储。如果旧浏览器很重要,您可以使用cookies。COOKIE随每个请求一起发送到服务器,因此如果在click事件中使用javascript进行设置,则该值将包含在下一个请求中,因此您可以从$\u COOKIE数组中读取该值

document.cookie = 'name=' + $(this).attr('data-name');

$value = $_COOKIE['name'];
通过使用功能检测,您可以回退旧浏览器:

if(sessionStorage){ /* do the session storage part */ }
else{ /* do the cookie part :) */ }

如果您需要立即将值发送到服务器,您应该考虑使用Ajax请求,如Prashant Singh回答中提到的。


我的Axample使用自定义数据属性。我不确定名称值的内容,也不清楚标记的外观。如果mysql中的名称在语义上符合attrbute,那么可以使用name属性。或者,如果名称描述了列表和链接目标之间的关系,您可以使用rel属性。

我无法告诉您如何解决问题,因为您的问题不清楚脚本将如何确定是否单击了特定链接

但是,我发现您的代码中有一个缺陷。您将会话变量始终设置为循环后的最后一个条目:

 $_SESSION['name'] = $name; // Store session data
$name
包含最后一个mysql结果行的名称。这显然不是你想做的


如果您在问题中提供了有关如何确定已单击特定链接的更多信息/代码,则应该可以向您展示如何正确设置会话变量。

为此,您需要两个文件

  • index.php或用于显示链接的任何其他文件

  • set-session.php或设置会话变量的任何其他文件

    index.php文件上的php代码将是:

    <?php session_start();
    $result = mysql_query("my query");
    while($slice = mysql_fetch_assoc($result)){
    $url = $slice['url'];
    $name  = $slice['name']; ?>
    
    <a class="myUrl" href="<?php echo $url; ?>"><?php echo $name; ?></a>
    <?php } ?>
    
    <?php  $_SESSION['name'] = $_POST['name']; // Store session data  ?>        
    
    set-session.php文件中的php代码将是:

    <?php session_start();
    $result = mysql_query("my query");
    while($slice = mysql_fetch_assoc($result)){
    $url = $slice['url'];
    $name  = $slice['name']; ?>
    
    <a class="myUrl" href="<?php echo $url; ?>"><?php echo $name; ?></a>
    <?php } ?>
    
    <?php  $_SESSION['name'] = $_POST['name']; // Store session data  ?>        
    

    在我看来,使用cookie是实现所需的最便宜/最简单的方法
    只需将cookie设置为所单击链接的url;然后,您可以在目标页面上检索它
    但这并不能回答这个问题:为什么你需要知道被点击的URL?一旦用户点击链接,他们就会自动进入被引用的页面。
    进入页面后,您可以通过全局$\u SERVER[REQUEST\u URI]变量获取页面的URL。除非绝对需要,否则我建议为其他功能保存服务器内存。

    您可以设置会话变量(会话正常工作),但您需要决定要设置的
    $name
    。只要用户没有点击任何你不知道的链接,我想知道你想如何解决这个问题。点击的标准是什么?如果他没有点击任何链接,也许我可以设置一个默认值。但这并不重要,因为我所有的链接都来自这个循环。因此,如果他想转到另一个页面,他必须单击其中一个链接。Ty您的回复您希望避免“php获取函数”?是的,为了seo目的,我希望避免URL中的查询字符串。我不能重写URL,因为变量一直在变化,所以URL一天会变化100次以上,这对seoInteresting非常不利。我知道最简单的方法是通过url,但我使用wordpress,并且有很多永久链接,放置一个会一直更改的变量会破坏我的SEO。问题是:(,我不知道如何确定某个特定链接已被单击。TY你所有的页面都是在同一个PHP文件中生成的吗(在PHP中有一个入口点)或者它们跨越多个PHP文件?我这样问是因为你可以在点击链接并调用PHP get时设置会话变量。在菜单中,你只需要读出它(而不是设置它)。如果你可以在问题中添加
    $("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});
    });
    
    <?php  $_SESSION['name'] = $_POST['name']; // Store session data  ?>