Проблема с реализацией гостевой книжки на php
Всем привет.
Я решил создать эдакого рода прообраз гостевой книжки, функционал которой пока что будет ограничиваться лишь добавлением нового сообщения (пока достаточно лишь разобраться с одним, случай с несколькими разберу позже), а также вывода всех файлов.
Сообщение вводится через html-форму и затем после получения данных выводится вместе с остальными в случае если email введён корректно (если нет - выводится "Error while adding your message").
Всё сообщение состоит из трёх или более строк, первая - для автора, вторая - для почты, остальные - для самого сообщения (причём его нужно обработать так, чтобы весь html-код был через htmlspeacilchars() ). Его нужно поставить в файл типа {текущее время в микросекундах через microtime()}.txt. Все такие лежат в папке messages.
Сам код, если что:
<?php
// Guestbook, Гостевая книга
if (!is_dir("messages")) {
mkdir("messages");
};
$messages = scandir("./messages/");
if (!$_POST) {
foreach (glob("./messages/*.txt", GLOB_NOSORT) as $message) {
$count = 0;
foreach(file($message) as $line) {
if ($count !== 1) {
echo htmlspecialchars($line) . '<br/>';
} else {
echo '<a href = "mailto:' . $line . '">' . $line . '</a><br/>';
};
$count += 1;
};
};
echo '<form action="index.php" method="post">
<p><input type="text" name="author" required /></p>
<p><input type="text" name="email" required /></p>
<p><textarea name="message" required></textarea></p>
<p><input type="submit" /></p>
</form>';
} else {
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) !== false) {
$author = htmlspecialchars($_POST['author']);
$email = htmlspecialchars($_POST['email']);
$msg = htmlspecialchars($_POST['message']);
$time = (int)(microtime(true) * 1000000);
$content = "$author\n$email\n$msg";
file_put_contents("./messages/$time.txt", $content);
array_push($messages, "./messages/$time.txt");
foreach (glob("./messages/*.txt", GLOB_NOSORT) as $message) {
$count = 0;
foreach(file($message) as $line) {
if ($count !== 1) {
echo htmlspecialchars($line) . '<br/>';
} else {
echo '<a href = "mailto:' . $line . '">' . $line . '</a><br/>';
};
$count += 1;
};
};
} else if ($_POST['email']){
echo 'Error while adding your message.';
};
};
?>
Подскажите, можно ли каким-либо образом улучшить этот код или, если имеются серьёзные недостатки, указать на них?
Заранее благодарю за ответ.
Ответы (1 шт):
С точки зрения обучения, испльзование файлов - прекрасная практика. Так что код имеет право на жизнь.
Но его можно улучшить по нескольким направлениям.
- Убрать бессмыленный код. просто пройдись по коду глазами и убери из него остатки предыдущих попыток (подсказка - переменная $messages)
- Убрать повторяющийся код. Зачем ты делаешь htmlspecialchars и перед записью, и перед выводом. Зачем ты пишешь код вывода два раза? Почему бы не вынести код вывода из условия, если он все равно должен выполняться в любом случае?
- Со временем надо обязательно переписать это на использование БД, PDO с sqlite будет прекрасным выбором.
- Ну и по мелочи
foreach(file($message) as $count => $line) {даст тебе переменную$countбез необходимости определять ее специально- Зачем здесь
if ($_POST['email']){? А что будет если емейл пустой? - если уж выводишь ошибку, то пиши конкретно: неправильный емейл.
- использовать GLOB_NOSORT неправильно. Надо убрать этот флаг, и просто отсортировать массив с файлами в обратном порядке. Только такой вариант ганатирует вывод в правильном порядке. Порядок файлов в директори может меняться.