为何无法为$_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
相关产品推荐
相关产品推荐

