PHP网站跨页面会话无法延续问题排查与解决
PHP跨页面会话无法延续问题的排查与解决
开发的PHP网站出现跨页面会话无法延续的问题:登录页通过POST验证密码后,将用户名存入$_SESSION['uziv_jmen']并跳转主页;主页和个人资料页都已在开头调用session_start(),但进入个人资料页后无法输出会话中的用户名。尝试常规方案(所有页面开头开启会话)无效,最终通过在输出代码块内再次调用session_start()并添加会话存在性判断解决问题。
相关代码与数据库结构
登录页面代码
<?php include '../conn.php'; session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { //pokud post tak se joinu na server a vezmu si data z formu $username = $_POST['prihlas_jmeno']; $heslo = $_POST['heslo']; $query = "SELECT id_osoba, username FROM osoba WHERE heslo=?"; //praprava rikazu $stmt = $conn->prepare($query); $stmt->bind_param("s", $heslo); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows == 1) { //pokud prave jeden vysledek podle zadanych dat tak to hodim jako session promennou $_SESSION["uziv_jmen"] = $username; header("Location: https://project.skolakrizik.cz/~borysmandrovnyy/index.php"); //poslu se na index page } else { echo "Nastala chyba"; //pokud neco nepofachalo } } else { echo "Invalid request method"; //pokus by to bylo poslanou jinou metodou než post } $stmt->close(); //zavřu statement $conn->close(); //zavřu connection ?>
主页会话开启代码
<?php session_start(); ?>
个人资料页原代码
<?php session_start(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="view" content="width=device-width, initial-scale=1.0"> <title>Můj účet</title> <!-- DotGothic16 --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=DotGothic16&display=swap" rel="stylesheet"> <!-- Monsterrat --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet"> <!-- ___ --> <link rel="stylesheet" href="mmMYaCCXDXD.css"> <?php include 'conn.php';?> </head> <body> <a href="../index.php"> <p class="button">Zpět na hlavní stránku</p> </a> <!-- <div class="user-info-box"> <h2>Vaše údaje:</h2> <p><strong>Username:</strong> user123</p> <p><strong>Name:</strong> John</p> <p><strong>Surname:</strong> Doe</p> </div> --> <div class="user-info-box2"> <h2>Vaše údaje:</h2> <?php // $_SESSION["uziv_jmen"]; //echo "<p><strong>" . "Username:" . "</strong>" . $_SESSION["uziv_jmen"] . "</p>" echo "<p><strong>" . "Uživatel:" . "</strong>" . $_SESSION["uziv_jmen"] . "</p>"; //$sql = "SELECT jmeno,prijmeni FROM osoba WHERE username='$username'"; //$result = $conn->query($sql); //$row = $result->fetch_assoc(); //echo "<h1>" . $row["jmeno"] . "</h1>"; //echo "<h1>" . $row["prijmeni"] . "</h1>"; ?> </div> <a href="../zmenaHesla/zHesla.php"> <p class="button" id="zMENA">Změna hesla </p> </a> </body> </html>
数据库结构
-- MySQL Script generated by MySQL Workbench -- Mon May 20 18:03:42 2024 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- ----------------------------------------------------- -- Schema borysmandrovnyy -- ----------------------------------------------------- DROP SCHEMA IF EXISTS `borysmandrovnyy` ; -- ----------------------------------------------------- -- Schema borysmandrovnyy -- ----------------------------------------------------- CREATE SCHEMA IF NOT EXISTS `borysmandrovnyy` DEFAULT CHARACTER SET utf8 ; USE `borysmandrovnyy` ; -- ----------------------------------------------------- -- Table `borysmandrovnyy`.`osoba` -- ----------------------------------------------------- DROP TABLE IF EXISTS `borysmandrovnyy`.`osoba` ; CREATE TABLE IF NOT EXISTS `borysmandrovnyy`.`osoba` ( `id_osoba` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(45) NOT NULL, `jmeno` VARCHAR(10) NOT NULL, `prijmeni` VARCHAR(45) NOT NULL, `telefon` VARCHAR(45) NOT NULL, `email` VARCHAR(45) NOT NULL, `heslo` VARCHAR(45) NOT NULL, `vek` INT NOT NULL, `zeme` VARCHAR(45) NOT NULL, `mesto` VARCHAR(45) NOT NULL, `ulice` VARCHAR(45) NOT NULL, `cislo_popisne` VARCHAR(45) NOT NULL, PRIMARY KEY (`id_osoba`), UNIQUE INDEX `id_osoba_UNIQUE` (`id_osoba` ASC) VISIBLE, UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE, UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `borysmandrovnyy`.`obrazek` -- ----------------------------------------------------- DROP TABLE IF EXISTS `borysmandrovnyy`.`obrazek` ; CREATE TABLE IF NOT EXISTS `borysmandrovnyy`.`obrazek` ( `idobrazek` INT NOT NULL AUTO_INCREMENT, `nazev` VARCHAR(45) NOT NULL, `cesta` VARCHAR(255) NOT NULL, PRIMARY KEY (`idobrazek`), UNIQUE INDEX `idobrazek_UNIQUE` (`idobrazek` ASC) VISIBLE) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `borysmandrovnyy`.`produkt` -- ----------------------------------------------------- DROP TABLE IF EXISTS `borysmandrovnyy`.`produkt` ; CREATE TABLE IF NOT EXISTS `borysmandrovnyy`.`produkt` ( `id_produkt` INT NOT NULL AUTO_INCREMENT, `nazev` VARCHAR(45) NOT NULL, `cena` FLOAT NOT NULL, `kategorie` VARCHAR(45) NOT NULL, `novinka` TINYINT NOT NULL, `stav` TINYINT NOT NULL, `akce` TINYINT NOT NULL, `obrazek_idobrazek` INT NOT NULL, PRIMARY KEY (`id_produkt`), UNIQUE INDEX `idprodukt_UNIQUE` (`id_produkt` ASC) VISIBLE, INDEX `fk_produkt_obrazek1_idx` (`obrazek_idobrazek` ASC) VISIBLE, CONSTRAINT `fk_produkt_obrazek1` FOREIGN KEY (`obrazek_idobrazek`) REFERENCES `borysmandrovnyy`.`obrazek` (`idobrazek`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `borysmandrovnyy`.`kosik` -- ----------------------------------------------------- DROP TABLE IF EXISTS `borysmandrovnyy`.`kosik` ; CREATE TABLE IF NOT EXISTS `borysmandrovnyy`.`kosik` ( `idkosik` INT NOT NULL AUTO_INCREMENT, `osoba_id_osoba` INT NOT NULL, PRIMARY KEY (`idkosik`), UNIQUE INDEX `idkosik_UNIQUE` (`idkosik` ASC) VISIBLE, INDEX `fk_kosik_osoba1_idx` (`osoba_id_osoba` ASC) VISIBLE, CONSTRAINT `fk_kosik_osoba1` FOREIGN KEY (`osoba_id_osoba`) REFERENCES `borysmandrovnyy`.`osoba` (`id_osoba`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `borysmandrovnyy`.`kosik_polozky` -- ----------------------------------------------------- DROP TABLE IF EXISTS `borysmandrovnyy`.`kosik_polozky` ; CREATE TABLE IF NOT EXISTS `borysmandrovnyy`.`kosik_polozky` ( `idkosik_polozky` INT NOT NULL AUTO_INCREMENT, `kosik_idkosik` INT NOT NULL, `produkt_id_produkt` INT NOT NULL, `pocet` INT NULL, PRIMARY KEY (`idkosik_polozky`), UNIQUE INDEX `idkosik_polozky_UNIQUE` (`idkosik_polozky` ASC) VISIBLE, INDEX `fk_kosik_polozky_kosik1_idx` (`kosik_idkosik` ASC) VISIBLE, INDEX `fk_kosik_polozky_produkt1_idx` (`produkt_id_produkt` ASC) VISIBLE, CONSTRAINT `fk_kosik_polozky_kosik1` FOREIGN KEY (`kosik_idkosik`) REFERENCES `borysmandrovnyy`.`kosik` (`idkosik`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_kosik_polozky_produkt1` FOREIGN KEY (`produkt_id_produkt`) REFERENCES `borysmandrovnyy`.`produkt` (`id_produkt`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
解决代码
将个人资料页中输出会话的代码块替换为以下内容:
<?php session_start(); if (isset($_SESSION["uziv_jmen"])) { echo "User ID: " . $_SESSION["uziv_jmen"]; } else { echo "No user is logged in."; } ?>
问题原因推测
推测问题与服务器会话管理机制有关,可能是页面开头的session_start()在某些场景下未正确初始化会话环境,在输出代码块内再次调用session_start()后,会话状态被正确加载,从而解决了跨页面会话无法延续的问题。
内容的提问来源于stack exchange,提问作者Borys Mandrovnyy
相关产品推荐
相关产品推荐

