【问题标题】:PHP session variable related issuePHP会话变量相关问题
【发布时间】:2015-05-06 14:27:15
【问题描述】:

我在将会话变量的值从一页传输到另一页时遇到问题。我在 Windows 7 上使用最新的 XAMPP。

在这里你可以看到第一个和第二个 php 文件的代码。 http://pastebin.com/jQdQ4i7g | http://pastebin.com/UNA7QRyu

SNAP-1 SNAP-2

在 snap2 中,我没有得到我在第一页中存储的所有 3 个变量的值:

$_SESSION['city']=$city;
$_SESSION['movie']=$movie;
$_SESSION['date']=$date;

并在第二页中获取如下:

$city = $_SESSION['city'];
$city = $_SESSION['movie'];
$city = $_SESSION['date'];

那么,为什么我没有在第二页上获得这 3 个变量的值? 如果您需要任何其他信息,请告诉我。谢谢。

但正如您所见,这在任何页面上都可以正常工作!为什么?

<?php
$username = $_SESSION['myusername'];
echo "Welcome $username";
?>

【问题讨论】:

  • 不要使用旧的 MySQL 驱动程序,因为它已被弃用。不要开始会话两次。
  • 你能把这2个文件的代码显示一下吗
  • @RichardReiber 我删除了额外的 session_start();从我的代码,但它仍然无法正常工作。我正在使用最新的 XAMPP。
  • @sanjeev 请检查那些 pastebin 文件的代码。
  • 在顶部回显会话变量以查看您是否得到任何东西。

标签: php session-variables


【解决方案1】:

您的代码看起来像是 10 年前的。我建议使用更新的指南来学习。编程(或技术领域的任何东西)一直在变化。一年前的“学习如何编程”指南、书籍、博客或教程可能已经过时了。 MySQL 很久以前就已经被弃用了,意思是被杀掉了,不应该再使用了。使用 MySQLi 或 PDO。处理用户输入时,使用准备好的语句。如果你计划使用你的代码,它会被任何新手黑客攻击,因为它充满了 SQL 注入。您在 SQL 查询中使用原始 GET 数据。剥离斜线并不能真正保护你。即使在 10 年前,我们也使用 mysql_real_escape_string。

那和你的 doctype 让我觉得你下面的教程真的很老了。我不是 doctype 专家,所以我不知道 XHTML 1.0 是否适合在 HTML5 doctype 上使用。我只使用&lt;!doctype HTML&gt;。有关 HTML5 的更多信息:http://www.w3schools.com/html/html5_intro.asp

您的问题是您要开始会话两次。您应该收到一个错误,所以我认为您关闭了错误报告?在开发或调试时,将错误报告设置为 E_ALL 以显示所有错误。这将为您节省大量时间。这些错误是有原因的,让你知道你做错了什么。我在您的代码中没有看到它,因此请检查您的 php.ini 文件。我看过很多脚本,他们在其中放置“error_reporting(0)”来隐藏错误。这是一个糟糕的想法,而且只是懒惰。正确处理错误,您不必隐藏它们。

为什么要将所有内容都存储在 $_SESSION 中?如果您有一个用户填写的表单,并且您需要将该数据传递到另一个页面,则可以使用 $_GET 和 $_POST。

例子:

page1.php

<form action="page2.php" method="post">
    <input type="text" name="name" />
    <input type="submit" name="submit" value="Submit" />
</form>

page2.php

<?php
    if ( isset($_POST['name']) && ! empty($_POST['name]') ) {
        echo htmlspecialchars($_POST['name'], ENT_QUOTES);
    }
?>

将 php.ini 中的错误报告级别更改为 E_ALL。 只使用一次 start_session()!

这应该可以解决您的问题,并让您知道代码中的任何其他错误。我建议放弃 MySQL 并使用 MySQLi。对用户收到的数据使用准备好的语句。为您的表单使用 GET 或 POST,而不是将所有内容存储到 SESSION 中。如果您必须使用会话数据(即:保存数据以便在用户浏览其他页面(如购物车)时不会丢失数据),那么您可能需要创建一个数组并将其存储在会话中而不是大量会话变量。

$moviedata = array( 'city' => 'Miami', 'movie' => 'Avengers', 'date' => '05/22/2015');
$_SESSION['movie_data'] = $moviedata;

如果您只是将数据从表单传递到下一页,请使用 GET 或 POST 而不是 SESSION。

希望能引导您朝着正确的方向前进。

【讨论】:

  • Why are you storing everything in $_SESSION? 我正在使用 $_SESSION 因为我想要多个页面中的值。感谢您的回答,但这就像我更新我在 php 中的知识的指南。你的回答不能解决我的问题。 first.php 有什么问题?为什么我的会话变量在下一页上是空白的?我应该在代码中包含/排除什么才能使其正常工作?
  • 我确实回答了,你有两次session_start()!您的页面上有一个真正的错误,但由于您的错误报告级别,它被隐藏了。在一个页面上使用 session_start() 两次会产生一个headers have already been sent 错误! - pastebin.com/jQdQ4i7g 2 号线和 5 号线!
  • 您好,谢谢您,但也请阅读上面的 cmets。我已经删除了它,但它不起作用。
  • 那么请使用新代码更新您的问题。您是否在 php.ini 中检查过您的 PHP 错误报告级别?正如我已经说过的,您应该收到一个错误,并且您的页面根本不应该加载。由于您的页面已加载(但无法正常工作),这使我相信您的错误已被抑制。缺少冒号、逗号、引号或任何其他错误可能会导致更多问题。我们无需检查您的整个代码是否存在简单错误,而是您的错误报告会很容易地指出这一点。
  • 将其添加到两个 PHP 文件的第一行,在其他任何内容之前,甚至在 session_start() 之前。 error_reporting(E_ALL); - 这将(应该)设置您的错误报告级别以显示所有错误。如果您随后加载页面并看到错误,您就知道您的 php.ini 隐藏了它们。在这种情况下,您需要进入您的 XAMP 文件夹并找到您的 php.ini 文件,并找到错误报告行并将其更改为 E_ALL。然后修复它报告的错误。 - 我今晚有空的时候可能会重新编写你的小脚本,正确使用mysqli。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2014-10-10
  • 2012-05-19
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多