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

Ну как читабельно пока еще? Раз читаете, значит — читабельно.

Кто возмущен тем, что я не дал финального листинга класса utils? А зачем? Вы вполне можете составить его сами и дополнять по мере продвижения к финишу. А там и сравним наши результаты.

Кстати, вы заметили, что мы закончили с "общими" классами? Т.е. мы написали основной набор функций, который пригодится практически для любой задачи. А теперь переходим уже к более специфическим классам и функциям.

У нас есть две основные ветви скриптов. Два основных направления программирования. Первое, — это возможность ввода данных в недра сайта, а второе — вывод данных для зрителя-посетителя.

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

Давайте соберем все данные, которыми мы оперируем.

Есть:
1. Рубрики нашего сайта
2. Материалы, размещаемые на сайте.

Рубрики состоят только из их названий и уникального номера. Помните таблицу, которую мы для них создали?

А Материалы — более сложные данные. Они состоят из названия,текста и уникального номера. И не только. Но об этом позже.

Для начала займемся рубриками.

Необходимо создать функцию добавления рубрик, редактирования рубрик и их удаления.

    Честно говоря, добавление и редактирование рубрик — настолько редкая задача, что можно было бы не писать ничего подобного, а ручками отправлять в SQL-запросы, когда надо что-то изменить в таблице рубрик. Но поскольку мы пишем большой и самодостаточный проект, то пропустить даже такую мелкую задачу не приходится.

Для начала, я вас прошу, создайте новый класс. Класс, который будет отвечать за добавление данных. По нашей с вами терминологии он называется class.in. А файл, соответственно, in.class.

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

Ввод данных.

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

"Ну какие еще подготовительные этапы", — скажет нетерпеливый программист. Написать один запрос в базу, запихивающий строку-название раздела, и всего делов.

Так-то оно так... да не так.

А если сайтом управляет полный неуч? Или, того хуже, — в руки к злоумышленнику попала панель управления сайтом, и он начнет искать уязвимые места, чтобы нанести урон системе?

Вот именно! Первым этапом мы обязаны проверить те данные, которые собираемся заносить в базу.

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

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

Вот так и напишем (готовьте файл utils, будем добавлять в него первые сообщения об ошибках).
И сразу, чтобы ничего не забыть, добавляем в список ошибок (файл utils.class) наши новые ошибки.
Вот так. Теперь, уже по традиции, пережевываю написанное в кашку.

$name=AddSlashes($name); — это очень важная и очень удобная функция PHP, которая добавляет слеши "\" ко всем символам, которые MySQL может интерпретировать как управляющие команды, превращая их в обычные текстовые символы.

    Более всего, это относится к кавычкам. Если в названии нашей рубрики встретится кавычка, то интерпретатор MySQL воспримет эту кавычку как управляющую (открывающую или закрывающую) и наш запрос к базе данных будет иметь совсем не тот вид, на который мы рассчитываем.

    К сожалению, многие забывают об этом (или не обращают на это внимание), за что и расплачиваются. В Сети добрая половина скриптов не имеет подобных превентивных проверок, что приводит к частым взломам сайтов и проникновению в их базы данных.

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


Вам не надо помнить весь набор управляющих символов. Функция PHP AddSlashes() сама знает, куда надо добавить слеши.

    Обращаю ваше внимание на то, что в конфигурационном файле php.ini, где лежат настройки правил работы php-интерпретатора, есть параметр, отвечающий да добавление слешей в данные, передаваемые скрипту через web-форму. Проконсультируйтесь в службе поддержки вашего провайдера: включен ли этот параметр управления. Я предпочитаю его выключать и самостоятельно заботиться о безопасности. В противном случае мои скрипты могут в миг оказаться "дырявыми", если этот параметр по чьей-то воле изменит свое значение.

Далее мы производим проверку на длину строки, которую получили в качестве параметра. Функция PHP strlen() вернет нам количество символов в той строке (или переменной), которую мы передали ей в качестве параметра. Тут все очевидно и пояснять нечего, только обратите внимание, что в PHP знак сравнения обозначается в виде сдвоенного "равно". Ибо одинарное "=" — во всех ситуациях выполняет присваивание. Будьте с эти внимательны.

И, наконец, мы производим проверку на существование такого раздела в базе.

В четыре строки.

1. Оформляем запрос в базу. Запрос совсем простой — комментировать его не стану.

2. Вызываем нашу функцию активации запроса (кто забыл, как она работает, обратитесь к главе "PHP: mysql.class").

3. Проверяем, не случилось ли ошибки. Обратите внимание, в классическом виде строка в скобках if() должна была бы иметь условие:

if($this->sql_err>0) return(11);

Но, так как 0 — это "правда" по логике PHP, а любое другое число — "ложь", мы опускаем знак "больше", будучи уверенными, что условие сработает и без этого, если значение переменной sql_err не равно 0 — нормальному завершению операции.

4. И четвертой строкой мы проводим ту самую проверку на дублирование строки в базе. Функция PHP mysql_num_rows(), получая в качестве параметра ссылку на результат запросу в БД, возвращает нам количество найденных запросом строк. И если возвращенное значение не равно 0, значит такая строка в базе найдена, и нам остается только вернуть соответствующий код ошибки — 23. Поэтому, тут мы тоже можем смело опустить условие ">0".

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

Другими словами, в цепочке наших проверок остановка выполнения скрипта произойдет на той строке, где прежде всего сработает команда return. Это очень удобно.

И так. Мы с вами написали функцию проверки корректности добавляемого названия раздела и приведения строки к безопасному виду, готовому к употреблению в MySQL.

Завтра мы совершим добавление самой строки, изменение ее и удаление, если ничто не помешает нам это сделать.

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



copyright ©2000-2017 Ruslan Kurepin