【问题标题】:PHP: session variable lost on clicking form submit button?PHP:单击表单提交按钮时会话变量丢失?
【发布时间】:2016-03-21 22:16:21
【问题描述】:

当我单击表单提交按钮会话变量丢失并显示会话未设置的消息。我有另一个困惑,它只有在我设置登录变量会话或在我网站的其他页面中设置的那些变量时才会出现问题。
当我在此页面顶部设置一些随机会话变量时,它可以正常工作并且会话变量不再丢失。我还检查了堆栈溢出中的其他一些相关链接,但没有找到解决方案

这里是addProduct.php页面的代码

        <?php

    //var_dump($_SESSION);
    if(!(isset($_SESSION['login']))) {

        echo "session is not set";
    }
    else {
        //header("location:index.php");
        echo "session is set";
        //$user_email=$_SESSION['user_email'];



    ?>
        <html>
        <body>

        <form action="addproduct.php" method="post">

            <input type="text" name="name" value="">
            <input type="submit" name="submit" value="submit">

        </form>


        </body>
        </html>
        <?php
        if(isset($_POST['submit']))
        {
            $name = $_POST['name'];
           // $_SESSION['user_email']=$_SESSION['user_email'];
            echo $name;
        }
        ?>
    <?php }
    ?>

index.php(头文件)页面的代码,我从这里进入这个页面

<?php
    session_start();
    include("db.php");
    ?>

    <html xmlns="http://www.w3.org/1999/html" xmlns="http://www.w3.org/1999/html">
    <head>
        <title>Home</title>
    </head>
    <body>

    <a href="index.php">Home</a></br></br>

    <?php if(isset($_SESSION['login']) ) {
    if($_SESSION['user_status']=="admin")
    {

    ?>
    <a href="index.php?page=addproduct">Post an Ad</a></br></br>
    <?php }
    }

    ?>

    <?php if(isset($_SESSION['user_fname']) && isset($_SESSION['user_lname']) && isset($_SESSION['user_email']))
    {
    ?>
    <a href="index.php"><?php echo $_SESSION['user_fname'] . " " . $_SESSION['user_lname'] . " " . $_SESSION['user_status']; ?></a></br></br>
    <?php
    }
    else
    {
    ?>
    <a href="login.php">Login</a></br></br>
    <a href="UserSignup.php">SignIn</a></br></br>
    <?php }
    if(isset($_SESSION['user_fname']) && isset($_SESSION['user_lname']) && isset($_SESSION['user_email']))
    {
    ?>
    <a href="logout.php">Logout</a></br></br>
    <?php }
    ?>
    <div id="content">
        <?php


        if(isset($_GET['page']))
        {
            $p=$_GET['page'];

            $page =  $p . ".php";
            //echo $page;
            if(file_exists($page))
            {include($page);
            }
            elseif($page=="")
                echo "this is home page";
            else
            {echo "Not found";}
        }

        else
        {
            include ("showAds.php");
        }
        ?>

    </div>










    </body>
    </html>

login.php代码

    <?php
    session_start();
    if(isset($_SESSION['user_fname']) && isset($_SESSION['user_lname']) && isset($_SESSION['user_email'])) {
        header("location:index.php");
        exit();
    }
        else
        {

    ?>

    <html>

    <head><title>Login</title></head>
    <body>
    <form action="login.php" method="post">
        <input type="email" name="user_email" placeholder="USER EMAIL" REQUIRED>
        <input type="password" name="user_password" placeholder="USER PASSWORD" REQUIRED>

        <input type="submit" name="Go" value="SUBMIT!" placeholder="USER NAME" REQUIRED>
        </br></br><a href="UserSignup.php">SignIn with new account</a></br>



    </form>

    <?php
    include("db.php");
    /*if(isset($_POST['Go'])) {    SIGNUP
        $user_name = $_POST['user_name'];
        $user_password = $_POST['user_password'];
        $user_email = $_POST['user_email'];
        echo $user_name . "<br>";
        echo $user_email . "<br>";
        echo $user_password . "<br>";
        $sql = "INSERT INTO user(user_name,user_email,user_password) VALUE ('$user_name','$user_email','$user_password')";
        if(mysqli_query($conn,$sql))
        {
            echo "stored";
            header("location:http://localhost/window.php");
        }
        else
        {
          die(mysqli_error($sql));
        }
    }*/
    if(isset($_POST['Go']))
    {
        $user_email = $_POST['user_email'];//real_escape_string
        $user_password = $_POST['user_password'];
        $login_query="SELECT * FROM user WHERE user_email='$user_email' AND user_password='$user_password'";
        $run=mysqli_query($conn,$login_query);
        if(mysqli_num_rows($run)>0)

        {
            $res = mysqli_query($conn, "SELECT * FROM ecommerce.user WHERE user_email='$user_email'");

            while ($record = mysqli_fetch_array($res)) {

                $_SESSION['user_fname']=$record['user_fname'];
                $_SESSION['user_lname'] = $record['user_lname'];
                $_SESSION['user_status'] = $record['user_status'];
                $_SESSION['user_id'] = $record['user_id'];
                $_SESSION['user_password'] = $record['user_password'];

            }


            $_SESSION['user_email']=$user_email;
            $_SESSION['login']="true";

           //echo $_SESSION['user_fname'] . $_SESSION['user_lname'];


            header("location:index.php");
            exit();
        }
        else
            echo "<p style='color: red; margin-top: -28px;'>User name or password incorrect</p>";
    }




    ?>

    </body>
    </html>
    <?php }?>

【问题讨论】:

  • 请更新文件名。
  • addProduct.php 是我遇到问题的文件。 index.php是头文件
  • header.file 是什么意思,在你访问会话变量之前,这个文件会被包含在addProduct.php 中吗?我猜不是!所以请尝试在addProduct.php中添加session_start();方法

标签: php mysql session


【解决方案1】:

您在另一个问题中显示的此错误被标记为与此问题完全相同:

存在:

注意:会话已经开始 - 忽略第 2 行 C:\xampp\htdocs\ecommerce\showAds.php 中的 session_start()

您未包含的showAds.php 页面(很可能)包含session_start();,应从该文件中删除。

index.php 有一个包含和session_start();

else
    {
        include ("showAds.php");
    }

所以您的 if 语句之一失败。

这就是您收到该错误的原因。

所有使用会话的页面都需要包含session_start();,并且应该是脚本的第一行,addProduct.php 中没有显示。

还要确保您没有在标题之前输出。如果是,请参阅以下内容了解如何修复它:

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

【讨论】:

  • 它开始工作但也显示错误Notice: A session had already been started - ignoring session_start() in C:\xampp\htdocs\ecommerce\addproduct.php on line 2
  • @ImranHasan 确保没有其他包含的文件。我建议你做的是在你的所有文件和你包含的文件中找到所有session_start(); 的实例。您需要从所有包含的文件中删除session_start();,并且只在加载的实际文件和脚本顶部使用session_start();,并确保在打开&lt;?php标签之前没有空格并且之前没有输出头也。包含的文件不应包含session_start();
【解决方案2】:

您必须在 addProduct.php 中添加 session_start(); 才能访问会话内容!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2012-04-11
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多