Базы данных или файлы? Перед тем как сесть писать новый скрипт вы точно хоть раз, но задумывались ? писать его с использованием баз данных(БД) или все так же, как привыкли ? на файлах? Эта статья на примере гостевой книги поможет вам сделать выбор в правильную сторону. Как мы работаем с файлами? Заранее условимся, что функция file() это упрощение того, что описано ниже? Работать с файлами легко. Это делается примерно в 3 этапа: 1. Открыл файл 2. Считал всю(или часть) информацию 3. Закрыл файл Теперь(с точки зрения скрипта) мы имеем просто кучу символов разделенных переводом строки. Делаем разбиение по строкам и получаем уже массив строк файла. Но заранее, когда мы создавали файл, мы условились, что данные будут разделены символом ?|?. 1. a) Павел б) pavel@mail.ru в) 43284343 г) Привед, классный у тебя сайтик?! 2. а) Александра б) alex-sashka@gmail.com в) 384323 г) Приветик, кот?нок, суперовый сайтик! 3. а) Евгений б) gg_potstolom@pochta.ru в) 11132342 г) ЫЫЫ... Здарова, чертяко! a) ? имя посетителя ? адрес почтового ящика c) ? номер ICQ d) ? сообщение Теперь перебирая каждую строку, разбиваем е? на ?подстроки?. Зная позицию каждой подстроки, мы можем сказать где находиться имя посетителя, а где его сообщение. Дело за малым ? вывести все красиво на страницу. Чтобы добавить сообщение нам нужно: 1. Открыть файл для добавления 2. Записать в конец данные 3. Закрыть файл Еще нам нужно следить за тем, чтобы в файл попали данные без специального, условленного символа-разделителя ? ?|? и данные без ?перевода строки?! Итак, мы формируем строчку вида: ?имя пользователя?|?адрес почты?|?номер ICQ?|?сообщение? Сохраняем в файл и радуемся жизни! Как выглядит работа с файлами в Php-коде: <html> <head> <title>Пример гостевой книги на файлах</title> </head> <body> <form action="?action=add_post" method="post"> <p>* Имя посетителя:</p> <p><input name="name" type="text"></p> <p>* Электронная почта:</p> <p><input name="email" type="text"></p> <p>ICQ:</p> <p><input name="icq" type="text"></p> <p>* Сообщение:</p> <p><textarea name="message" rows=5 cols=20></textarea></p> <p><input type="submit" value="Добавить сообщение"></p> </form> <?php if( @$_GET['action'] == "add_post" ) // Если мы хотим добавить сообщение { if( !empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) ) // Проверяем на наличие обязательных данных { // Удаляем запрещенные символы $name = str_replace('|', '!', htmlspecialchars(strip_tags($_POST['name']))); $email = str_replace('|', '!', htmlspecialchars(strip_tags($_POST['email']))); $icq = str_replace('|', '!', htmlspecialchars(strip_tags($_POST['icq']))); $message = str_replace('|', '!', htmlspecialchars(strip_tags($_POST['message']))); $fp = @fopen ("guestbook.txt", "a+"); // Открываем файл для добавления в конец if( @fwrite ($fp, "$name|$email|$icq|$messagen") ) // Проверяем на успешность записи в файл { print "<p style='color:green;'>Сообщение успешно добавлено!</p>"; } @fclose ($fp); // Закрываем файл } else { print "<p style='color:red;'>Введены не все данные!</p>"; } } ?> <hr> <?php $fp = @fopen ("guestbook.txt", "r"); // Открываем файл для чтения $gb_content = @fread($fp, filesize("guestbook.txt")); // Читаем все символы из файла @fclose ($fp); // Закрываем if( !empty($gb_content) ) { $gb_content = split("n", $gb_content); // Разбили на строки for( $i=0; $i<count($gb_content)-1; $i++ ) { list( $gb_name, $gb_email, $gb_icq, $gb_message ) = explode('|', $gb_content[$i]); // Разбиваем на подстроки и получаем соответствующие данные // Выводим сообщение print "<p style='color:blue;'><a href='mailto:$gb_email'>$gb_name</a> ICQ: $gb_icq</p>n"; print "<p>$gb_message</p>n"; print " n"; } } else { print "Гостевая, увы, пуста!"; } ?> </body> </html> Как мы работаем с базой данных(БД)? Что бы работать с БД нам необходим хостинг с поддержкой хотя бы MySQL. В этом конечно виден явный минус БД, но все по порядку? Работать с БД не так уж и сложно, как это представляется начинающим программистам! Главное научиться составлять запросы(а это просто как 2*2), и не бояться столкнуться с десятком новых терминов. БД работает почти точно так же как и файлы: 1. Открываем БД 2. Читаем/записываем данные 3. Закрываем Главным отличием является то, что мы получаем не кучу символов, а уже упорядоченный массив данных! То есть мы не морочим себе голову вопросами ? ?А какой поставить разделитель??, ?Как разбить на подстроки??, ?Каким по порядку идет поле, к примеру, номер ICQ??, ?Как отфильтровать входные данные на предмет перевода строки??. Вс? это уже предусмотрено базой данных? Созда?м БД, в ней таблицу guestbook с соответствующими полями: 1) ? имя посетителя 2) ? адрес почтового ящика 3) ? номер ICQ 4) ? сообщение Заполняем данными? Получаем: +——-+———+——-+——————-+ | Имя | Email | ICQ | Сообщение | +——-+———+——-+——————-+ | Павел | pav... | 123232| Привет.. | +——-+———+——-+——————-+ | Лелик | lelik.. | 23232 | Здароф.. | +——-+———+——-+——————-+ ...................................... Осталось только соедениться с БД и сделать запрос на выборку данных: SELECT * FROM guestbook Слово SELECT означает операцию ?чтения? данных. Символ ?*? ? что нам нужны поля: ?имя посетителя?, и ?почтовый адрес?, и ?номер ICQ?, и ?сообщение?, В общем все данные. FROM guestbook ? означает, что данные мы хотим прочитать из таблицы ?guestbook?. Грубо говоря таблица ? это и есть файл. Чтобы записать данные в БД просто выполняем запрос: INSERT INTO guestbook(?имя посетителя?, ?адрес почтового ящика?, ?номер ICQ?, ?сообщение? ) VALUES (?Иван?, ?ivan@sobaka.ru?, ?123456?, ?Я Иван! Повелитель гостевых книг!?) INSERT ? говорит нам, что это операция вставки, ?guestbook? ? таблица для вставки, дальше перечислены поля в которые необходимо записать данные, VALUES ? означает что дальше идет перечисление самих данных через запятую. Этой операции вполне достаточно чтобы в гостевой книге появилась новая запись. Как выглядит работа с БД в Php-коде: Прежде чем опробовать код вам нужно создать БД с названием guestbook. В этой БД создать таблицу guestbook с полями id, name, email, icq, message. Или просто выполнить SQL запрос: CREATE TABLE `guestbook` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR( 50 ) NOT NULL , `email` VARCHAR( 70 ) NOT NULL , `icq` VARCHAR( 10 ) NOT NULL , `message` TEXT NOT NULL , PRIMARY KEY ( `id` ) ); Код гостевой: <html> <head> <title>Пример гостевой книги с использованием БД</title> </head> <body> <form action="?action=add_post" method="post"> <p>* Имя посетителя:</p> <p><input name="name" type="text"></p> <p>* Электронная почта:</p> <p><input name="email" type="text"></p> <p>ICQ:</p> <p><input name="icq" type="text"></p> <p>* Сообщение:</p> <p><textarea name="message" rows=5 cols=20></textarea></p> <p><input type="submit" value="Добавить сообщение"></p> </form> <?php $db = mysql_connect('localhost', 'root', ''); // Подключаемся к базе данных mysql_select_db('guestbook', $db); // Выбираем таблицу guestbook с которой будем работать if( @$_GET['action'] == "add_post" ) // Если мы хотим добавить сообщение { if( !empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) ) // Проверяем на наличие обязательных данных { // Удаляем запрещенные символы $name = htmlspecialchars(strip_tags($_POST['name'])); $email = htmlspecialchars(strip_tags($_POST['email'])); $icq = htmlspecialchars(strip_tags($_POST['icq'])); $message = htmlspecialchars(strip_tags($_POST['message'])); // Формируем запрос для добавления $query = "INSERT INTO guestbook(name, email, icq, message) VALUES ('$name', '$email', '$icq', '$message')"; $result = mysql_query( $query, $db ); // Выполняем запрос if( $mysql_error = mysql_error( $db ) ) // Если возникли какието ошибки, то выводим их { print $mysql_error; } else { print "<p style='color:green;'>Сообщение успешно добавлено!</p>"; } } else { print "<p style='color:red;'>Введены не все данные!</p>"; } } ?> <hr> <?php // Формируем запрос на получение данных $query = "SELECT * FROM guestbook"; $result = mysql_query( $query, $db ); // Выполняем запрос if( mysql_num_rows( $result ) > 0 ) // Проверяем колличество полученных строк { while( $gb_content = mysql_fetch_array( $result ) ) // Читаем по-очереди каждую строку { // Выводим сообщение print "<p style='color:blue;'><a href='mailto:$gb_content[email]'>$gb_content[name]</a> ICQ: $gb_content[icq]</p>n"; print "<p>$gb_content[message]</p>n"; print " n"; } } else { print "Гостевая, увы, пуста!"; } ?> </body> </html> Про безопасность Львиную долю времени занимает обеспечение безопасности скрипта. То есть зачем нам скрипт, если его легко могут вывести из строя? Ситуация с файлами обстоит плачевна? Иногда забывают ?закрывать? файлы от чтения из вне и вс? содержимое гостевой, а может и списка зарегистрированных пользователей с паролями и почтовыми адресами попадает в руки к злоумышленникам. Забывают экранировать ввод нового сообщения и вся информация в гостевой превращается в кашу? Базы данных тоже не лишены недостатков. Если программист не проверяет передаваемые из формы данные на правильность, то злоумышленник спокойно может прочитать, к примеру, список всех пользователей, или зайти под другим ником. Данный вид хака называется SQL Injection. Работы в улучшении защиты уже ведутся давно. Например, в библиотеке DbSimple от DKLab это решено с помощью placeholder-ов. Выводы Я, например, работаю с БД, выбирая тем самым безопасность и структурированность моих данных, но и не отрицаю использование файлов. Например, есть хорошие способы хранения данных в файлах: 1. Использование функций serialize() и unserialize() 2. Хранение в ini-файлах Иногда приходиться пользоваться и такими способами. Список литературы для углубленного изучения 1. Основы работы с MySQL в PHP 2. "Работа с MySQL в PHP: с чего начать?" 3. Работа с MySQL в PHP: подробно (PHP, MySQL, веб-программирование) 4. Обучающая статья от ведущего разработчика phpMyAdmin Марка Делисла 5. Работа с MySQL: Подробнее(Как формировать запросы) 6. Библиотека DbSimple от DKLab Статьи не сильно объемные и не займут много времени, но зато ваш exp значительно возрастет. Для тех, кто привык читать документы MS Word.