Как сделать запрет пустого шаблона?

У меня есть страница-шаблон, в которую добавляются данные согласно сессии. И у неё есть ID страницы. Самый максимальный ID в БД со значением 6, но если я в адресной строке меняю 6 на любое другое значение больше 6. Он шаблон заполняет такими же данными со страницы ID=6, но в адресной строке например ID=40. А если напрямую переходить на страницу с несуществующим ID, то он выводит пустой шаблон.

Для решения этой проблемы, я думаю написать код, который будет проверять значения в БД, и если нету такого значения, принудительно вызывать страницу 404. Но я понимаю, что это дичайший костыль. И не могу понять как это решается на других сайтах.

<?php
        session_start();

        error_reporting(E_ALL & ~E_NOTICE); //Убираем Notice, а все остальные ошибки выводим

        require_once 'connection.php';

        $dbh = new PDO('mysql:host=localhost; dbname=projectboard', $user, $pass);

        $projectID = $_GET['projectID'];

        $stmt = $dbh->prepare('SELECT headline, projectDescription, isRequired, communication, userID, offer FROM projects WHERE projectID = :projectID');
        $stmt->bindParam(':projectID', $projectID);
        $stmt->execute();

        while($result = $stmt->fetch(PDO::FETCH_OBJ)){
            $_SESSION['headline'] = $result->headline;
            $_SESSION['projectDescription'] = $result->projectDescription;
            $_SESSION['isRequired'] = $result->isRequired;
            $_SESSION['communication'] = $result->communication;
            $_SESSION['userID'] = $result->userID;
            $_SESSION['offer'] = $result->offer;
        }
        
    ?>

    <html lang="ru" dir="ltr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />        
        <link rel="stylesheet" href="project.css">
        <title><?php echo $_SESSION['headline'];?> | Проектная доска</title>
    </head>

    <body>
        <header>
            <?php
                echo $_SESSION['headline'];
            ?>
        </header>

        <section>
            <span class="projectDescription">
                <?php
                    echo $_SESSION['projectDescription'];
                ?>
            </span>

            <span class="isRequired">
                Требуется:
                <?php
                    echo $_SESSION['isRequired'];
                ?>
            </span>

            <section class="comAndOffer">
                <span class="communication">
                    Связаться:
                    <?php
                        echo $_SESSION['communication'];
                    ?>
                </span>

                <b>|</b>

                <span class="offer">
                    <?php
                        echo $_SESSION['offer'];
                    ?>
                    % от проекта
                </span>
            </section>

            <span class="autor">
                Автор:
                <?php
                    $id = $_SESSION['userID'];

                    $stmt = $dbh->prepare('SELECT name, lastname FROM users WHERE id = :id');
                    $stmt->bindParam(':id', $id);
                    $stmt->execute();           

                    while($result = $stmt->fetch(PDO::FETCH_OBJ)){
                        $_SESSION['name'] = $result->name;
                        $_SESSION['lastname'] = $result->lastname;
            
                        echo '<a href="office.php?id='. $_SESSION['userID'] .'">'. $_SESSION['name'].' '.$_SESSION['lastname'];?></a><br /><?php
                    }
                    ?>
            </span>

            <button onclick="document.location='projects.php'">Другие проекты</button>

            <form action="" method="post">
                <input type="submit" name="delete" class="delete" value="Удалить проект" />
            </form>

            <?php 
                if($_SESSION['userID'] == $_SESSION['id']){
                    if(isset($_POST['delete'])){
                        $stmt = $dbh->prepare('DELETE FROM projects WHERE projectID = :projectID');
                        $stmt->bindParam(':projectID', $projectID);
                        $stmt->execute();    

                        header ('Location: office.php?id='. $_SESSION['id']);
                        exit;
                    }
                }else{
                    echo '<script>document.styleSheets[0].insertRule("input, form { display: none; }", 0);</script>';
                }
            ?>


На сколько я понимаю проблемы в $_SESSION.
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
DevMan
@DevMan Куратор тега PHP
проблема не в сессии, а в логике скрипта.
1. зачем while, если вы достаете одну запись?
2. если данные не получены, нужно показывать ошибку и прекращать выполнение или, хотя бы, обнулить ране сохраненные в сессии данные. вы же продолжаете заполнять шаблон старыми данными из сессии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы