Задать вопрос
@nikitonik
Начинающий программист

Нуждаюсь в code review, что не так с кодом?

Гостевая книга. Что не так, что исправить?

Отображаю сообщения полученные из базы данных (использую MySQL).
Если страница запрашивается пользователем с IP от 127.0.0.0 - 127.255.255.255 (или «:: 1/128», в случае ipv6), значит - это админ (отображаю ссылку «Удалить сообщение» под сообщением с адресом: «index.php? Act = del & id = ...»)
Форма добавления отображается под списком сообщений. Если данные введены правильно, добавляю новую запись с соответствующими данными в таблицу. Иначе отображаю: «Ошибка при добавлении вашего сообщения».
Если в сценарий передается GET-параметр «act» и его значение равно «del», то есть также параметр id и номер в нем - удаляю запись из гостевой книги с соответствующим идентификатором, после отображаю сообщение об успешном удалении и обновленный список сообщений.

Код:
<?php
    $ip = $_SERVER["REMOTE_ADDR"];
    $dsn = "mysql:host=localhost;dbname=guestbook";
    $pdo = new PDO($dsn, "root", "");
    $sqlTable = "CREATE TABLE `messages` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `author` varchar(255) DEFAULT NULL,
            `email` varchar(255) DEFAULT NULL,
            `message` varchar(255) DEFAULT NULL,
             PRIMARY KEY (`id`)
          ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8";
    
    $createTable = $pdo->prepare($sqlTable);
    $createTable->execute();
    if(!empty($_GET['act'])){
        if($_GET['act'] == 'del') {
        $idToDelete = $_GET['id'];
        $sqlDelete = "DELETE FROM messages WHERE id = ?";
        $delete = $pdo->prepare($sqlDelete);
        $delete->execute([$idToDelete]);
        echo "<script> alert('Message was successfully deleted')</script>";
        header("Refresh: 0; index.php");
    } else {
        echo "<script> alert('Error while deleting your message')</script>";
    }}
    if(!empty($_GET['button'])){
    if (trim($_GET["author"]) != '' && trim($_GET["message"]) != '' && trim(filter_var($_GET["email"], FILTER_VALIDATE_EMAIL)) != '') {
        $message = $_GET["message"];
        $name = $_GET["author"];
        $email = filter_var($_GET["email"], FILTER_VALIDATE_EMAIL);
        $sqlAdd = "INSERT INTO messages(author, email, message) VALUES (:author, :email, :msg)";
        $query = $pdo->prepare($sqlAdd);
        $query->execute(["author" => $name, "email" => $email, "msg" => $message]);
    } else {
        echo "<script> alert('Error while adding your message') </script>";
    }}
    
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Guestbook</title>
    
</head>
<body>
    <div class="container">
        <div class="messages">
            <?php
                $data = $pdo->query("SELECT * FROM messages");
                while($row = $data->fetch(PDO::FETCH_OBJ)) { 
                    $id = $row->id;
                    $name = htmlspecialchars($row->author);
                    $email = htmlspecialchars($row->email);
                    $msg = htmlspecialchars($row->message);
                    ?>
                    <div class="msg-place">
                        <p class="name"><?php echo $name ?></p>
                        <a class="email" href="mailto:<?php echo $email?>"><?php echo $email?></a>
                        <p class="message"><?php echo $msg ?></p>
                        <?php
                        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
                            if(ip2long($ip)>=ip2long("127.0.0.0") && ip2long($ip)<=ip2long("127.255.255.255")) { ?>
                                <a class="delete-btn" href="index.php?act=del&id=<?php echo $id ?>">Delete message</a>
                        
                            <?php }} 
                            if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
                                $ipv6 = count(str_split($ip));
                                $finalIP = "";
                                if ($ipv6<6) {
                                    for($i = 2; $i<$ipv6;$i++) {
                                        $ipv6Final = $ip[$i];
                                        $finalIP = $finalIP.$ipv6Final;
                                    }
                                
                                if ($finalIP>=1 && $finalIP<=128) { ?>
                                   <a class="delete-btn" href="index.php?act=del&id=<?php echo $id ?>">Delete message</a>
                               <?php } ?>
                    </div>
            <?php }}} ?>
        </div>
        <div class="input">
            <form class="enter-data" action="index.php" method="get">
                <textarea class="message-inp" name="message" placeholder="Enter your message" required></textarea>
                <input class="inp" name="author" type="text" placeholder="Enter your name" required>
                <input class="inp" name="email" type="text" placeholder="Enter your email address" required>
                <input class="submit-btn" name="button" value="Send" type="submit">
            </form>
        </div>
    </div>
</body>
</html>

Заметки:
Использую метод GET в форме для добавления сообщения.
Храню все сообщения в таблице «messages» в БД с именем «guestbook».
IP-адрес пользователя, хранящийся в $ _SERVER ['REMOTE_ADDR']
Использую PHP PDO для доступа к базе данных MySQL.
Использую localhost в качестве имени сервера БД, root в качестве пользователя, secretPass в качестве пароля.
На странице, которую создает скрип есть форма для ввода нового сообщения гостевой книги. Она содержит следующие данные: имя с [имя = «автор»], электронная почта с [имя = «электронная почта»]. Для сообщения использую . Использую [name = «button»] для кнопки отправки формы.
Все поля обязательны для заполнения. Электронная почта должна быть дополнительно проверена с помощью filter_var функции с FILTER_VALIDATE_EMAIL фильтром.
При отображении сообщений из гостевой книги все текстовые данные обрабатываются перед выводом функцией htmlspecialchars , которая преобразует специальные символы html в их эквиваленты html (например, «<» будет заменен на <), что не позволит злоумышленнику выполнить произвольный HTML-код в вашем приложении.
Адрес электронной почты отображается в виде ссылки (сам адрес ссылки должен быть в формате: mailto: $ email , где $ email - это адрес электронной почты автора сообщения).
Отображаю ошибки с помощью JS-метода alert ().
  • Вопрос задан
  • 222 просмотра
Подписаться 2 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@dimuska139
Backend developer
То, как Вы все реализовали, называется Flat PHP. Такой код невозможно поддерживать, развивать или хотя бы просто покрыть тестами. Я бы порекомендовал взять какой-нибудь более-менее известный фреймворк, и эту же функциональность реализовать в нем. По крайней мере, ознакомитесь с шаблонами проектирования. Если говорить конкретно про Ваш код, то переделать надо все. Начиная с отделения шаблона от логики и заканчивая вынесением в конфигурационный файл приватных данных для подключения к СУБД. И, кстати, зачем вам в скрипте код создания таблицы?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы