【问题标题】:Session variables sending specific variable from a while loop会话变量从 while 循环发送特定变量
【发布时间】:2011-12-23 11:12:13
【问题描述】:

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

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

我正在考虑使用会话变量,但我需要帮助,而且我很确定这无法完成。

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

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

这个可以吗?

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

【问题讨论】:

  • 您可以设置会话变量(会话正常工作),但是您需要决定要设置哪个$name。只要用户没有点击任何你不知道的链接,所以我想知道你想如何解决这个问题。点击的标准是什么?
  • 如果他没有点击任何链接,也许我可以设置一个默认值。但这并不重要,因为我所有的链接都来自那个循环。因此,如果他想转到另一个页面,他必须单击其中一个链接。 Ty 等你的回复
  • 您希望避免“php get 函数”?
  • 是的,为了 seo 目的,我想避免在我的 url 中使用查询字符串。而且我无法重写 url 导致变量一直在变化,所以 url 每天会更改 100 次以上,这对 seo 非常不利

标签: php jquery ajax


【解决方案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'];  
}
?>

【讨论】:

  • 非常喜欢,这个真的很有趣,会设置它看看是否有效。
  • hmm.. 如果您在某处遇到问题,请告诉我
  • 你能告诉我如何在其他页面上获取 setSession 值吗?泰
  • setSession 将是一个发出 AJAX 请求的 javascript 函数,我将为您编辑我的答案
  • 给定的 PHP 代码必须显示在同一文件夹中的 session.php 页面上
【解决方案2】:

我认为你不能以简单的方式做你所说的......传递数据的最佳方式是在 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'];

再一次,这是一种奇怪的方法......

【讨论】:

  • 有趣:) 非常。我知道简单的方法是通过 url,但我使用的是 wordpress 并且有漂亮的永久链接,放置一个会一直变化的变量会破坏我的 SEO
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 这就是问题所在 :(,我不知道如何确定特定链接已被点击。Ty
  • 您拥有的所有页面,它们是在同一个 PHP 文件中生成的(在 PHP 中有一个入口点)还是跨多个 PHP 文件?我问是因为您可以在单击链接并调用 PHP get 时设置会话变量。在菜单中,您只需要读出它(而不是设置它)。如果您可以在问题中添加如何组织页面,则应该可以回答。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    如果只需要客户端上的信息,你应该考虑使用 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 中的名称在语义上符合属性,则可以使用 name 属性。或者,如果名称描述了列表和链接目标之间的关系,您可以使用 rel 属性。

    【讨论】:

      【解决方案6】:

      为此,您需要两个文件

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

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

      【讨论】:

      • 非常喜欢,这个真的很有趣,会测试看看它是否有效。
      • 你也可以使用jquery ajax方法发送数据到set-session.php文件code $.ajax({ type: "POST", url: "set-session.php", data : "name="+linkName, 成功: function(html){ $("#results").append(html); } });
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        相关资源
        最近更新 更多