Программа, которая переписывает саму себя (гостевуха)
Опубликовано 5 ноября, 2009 в PHPНашло вдохновение, потратил полчаса и накатал гостевую книгу в 1 файл. Эта гостевая книга отличается от остальных тем, что она действительно однофайловая. Тоесть вообще, совсем, даже без файла базы данных, один php файл. Данные программа хранит в самой себе. Сразу под кодом. При каждом обращении к index.php, программа берет содержание самой себя (это ведь тестовый файл), выбирает данные из последней строки (там сериализованный массив), выводит в нужном виде пользователю. Если пользователь захочет добавить сообщение, программа опять же открывает и дописывает саму себя. Идея показалась интересной. Написал за 30 минут, даже не искал ошибки, вроде работает, ну и ладно. Код старался максимально сжать, получилось 23 строки PHP и HTML кода, можно и еще сжать, но думать над этим уже лень.
Идея, как и реализация, скорее шуточная, поэтому не рекомендую использовать эту прелесть на рабочих сайтах, какой бы она вам не показалась милой
Функции гостевой книги:
- Добавление сообщений.
- Постраничный вывод.
Итак, вот код единственного файла index.php:
<?php
$file = file('index.php');
$database = unserialize(end($file));
if(strlen($_POST['name']) > 1 && strlen($_POST['text']) > 2 && strlen($_POST['name']) < 100 && strlen($_POST['text']) < 300) {
$database[] = array(str_replace(array("\n", "\r"), array('<br />', ''), htmlspecialchars($_POST['name'])), date('d.m.y'), str_replace(array("\n", "\r"), array('<br />', ''), htmlspecialchars($_POST['text'])));
$file[(count($file)-1)] = serialize($database);
file_put_contents('index.php', implode('', $file));
header('Location: index.php'); die();
}
echo '<html><head><title>Гостевая книга</title></head><style>body {background: #F4F4F4; fot-family: Tahoma;} a{color: #000;} .message {padding: 10px; margin: 10px; border: 2px dashed #1E1E1E;} input, textarea {width: 50%;} form {text-align: center;}</style><body>';
echo '<hr /><form action="index.php" method="post"><input type="text" name="name" value="Имя" /><br /><textarea name="text">Сообщение</textarea><br /><input type="submit" value="Добавить" /></form><br />';
if($database) {
$count = count($database);
$database = array_reverse($database);
$pages = ceil($count/10)*10;
if((int)$_GET['start'] > $pages) $start = 0; else $start = (int)$_GET['start'];
$messages = array_slice($database, $start, 10);
foreach($messages as $m) echo "<div class=\"message\"><div class=\"info\"><strong>$m[0]</strong> ($m[1])</div><p>$m[2]</p></div>";
}
for($i = 0; $i < $pages; $i = $i+10) echo "<a href=\"?start=$i\">[ c $i ]</a>";
echo '</body></html>';
die();
?>
a:1:{i:0;a:3:{i:0;s:4:"ТЕСТ";i:1;s:8:"05.11.09";i:2;s:55:"Если сообщение отображается, значит гостевуха работает.";}}
Прелесть, мне нравится, не смотря на бредовость
Комментариев: 7. Обязательно оставьте свой!
Прикольно. А почему не стоит?
Не стоит использовать всмысле
Ну, если заменить file_put_contents на fopen\flock\итд, то вполне можно использовать
Начиная c PHP 5.0.5, насколько я знаю, и file_put_contents использует блокировку.
ммм..не стоило всмысле безопасности. Вообще такую вещь удобно иногда использовать просто как записную книжку
На JS такое можно организовать?
>> На JS такое можно организовать?
Нет.
Много приколюх и приличный заработок, заходи улыбнёт –