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

У меня есть страница-шаблон, в которую добавляются данные согласно сессии. И у неё есть 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.
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
DevMan
@DevMan
проблема не в сессии, а в логике скрипта.
1. зачем while, если вы достаете одну запись?
2. если данные не получены, нужно показывать ошибку и прекращать выполнение или, хотя бы, обнулить ране сохраненные в сессии данные. вы же продолжаете заполнять шаблон старыми данными из сессии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
от 300 000 до 500 000 ₽
07 мая 2024, в 23:27
1000 руб./за проект
07 мая 2024, в 22:37
25000 руб./за проект
07 мая 2024, в 22:24
7000 руб./за проект