Проблема с реализацией гостевой книжки на 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 шт):

Автор решения: Ипатьев

С точки зрения обучения, испльзование файлов - прекрасная практика. Так что код имеет право на жизнь.

Но его можно улучшить по нескольким направлениям.

  1. Убрать бессмыленный код. просто пройдись по коду глазами и убери из него остатки предыдущих попыток (подсказка - переменная $messages)
  2. Убрать повторяющийся код. Зачем ты делаешь htmlspecialchars и перед записью, и перед выводом. Зачем ты пишешь код вывода два раза? Почему бы не вынести код вывода из условия, если он все равно должен выполняться в любом случае?
  3. Со временем надо обязательно переписать это на использование БД, PDO с sqlite будет прекрасным выбором.
  4. Ну и по мелочи
    • foreach(file($message) as $count => $line) { даст тебе переменную $count без необходимости определять ее специально
    • Зачем здесь if ($_POST['email']){? А что будет если емейл пустой?
    • если уж выводишь ошибку, то пиши конкретно: неправильный емейл.
    • использовать GLOB_NOSORT неправильно. Надо убрать этот флаг, и просто отсортировать массив с файлами в обратном порядке. Только такой вариант ганатирует вывод в правильном порядке. Порядок файлов в директори может меняться.
→ Ссылка