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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:52:02