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

时间:2011-12-23 11:12:14

标签: php jquery ajax

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

我想避免使用php get函数并将查询字符串添加到我的网址

我正在考虑使用会话变量,但我需要帮助,我很确定无法做到这一点。

当访问者点击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  ?>

7 个答案:

答案 0 :(得分:1)

我认为你不能以简单的方式做你正在谈论的事情......传递数据的最佳方式是在url中,用$ _GET检索。

您可以使用while循环来回显单个表单,并在每个表单中将隐藏变量设置为$ name的值。然后你必须输出一个调用javascript函数的链接来提交该特定表单。在下一页上,您将能够从上一页表单中隐藏值提交的$ _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>;

然后在下一页($ url),您将使用php获取隐藏变量的值,如下所示:

$name = $_POST['value'];

再一次,这是一个奇怪的方式......

答案 1 :(得分:1)

您可以通过使用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>

    <? } 

现在,setSession将通过AJAX调用传递获得的值。然后可以通过简单的服务器端代码

将其保存为会话URL

与您的包含链接的网页在同一页面上显示的JavaScript代码

<script type='text/javascript'>
    function getXMLHTTPRequest() {
    try {
    req = new XMLHttpRequest();
    } catch(err1) {
      try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (err2) {
        try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (err3) {
          req = false;
        }
      }
    }
    return req;
    }



      var http = getXMLHTTPRequest();
       function setSession(value) {
    var myurl = "session.php";  // to be present in the same folder
     var myurl1 = myurl;
      myRand = parseInt(Math.random()*999999999999999);
      var modurl = myurl1+"?rand="+myRand+"url"+value ; // this will set the url to be sent

      http.open("GET", modurl, true);
      http.onreadystatechange = useHttpResponse;
      http.send(null);
    }


    function useHttpResponse() {
       if (http.readyState == 4) {
        if(http.status == 200) {
          var mytext = http.responseText;
          // I dont think u will like to do any thing with the response
          // u can redirect the user to the req page (link clicked), once the session url has been setted
            }
         }
         else {
             // don't do anything until any result is obtained
            }
        } 
</script>

要提供的PHP服务器端代码,以将所需的URL设置为会话值

<?php
session_start();
if($_SESSION['url']!=""){
unset($_SESSION['url']);   
$_SESSION['url'] = $_REQUEST['url'];  
}
else {
$_SESSION['url'] = $_REQUEST['url'];  
}
?>

答案 2 :(得分:1)

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

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

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

$name包含最后一个mysql结果行的名称。这显然不是你想要做的。

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

答案 3 :(得分:0)

在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  ?>

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

答案 4 :(得分:0)

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

如果仅在客户端上需要该信息,则应考虑使用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'];

您可以使用功能检测来回退旧浏览器:

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

如果你需要立即将值发送到服务器,你应该考虑使用ajax请求,就像Prashant Singh在他的回答中提到的那样。

我的示例使用自定义数据属性。我不确定您的名称值的内容,并且不清楚您的标记是什么样的。如果mysql中的名称在语义上符合attrbute,则可以使用name属性。或者,如果名称描述了列表与链接目标之间的关系,则可以使用rel属性。

答案 5 :(得分:0)

为此你需要两个文件

  1. index.php或用于显示链接的任何其他文件。
  2. 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 } ?>
    
  3. 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代码将是:

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

答案 6 :(得分:0)

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