А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/golos3/
Rambler's Top100
Пишем на PHP: Голосование (окончание)

Ну что, что вы от меня еще хотите? Чего вы ждете?

Две недели прошло, а вы все ждете, что я напишу продолжение голосовалки? Вернее, ее окончание? Да давно бы уже сами все написали, прислали, выложили на форум...

Кстати, у меня же теперь новый форум: forum.kurepin.ru!

Посмотрите, я убежден, что вам понравится. Он работает гораздо быстрее своего предшественника и написан понятным PHP. А разработчик -- ita-studio -- уже выдал мне право вносить в форум свои изменения. Что я и начал уже делать. Надеюсь, этот форум надолго приживется на новом месте. А если получится еще и приличная версия под моей редакцией, то вааще... :)

Так вот. Сегодня мы напишем php-часть для добавления голосов посетителей в базу голосования, а потом подумаем, как это можно полезно использовать.

Но сначала... традиционная задача. Сегодня задачу представляет помощник курса -- Виталий Манаков.

Задача состоит в следующем.

Представьте, что у вас есть на сайте поиск, который должен различать слова и фразы. Ну, действительно, бывает такое, что надо найти текст, содержащий отдельные слова и определенные фразы. Сам часто пользуюсь такими запросами на своем любимом поисковике.

Кстати, позвольте отступить от темы и сообщить всем, кто еще не в курсе, гугель -- самый правильный поисковик картинок. Вам нужно изображение какого-то предмета или фото определенного человека? Нет ничего проще. Заходите на www.google.com (он вас сам перебросит на ближайшее к вам зеркало), жмете на "картинки", вводите "Трактор Беларусь" или "Руслан Курепин" и тут же получаете массу изображений, связанных с тем, что попросили. Мои примеры, конечно, -- не самые популярные запросы, но и с ними Гугель справится без всяких вопросов, уж поверьте.

Вы знаете, как строится поисковый запрос с фразами? Надеюсь, что знаете. Но если не знаете, что я вас научу этому, но по большому секрету: для того, чтобы в запросе, состоящем из цепочки слов, выделить фразу -- надо эту фразу заключить в кавычки.

Значит, задачу можно сформулировать так.

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

Вот у этой задачи есть огромное количество решений. Причем, можно прибегать как к собственной изобретательности, так и к изучению мануала по PHP.

А теперь поворачиваемся ко всем задом, а к бараном -- передом, и давайте внесем в базу данных мнения посетителей сайта.

Если я ничего не забыл, то у нас на каждое мнение есть:

- ID мнения;
- ID оцененного текста;
- IP посетителя;
- email посетителя;
- время голосования;
- оценка числовая;
- оценка словесная (текст мнения);

Что ж... для добавления мнения нам понадобится всего одна функция, которую мы назовем out_vote_add() и добавим в класс out(). Что? Не самый подходящий класс? Ну что ж... может быть вы и правы. Но меня пока это место жительства устраивает. Можно было бы затрамбовать ее в in, но мне не хочется подключать весь in к файлу вывода текста. Что-то во мне бунтует против этого шага. А вы можете разместить эту функцию -- где вам будет угодно.


И все в этой функции до противного знакомо:

- Приводим в божеский вид данные;
- Производим проверку на ошибки;
- Добавляем в базу данные;
- Пишем "спасибо" пользователю;

На что более всего похоже? Правильно, похоже на процедуру добавления текста в базу. Было это у нас уже. Значит, можно даже взять что-то из уже написанного и просто поправить/дополнить.


    Мой вам совет: не пренебрегайте уже написанным. Чем больше вы будете копировать собственный же код, тем быстрее у вас выработаются собственные стандарты написания кода. А это очеь полезно. Особенно, когда надо разобраться в своих же скриптах полугодовалой давности (в годовалых все равно не разберетесь, без бутылки).


И вот, как у меня это получилось.

В файл /WWW/text/index.php я добавил вызов процедуры добавления данных, если переменная post активна:



    Обратите внимание! Чем отличается этот вызов процедуры от всех предыдущих, которые мы делали? Ага! Тем, что мы данные не присваиваем глобальным переменным, а передаем их классически -- через сам вызов.

    Почему в этот раз так? А потому, что в этом нет никакой необходимости -- это во-первых, а во-вторых, вы не забывайте, что мне надо показать читателю все возможные синтаксические и логические обороты PHP, а уж читатель пусть сами выберет, что ему ближе и удобнее.



Ну а в файл out.inc, соответственно, добавим саму процедуру (мы тут уже люди все взрослые и опытные, поэтому я постараюсь писать код компактнее; чем дальше -- тем компактнее):


Как видите, ничего необычного. Разве что, функция htmlspecialchars, которая возвращает переданную ей строку, заменив в ней специфические для WEB символы на их web-коды. Речь идет о треугольных кавычках и Ко.
Достаточно бестолковая функция, т.е. далеко не полностью выполняющая возложенные на нее обязанности, но своей мы пока не написали, поэтому предлагаю обратить внимание на эту.

Вообще, честно говоря, эту функцию логичнее применять при выводе данных, а не при вводе их в базу, поэтому ее можно вообще выкинуть из данного скрипта. Но раз уж я ее написал -- пусть пока поживет, а дальше -- будет видно.

Еще вы можете впервые видеть функцию in_array(). В общем-то, как и предыдущая, эта функция объясняет свои действия собственным именем: "в_массиве". Функция проверяет присутствия значения в массиве. И если значение найдено, функция возвращает true, в противном случае -- false.

В данном случае, мы проверяем: соответствует ли выбранная оценка одному из предложенных пользователю вариантов. Ведь никто не запретит пользователю создать свою форму ввода оценок и отправить нашему скрипту то, что сочтет нужным. Вот мы от подобных нехороших попыток и защитились.

Надо только заметить, что данная функция, при поиске в массиве, может сроку, вроде "000123", распознать как числовую и дать положительный результат при сравнении со значениями типа "00123" или "123.00", будьте внимательны. Хотя, если я не ошибаюсь, в последних версиях PHP эту проблему можно обойти, воспользовавшись дополнительными ключами функции. Читайте чаще мануал, что тут еще скажешь.

Более пояснять нечего, вроде.

Совершенно очевидно, что данные из формы передаются в недра функции out_vote_add(), где приобретают нужную форму и заталкиваются в базу.

Можете добавлять комментарии к текстам, а потом посмотрим, насколько богата ваша фантазия.

Как-нибудь, мы их вытащим на белый свет. Может быть, даже на следующем занятии.

Казалось бы, что на этом можно было бы закончить сегодняшний выпуск. Но у меня к вам еще одно небольшое дело.

Нам теперь надо добавить в наши скрипты один важный SQL-запрос. Вот этот:


Попробуйте догадаться с первого раза, в какую функцию я его добавил и зачем.

До завтра!

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin