Деловая неделя

Скрипт porter.php – это минимум того, что нужно сделать программисту для учёта русской морфологии при поиске по базе данных MySQL.

ЕЖЕНЕДЕЛЬНАЯ РЕКЛАМНАЯ ГАЗЕТА ДЛЯ ПРЕДПРИЯТИЙ «Деловая неделя» (Иркутск)

Копилка скриптов 1 (PHP)

Веб-мастеру

В Интернете полно сайтов, которые соревнуются друг с другом в назывании чисел: "У нас 300 скриптов PHP!", "А у нас – 1000!", "А у нас – Javascript и Perl!" И жадные начинающие программисты шастают по этим сайтам с разбегающимися глазами, и копят, копят... А многие из скриптов предлагаются ещё и за деньги.

«Скрипт» – это жаргонное слово, простая транслитерация английского «script», в переводе означающего «сценарий». Потому что на языках PHP, Javascript и Perl пишутся именно сценарии. А на языке Java, C++ типа программы. Скрипт (или сценарий) может, так же как и программа, состоять из одного или нескольких файлов. И, так же как и программа, скрипт совершенно бесполезен сам по себе, без учёта среды, инфраструктуры, в которую он встроен (а также без предварительно созревшей потребности пользователей в решении своих проблем именно с помощью такой макросреды и такого скрипта или программы).

Javascript – очень мощный язык (если покопаться), на нём можно творить чудеса. Существует, например, даже игра Тетрис, написанная на Javascript. Существуют ещё всякие фокусы типа «резинового» гибкого текста, таскающегося за мышкой. Но все эти замечательные вещи, не будучи встроенными в конкретную технологию, облегчающую жизнь людям, так и останутся «просто приколами», ловкими кунштюками. Программисты PHP вроде бы не соревнуются в ловкости рук, выложенные в Интернете скрипты призваны приносить пользу. Но извлечь её из них практически невозможно по той же причине: изолированности, отрыва от конкретной среды и конкретных задач.

Нам встретились только два скрипта PHP, имеющие реальную ценность. Они «самодостаточны», и их можно свободно переносить и использовать для разных задач на разных веб-сайтах. Первый – для записи чисел прописью, написан 10.06.2005 Федорченко А.А. (antf@inbox.ru). PHP-скриптов, решающих эту задачу, в сети может быть много. Мы попробовали несколько, и остановились на этом – http://dn.ir2.ru/order/number_in_words0.php. Правда, там оказалось несколько ошибок, и после небольших исправлений мы стали пользоваться изменённой версией скрипта – http://dn.ir2.ru/order/number_in_words.php. Может быть, уже есть более новые и более совершенные версии или другие скрипты на эту тему. Может, у PHP, наконец, появится встроенная функция преобразования чисел в русские слова. Но пока мы пользуемся тем, что есть (и что работает). Скрипт используется нами для формирования счёта клиентами после оформления заказов на сайте Деловой недели.

Другой скрипт – http://irkutsk.ir2.ru/porter.php – совершенно незаменимая вещь для организации поиска по базе данных. Вернее, это минимум, что нужно сделать программисту для учёта русской морфологии при поиске по базе. Этот скрипт выполняет функцию стемминга, или, можно сказать, что он является стеммером. Жаргонное слово стемминг можно перевести как "отбрасывание окончаний". Кем написан скрипт, чёрт его знает. Может быть, действительно неким мистером Портером. Очень распространён в сети. В идеале, конечно, после отбрасывания окончаний скрипт должен ещё и генерировать все возможные правильные формы слова и искать именно эти реально существующие в языке формы. А потом ещё проверять по словарю все возможные исключения. Но это слишком жирно для простенькой таблицы доски объявлений или каталога сайтов. В первом приближении можно работать и так.

Что такое хорошо

Чем плохи другие скрипты, доступные в Интернете? Попытаемся показать это на примере другого скрипта того же автора (А.А.Федорченко) – Formularium. Этот скрипт представляет собой целую систему (или подсистему), родовое название которой совершенно оправданно указано автором в заголовках HTML-страниц: CMS (Content Manager System – система управления содержанием). Formularium – это конструктор HTML-форм: последовательно заполняя поля формуляра, вы можете описать любую форму с заданными свойствами и элементами, а потом при необходимости вставить эту форму на страницу просто указать её идентификатор.

Мы ничего не имеем против технического испольнения Формуляриума. На первый взгляд, он выглядит очень красиво, и, вероятно, в нём нет ошибок, как в number_in_words. Может быть, он даже является образцом совершенства. Но где его можно использовать? Наверное, бывают программисты PHP, которые плохо разбираются в HTML-формах и нуждаются в специальном конструкторе для них. Но хранить названия элементов для каждой формы в таблице MySQL (как делает конструктор) – это слишком «дорого». Да и объём и структура всей подсистемы (80 килобайт в 50 файлах, расположенных в 5 каталогах и 4 таблицы mysql) не так удобны для вставки в свой код, как одиночный number_in_words.

Вообще программист PHP, конечно, должен знать HTML (потому что все его действия направлены на одну конечную цель – генерацию HTML-кода для вывода в браузере). Но если он чего-то не знает (например, про формы), то ему проще взять с любого сайта готовую форму, доработать её под свои нужды и потом использовать как шаблон для создания новых форм. В Формуляриуме же заключён некий парадокс: предполагается, что человек, не понимающий сути таких понятий, как, скажем input типа radio, должен правильно указать в конструкторе атрибуты этого элемента (пусть даже выбрать из списка).

Но и это не главное. Основной недостаток подобной подсистемы CMS – наличие только половины решения: форму мы «нарисовали», а кто будет делать обработку данных, приходящих от пользователя? То есть Формуляриум сам по себе обрабатывает приходящие данные и помещает куда-то в свои жёстко заданные таблицы. Но мы не можем использовать созданные с его помощью формы для произвольных целей (например, перенаправить их приём на другой, нужный нам скрипт).

Гораздо полезнее была бы более ограниченная, но «вертикальная», «сквозная» подсистема обработки – допустим, какой-то части формы вроде тех же radio или chekbox (потому что input типа text нарисовать и принять через GET-POST может каждый). Попытаемся тут же эту систему и описать (и создать код).

Checkboxes – нарисовать и обработать приём

HTML-формы могут быть предназначены как для помещения данных в таблицы, так и для поиска по этим таблицам. Мы начнём работу с формы для поиска.

Задача: создать функцию, в которую программист будет передавать описания элемента формы checkbox в максимально удобном для человека виде (в наименее формальном); эта функция должна рисовать checkbox (который потом можно будет вставить в заданное место), обрабатывать передаваемые через этот элемент значения GET: делать сам элемент отмеченным или нет (сохранять это значение после перезагрузки страницы), а также добавлять в sql-запрос соответствующие поля таблицы для поиска в них.

После небольшой предварительной работы выясняем, что задача (с абсолютной автономностью модуля Checkboxes) неразрешима. Поэтому меняем задачу: создать скрипт с HTML-формой поиска по БД, часть которой рисует наш модуль Checkboxes; этот модуль так же конструирует часть sql-запроса.

Вот что у нас получилось: http://irkutsk.ir2.ru/searchform.php. Весь код занял 75 строк (не считая функции обработки sql-запроса и вывода на экран его результата). Судь идеи выражена в одной строчке 18 (помечена двумя !!). В таблице (sql-запросе) может быть несколько полей, по которым можно искать запрошенное слово (например, наименование, адрес, род деятельности фирмы...). Мы написали код обработчика, в который в одном месте достаточно добавить информацию о каком-то новом поле таблицы, и это поле начнёт участвовать в поиске, а пользователь сможет отмечать его в HTML-форме галочкой.

Добавить информацию о поле нужно в следующем формате:
1) написать "$chkb[]=array(" (добавляем новый элемент в массив с checkbox'ами);
2) далее в скобках в определённом порядке через запятые ввести информацию о новом элементе:
а) значение элемента (всегда пустая строка – "");
б) подсказка пользователю (где искать) – например: "в наименованиях предприятий";
в) идентификатор элемента формы (например, "name");
г) наименование поля таблицы, в котором будет вестись поиск, если элемент выбран пользователем (например, тоже "name").

И всё. Посмотреть, как это работает, можно, если, например, раскомментировать как раз эту 18-ю строку. Получится файл http://irkutsk.ir2.ru/sform2.php. Да, ещё одна настройка – в строке номер 7 (тоже отмечена двумя !!). Можно отдельно добавлять название полей sql-запроса, которые должны выводиться на экран. А то мы ищем по полю filezip, а само поле, результат на экран не выводим. Так вот это тоже можно легко менять – в файле http://irkutsk.ir2.ru/sform2.php выводится ещё и поле filezip. Это, казалось бы, не очень хорошо – что поля поиска и поля вывода на экран определяются в разных местах. Но это правильно. Идеологически выдержанно.

Осталась ещё одна мелочь. Для отладки названия полей таблицы на экране (idrow, rubr, html...) удобны, но для пользователя лучше, чтобы они были написаны по-простому, по-русски. Для этого надо удалить текст строк 75 и 85 (начало и конец комментария). Это как раз сделано в варианте http://irkutsk.ir2.ru/sform2.php. Но там не хватает одного русского названия, для поля idrow. Это специально. Чтобы вы могли сами исправить.

Русские наименования полей в бд MySQL

Русское наименование для каждого поля MySQL (точнее, для тех полей, которые нам нужны) можно записать прямо в таблицу, в которой содержатся все названия полей всей базы данных – с помощью ссылки http://irkutsk.ir2.ru/fieldstest.php. Там есть также ссылка для просмотра PHP-кода данного файла.

После того как таблица в нужных местах заполнена, мы при необходимости с помощью нескольких строк кода извлекаем из таблицы все русские наименования и помещаем их в массив $fieldsru. Для наших форм в файлах searchform.php и sform2.php это делается в строках 73-85. Затем при появлении в коде какого-либо наименования из таблиц MySQL, мы используем это наименование в качестве ключа массива ($fieldsru["idrow"]), и таким способом находим русское наименование (строка 108 в searchform.php – если эту строку закомментировать, будут всегда выводиться латинские наименования полей).

Иногда можно использовать бд MySQL для хранения каких-то настроек внешнего вида сайта. Но в общем, наверное, всё-таки удобнее использовать прямой текстовый вид и хранить структурированные данные в виде массива, как это сделано в наших Checkboxes.

© 2009, «Деловая неделя», Михаил Гутентог

Читать все комментарии (0)

Добавить комментарий:

*Автор:
E-Mail:
*Текст: