Гостевая книга. Что не так, что исправить?
Отображаю сообщения полученные из базы данных (использую 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 ().