Программа, которая переписывает саму себя (гостевуха)

Опубликовано 5 ноября, 2009 в PHP

Нашло вдохновение, потратил полчаса и накатал гостевую книгу в 1 файл.  Эта гостевая книга отличается от остальных тем, что она действительно однофайловая. Тоесть вообще, совсем, даже без файла базы данных, один php файл. Данные программа хранит в самой себе. Сразу под кодом. При каждом обращении к index.php, программа берет содержание самой себя (это ведь тестовый файл), выбирает данные из последней строки (там сериализованный массив), выводит в нужном виде пользователю. Если пользователь захочет добавить сообщение, программа опять же открывает и дописывает саму себя. Идея показалась интересной. Написал за 30 минут, даже не искал ошибки, вроде работает, ну и ладно. Код старался максимально сжать, получилось 23 строки PHP и HTML кода, можно и еще сжать, но думать над этим уже лень.

Идея, как и реализация, скорее шуточная, поэтому не рекомендую использовать эту прелесть на рабочих сайтах, какой бы она вам не показалась милой :)

Функции гостевой книги:

  1. Добавление сообщений.
  2. Постраничный вывод.

Итак, вот код единственного файла 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. Обязательно оставьте свой!
Игорь 11.12.2009 в 16:12

Прикольно. А почему не стоит?

Игорь 11.12.2009 в 16:17

Не стоит использовать всмысле

pistol 11.12.2009 в 16:58

Ну, если заменить file_put_contents на fopen\flock\итд, то вполне можно использовать :) Начиная c PHP 5.0.5, насколько я знаю, и file_put_contents использует блокировку.

Игорь 11.12.2009 в 20:53

ммм..не стоило всмысле безопасности. Вообще такую вещь удобно иногда использовать просто как записную книжку :)

Игорь 11.12.2009 в 21:14

На JS такое можно организовать?

pistol 11.12.2009 в 21:25

>> На JS такое можно организовать?
Нет.

anton 08.03.2011 в 19:34

Много приколюх и приличный заработок, заходи улыбнёт – http://lexxa.ucoz.ru

Ваш комментарий: