【问题标题】:Passing values with $_SESSION使用 $_SESSION 传递值
【发布时间】:2015-12-31 12:37:35
【问题描述】:

我在通过$_SESSION 传递元素值时遇到问题

<?php
  session_start();
?>
<?php
  echo "<table>";
  $con = mysql_connect("localhost","root","") or die ("problem");
  mysql_query("SET NAMES 'utf8'", $con);
  mysql_select_db("dedomena");
  $query = mysql_query("SELECT * FROM posts");

  $i = 1;

  while($query_row = mysql_fetch_assoc($query)) {

    echo  "<tr><td onclick='myFunction($i)'><a
           href='page.php'>".$query_row['title']."</a></td><td>$i</td>";
    $i = $i + 1;    
  };

  echo "</table>";
?>
<script>
  function myFunction($i) {
    alert(x);
    <?php
      $_SESSION["id"] = $i;
    ?>
  }
</script>

page2.php上的代码是

<?php
  session_start();
?>
<?php
  echo $_SESSION["id"];
?>

当我点击第一页上的一个元素时,我得到了正确的 id 但是当我尝试将值传递到第二页时,它只显示数字 10! 注意:数字 10 显然是因为 $i + 1 循环 但是我该如何解决呢?

【问题讨论】:

  • 大错特错!!
  • 您希望在第 2 页上打印什么 id?是否取决于点击了哪个标题?
  • don't use mysql_*; mysql_* 函数已过时、deprecated 且不安全。请改用MySQLiPDO
  • 找一个关于ajax的教程..

标签: php database session


【解决方案1】:

您不能通过 JS 在客户端执行服务器端代码。遇到您的问题,您可以通过字符串查询将其发送到 php

**此问题的最佳解决方案是字符串查询**

while($query_row = mysql_fetch_assoc($query)) {

    echo  "<tr><td><a
    href='page.php?id='.$i>".$query_row['title']."</a></td><td>$i</td>";
    $i = $i + 1;    
    }

page2.php

<?php
id=$_REQUEST['id'];
echo $id;
?>

或者如果对会话使用 ajax 很严格。下面是带有 iframe(不带 ajax)的作弊解决方案

<?php
echo "<table>";
$con = mysql_connect("localhost","root","") or die ("problem");
mysql_query("SET NAMES 'utf8'", $con);
mysql_select_db("dedomena");
$query = mysql_query("SELECT * FROM posts");

$i = 1;

while($query_row = mysql_fetch_assoc($query)) {

echo  "<tr><td onclick='myFunction(i)'><a
href='page.php'>".$query_row['title']."</a></td><td>$i</td>";
$i = $i + 1;    
}

echo "</table>";
?> 
function myFunction(i) {
alert(i);
var html='';
    html +='<div id="fakeDiv">';
    html +='<form action="setSession.php" method="post"  id="fakefrm" target="ifk">';
    html +='<input type="hidden" name="jsvar" id="jsvar" value="'+val+'"/>';
    html +='</form>';
    html +='</div>';
    html +='<iframe name='ifk'style='display:none;></iframe>';
    var c=document.createElement('div');
    document.body.innerHTML += html;
    document.getElementById('fakefrm').submit();
    document.body.removeChild(document.getElementById('fakeDiv'));
}

setSession.php

<?php
session_start();
$_SESSION['id']=$_POST['jsvar'];
?>

在你的项目中添加 setSession.php..

注意 - 事实上,如果我很快看到这个答案,我会对此投反对票,但这个答案对于一个不知道“ajax”这个名字的人来说是一个瞬间的解脱

【讨论】:

    【解决方案2】:
    <script>
    function myFunction($i) {
    alert(x);
    <?php
    $_SESSION["id"] = $i;
    ?>
    }
    </script>
    

    您试图在 javascript 中包含 php 代码,认为当点击事件发生时您将在客户端更改 php 全局变量。这不是正确的方法。

    会话用于保存会话变量。您正在使用会话将 GET 参数传递给服务器。会话变量不能从客户端更新,因为它们没有暴露给客户端。

    PHP 中的会话: SESSION 超全局的内容不能更改。它存在于服务器上,客户端无法访问它。

    但是,会话 id 会传递给客户端,这样当客户端与服务器联系时,服务器就知道要使用哪个会话。可以更改此值,以允许用户使用其他人的会话。

    【讨论】:

    • 你能推荐一种将 $i 值传递到另一个页面的最简单方法吗?
    • 作为 GET 参数传递给 href : echo " ".$query_row['title']." $i";在 page2.php 中以 $_GET['id'] 的形式访问它
    【解决方案3】:

    但是你想要做什么? php是服务器端语言,javascript是客户端。您必须执行 ajax 调用才能传递值 ID。

    【讨论】:

    • 根据 SO 指南,应该是评论你在回答中发表了什么
    【解决方案4】:

    正如 brute_force 已经提到的,问题是

    <?php
    $_SESSION["id"] = $i;
    ?>
    

    此代码在页面发送给用户之前在服务器端执行。这就是 PHP 和 javascript 之间的区别:javascript 在运行时执行,同时加载页面,但是页面中的 PHP 是为了加载页面而执行的,所以在你的 while 循环中将 SESSION["id"] 设置为 10,然后,在上述代码中,放入SESSION 变量。 为了在运行时获取会话中的变量,您必须在服务器上创建对 PHP 脚本的请求,然后将其放入 SESSION。看看 (jQuery) ajax,这是在这种情况下最简单的解决方案。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2011-09-09
      • 1970-01-01
      • 2016-04-28
      • 2016-05-06
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 2017-06-03
      相关资源
      最近更新 更多