You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法为$_SESSION变量赋值并在表单中回显?

问题:表单无法回显$_SESSION变量(姓名字段除外)

我遇到一个问题:尝试将$_SESSION变量echo到表单时,这些变量似乎为空,但‘Név’(姓名)字段可正常显示(该字段数据来自数据库的另一张表)。我希望当数据库中已设置对应值时,$_SESSION变量能回显到表单中,这样用户仅更新单个字段时,其他字段内容不会被修改。


相关代码片段

personal.inc.php

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

    require_once 'dbh.inc.php';
    require_once 'getpersonal.inc.php';


    if (isset($_POST["submit_personal"])) {
        $birthdate = $_POST["birthdate"];
        $bio = $_POST["bio"];
        $dailyTime = $_POST["chintime"];
        $favChin = $_POST["favchin"];
        $ownsChinchilla = $_POST["owns_chinchilla"];
        $loveTime = $_POST["year_selector"];
        $userID = $_SESSION["id"];
        $new_name = $_POST["name"];

        $nameUp = "UPDATE user_form SET name='$new_name' WHERE id='$userID'";
        $conn->query($nameUp);

        $checker = "SELECT COUNT(*) FROM personal WHERE userID = '$userID'";
        $result = mysqli_query($conn, $checker);
        $row = mysqli_fetch_array($result);

        if ($row[0] > 0) {
            $stmt = $conn->prepare("UPDATE personal SET bio = ?, birthDate = ?, dailyTime = ?, loveTime = ?, favChin = ?, owner = ? WHERE userID = ?");
            $stmt->bind_param("ssssssi", $bio, $birthdate, $dailyTime, $loveTime, $favChin, $ownsChinchilla, $userID);
        } else {
            $stmt = $conn->prepare("INSERT INTO personal (userID, bio, birthDate, dailyTime, loveTime, favChin, owner) VALUES (?, ?, ?, ?, ?, ?, ?)");
            $stmt->bind_param("issssss", $userID, $bio, $birthdate, $dailyTime, $loveTime, $favChin, $ownsChinchilla);
        }

        getPersonal($conn);

        $stmt->execute();

        $stmt->close();
        $conn->close();
    }

    header("location: user.php");
    exit();
?>

getpersonal.inc.php

<?php
    require_once 'dbh.inc.php';

    function dataExists($conn, $userID) {
        $sql = "SELECT * FROM personal WHERE userID = ?;";
        $stmt = mysqli_stmt_init($conn);
        if (!mysqli_stmt_prepare($stmt, $sql)) {
            header("location: login.php?error=stmtfailed");
            exit();
        }

        mysqli_stmt_bind_param($stmt, "s", $userID);
        mysqli_stmt_execute($stmt);

        $resultData = mysqli_stmt_get_result($stmt);

        if ($row = mysqli_fetch_assoc($resultData)) {
            return $row;
        } else {
            $result = false;
        }

        mysqli_stmt_close($stmt);
        return $result;
    }

    function getPersonal($conn) {
        $dataExists = dataExists($conn, $_SESSION["id"]);

        $_SESSION["bio"] = $dataExists["bio"];
        $_SESSION["favChin"] = $dataExists["favChin"];
        $_SESSION["owner"] = $dataExists["owner"];
        $_SESSION["birthDate"] = $dataExists["birthDate"];
        $_SESSION["dailyTime"] = $dataExists["dailyTime"];
        $_SESSION["loveTime"] = $dataExists["loveTime"];
    }
?>

HTML表单代码

