Задать вопрос

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

У меня есть страница-шаблон, в которую добавляются данные согласно сессии. И у неё есть 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.
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
DevMan
@DevMan
проблема не в сессии, а в логике скрипта.
1. зачем while, если вы достаете одну запись?
2. если данные не получены, нужно показывать ошибку и прекращать выполнение или, хотя бы, обнулить ране сохраненные в сессии данные. вы же продолжаете заполнять шаблон старыми данными из сессии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