<form method="post" action="personal.inc.php">
                <label>
                    <div class="namer">
                        <span class="identifier">Név:</span>
                        <input class="inner" type="text" name="name" placeholder="Itt módosíthatod a neved..." value="<?php echo $_SESSION["name"];?>">
                    </div>
                </label>
                <label>
                    <div class=dob>
                        <span class="identifier">Születési idő:</span>
                        <br>
                            <input class="inner" type="date" name="birthdate" value="<?php echo $_SESSION["birthDate"];?>">
                    </div>
                </label>
                <label>
                    <div class="bio">
                        <span class="identifier">Bio:</span>
                            <textarea class="inner" name="bio" width=400px height=230px placeholder="Mesélj magadról, hogy jobban megismerhessünk..." value="<?php echo $_SESSION['bio'];?>"></textarea>
                    </div>
                    
                </label>
                <label>
                    <div class=daily>
                        <span class="identifier">Napi csincsillával töltött idő:</span>
                        <br>
                        <select name="chintime" class="inner" value="<?php echo $_SESSION["dailyTime"];?>">
                            <option>Nincs csincsillám</option>
                            <option>Kevesebb, mint 1 óra</option>
                            <option>1-2 óra</option>
                            <option>3-5 óra</option>
                            <option>Több, mint 5 óra</option>
                        </select>
                    </div>
                </label>
                <label>
                    <div class="fav">
                        <span class="identifier">Kedvenc csincsilla a boltunkból:</span>
                        <div class=inner>
                            <select name="favchin" value="<?php echo $_SESSION["favChin"];?>">
                                <option>Mindet imádom!</option>
                                <option>Puffancs</option>
                                <option>Kókusz</option>
                                <option>Hamu</option>
                                <option>Nutella</option>
                                <option>Mochi</option>
                            </select>
                        </div>
                    </div>
                    
                </label>
                <label>
                    <div class="owner">
                        <span class="identifier">Van csincsillád?</span>
                        <div class=inner>
                            <select name="owns_chinchilla" value="<?php echo $_SESSION["owner"];?>">
                                <option>Nincs</option>
                                <option>Van</option>
                            </select>
                        </div>
                    </div>
                </label>
                <label>
                    <div class="longlove">
                        <span class="identifier">Mióta imádod a csincsillákat?</span>
                        <br>
                            <input class="inner" type="number" name="year_selector" id="year_selector" min="1900" max="2099" step="1" value="<?php echo $_SESSION["loveTime"];?>">
                    </div>
                </label>
                <button class="savebtn" type="submit" name="submit_personal"><i class="fa-solid fa-floppy-disk"></i><span>Mentés</span></button>
            </form>

当前问题表现

表单中除“Név(姓名)”字段外,其余字段无法回显$_SESSION中的值,显示为空。


$_SESSION["name"]的赋值代码

function loginUser($conn, $email_log, $password_log) {
        $emailExists = emailExists($conn, $email_log);

        if ($emailExists === false) {
            echo "<script>
                alert('Hiba! Az e-mail cím nem található!');
                window.location.href = 'login.php#log';
            </script>";
            exit();
        }

        $passwordHashed_log = $emailExists["password"];
        $checkPassword = password_verify($password_log, $passwordHashed_log);

        if ($checkPassword === false) {
            echo "<script>
                alert('Hibás jelszó!');
                window.location.href = 'login.php#log';
            </script>";
            exit();
        } else if ($checkPassword === true) {
            session_start();
            $_SESSION["id"] = $emailExists["id"];
            $_SESSION["email"] = $emailExists["email"];
            $_SESSION["name"] = $emailExists["name"];
            header("location: elerheto.php");
            exit();
        }
    }

问题修复方案

1. 调整getPersonal调用时机

在personal.inc.php中,你先读取数据到SESSION再执行数据库写入,导致拿不到最新数据。将getPersonal($conn)移到$stmt->execute()之后:

$stmt->execute();
getPersonal($conn);
$stmt->close();
$conn->close();

2. 处理dataExists返回false的情况

当用户无personal表数据时,直接访问数组会报错,给SESSION设置默认值:

function getPersonal($conn) {
    $dataExists = dataExists($conn, $_SESSION["id"]);

    if ($dataExists) {
        $_SESSION["bio"] = $dataExists["bio"];
        $_SESSION["favChin"] = $dataExists["favChin"];
        $_SESSION["owner"] = $dataExists["owner"];
        $_SESSION["birthDate"] = $dataExists["birthDate"];
        $_SESSION["dailyTime"] = $dataExists["dailyTime"];
        $_SESSION["loveTime"] = $dataExists["loveTime"];
    } else {
        $_SESSION["bio"] = "";
        $_SESSION["favChin"] = "Mindet imádom!";
        $_SESSION["owner"] = "Nincs";
        $_SESSION["birthDate"] = "";
        $_SESSION["dailyTime"] = "Nincs csincsillám";
        $_SESSION["loveTime"] = date("Y");
    }
}

3. 修正HTML表单语法错误

  • <textarea>无value属性,内容需放在标签内部:
<textarea class="inner" name="bio" style="width:400px; height:230px" placeholder="Mesélj magadról..."><?php echo isset($_SESSION['bio']) ? htmlspecialchars($_SESSION['bio']) : '';?></textarea>
  • <select>无value属性,给对应<option>加selected属性:
<select name="chintime" class="inner">
    <option <?php echo (isset($_SESSION["dailyTime"]) && $_SESSION["dailyTime"] == "Nincs csincsillám") ? 'selected' : '';?>>Nincs csincsillám</option>
    <!-- 其他选项同理 -->
</select>
  • 修正所有input标签的value属性闭合错误,确保格式为value="<?php echo ...;?>"

4. 页面加载时初始化SESSION

在显示表单的user.php顶部添加代码,确保页面加载时从数据库读取数据到SESSION:

session_start();
require_once 'dbh.inc.php';
require_once 'getpersonal.inc.php';
getPersonal($conn);

内容的提问来源于stack exchange,提问作者Blain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:37:00