Учимся писать скрипты правильно
Многие начинающие веб-программисты знакомятся с языком посредством книг. Книга бесспорно очень важна и нужна, но в ней приводятся примеры (для начинающих), которые по своей сути не являются правильными с точки зрения устойчивости и переносимости скрипта. Под устойчивостью понимается возможность возникновения ошибок различного вида, под переносимостью – тоже самое, но при переносе скрипта с домашней локальной машины на сервер хостнг-провайдера.
Ниже я бы хотел сразу показать начинающим веб-разработчикам как надо учиться сразу писать скрипты, чтобы затем не испытывать лишних проблем и не «ловить» непонятно откуда вылезающие ошибки.
Сразу скажу, что я сам с этим столкнулся, так что все это прошло через мои мучения….
Рассматривать я буду следующие моменты:
1. Настройка PHP для локальной машины и на сервере.
2. Где зарыта «@»?
3. register_globals = Off и никак иначе.
4. Основные аспекты синтаксиса. Литерал ор нот литерал…
1. Настройка PHP для локальной машины и на сервере.
Почему я именно с этой главы начинаю. Дело в том, что многие на локальной машине сразу отключают показ всех ошибок. Это – НЕ правильно. Вместо того чтобы тупо смотреть в монитор и искать, где, как окажется, не хватает точки с запятой, можно по ошибке, выдаваемой PHP сразу понять, в чем дело.
Но сначала хочу сделать небольшое лирическое отступление по части того, как настраивать PHP, как Apache modul или fast-CGI.
Самый оптимальный вариант – настраивать, как модуль веб-сервера. Для этого в конфигурационном файле httpd.conf веб-сервера Apache пишем следующие строчки:
Отличие от FastCGI – следующие. Первое. При FastCGI php.ini будет подгружаться в память веб-сервера приблизительно каждый второй раз при запуске скрипта, при установке, как модуля Apache загрузка конфигурации PHP будет осуществляться только при загрузке или рестарте веб-севрера, само собой быстродействие и нагрузка на сервер будет меньше. Помимо этого, при установке как fastCGI недоступны определенные функции. Начинающему программисту они не понадобятся., но при разработке крупного Интернет-приложения вы можете столкнуться с проблемами. А проблемы лучше предотвращать.
Теперь перейдем к конфигурации самого PHP. В конфигурационном файле php.ini в обязательном порядке устанавливаем следующие директивы с ниже написанными значениями:
Писать или не писать ошибки в лог файлы – это уже на ваше усмотрение.
На сервере в хостиг-компании, обязательно, выключайте все эти директивы в целях безопасности, дабы потенциальный злоумышленник не мог узнать пути, где лежат ваши скрипты. Но по хорошему, когда вы уже публикуете свой скрипт в глобальной сети, он не должен выдавать никаких ошибок.
Помимо этого
По умолчанию директива max_execution_time имеет значение 30, но для быстроты работы, лучше ставить меньше. Если у вас что-то «зациклилось», то 10 секунд вполне достаточно чтобы понять это.
В 3 главе я расскажу более подробно об этом…
Очень часто начинающие веб-разработчики не понимают разницы между ‘ и “, поэтому выключаем директиву. В 4 главе данный момент будет показан на примере…
2. Где зарыта «@»?
Это, пожалуй, самая основная ошибка начинающих программистов – использование “@”. Этот символ, перед каким-либо оператором подавляет вывод ошибки и ее запись в лог. Он не позволяет на стадии отладки отследить ошибку, и вы судорожно пытаетесь понять, в чем дело.
Яркий пример. Предположим, мы поставили символ “@” перед строчкой $f = fopen( “fle.txt” , “w+” );. Если взять только самые распространенные ошибки, которые могут возникнуть при последующей fwrite к примеру, то это: а) нет прав доступа к файлу, б) файл не существует, в) fopen не может быть вызвана в безопасном режиме. Представляете, сколько вариантов ошибок может быть? Уйма. И как вы собираетесь узнавать, какая ошибка возникла именно у вас, ведь вы подавили их вывод символом «@».
Поэтому строго на строго запрещаем вам использовать @.
Вы спросите, а как же тогда сделать, чтобы не выводилась ошибка?
Чтобы не выводилась ошибка ее надо либо предотвращать, как в случае с файлами, то есть а) проверять файл на существование, б) проверять, а можно (есть права) в него что-то записать is_writeable();.
В других случаях, например при использовании mysql_connect(); надо проверять значение, которое вернет функция. Как правило, по нему можно определить, есть ошибка или нет. Обычно при ошибке возвращается значение FALSE, NULL или пустая строка.
Это позволит вам, выдавать пользователю не пустую страницу, если, к примеру, он попытался обратиться к информации (?n=14), а информация хранится у вас в файлах, и файла 14 не существует, а текст сообщение: «Информация не найдена».
«Ловля» ошибок является также очень важным аспектом безопасности при работе скрипта.
3. register_globals = Off и никак иначе.
Если в первых двух главах я делал акцент на тех моментах, с которыми начинающий программист столкнется уже сразу, то в этой главе я расскажу о таком моменте, который проявится уже позже… зачастую с ним все сталкиваются при переносе скрипта (уже готового) на сервер хостинг провайдера. Лично я долго привыкал к register_globals = Off, поэтому товарищи, начинающие программисты, сразу ставьте эту директиву выключенной. Помимо этого, данный момент ОЧЕНЬ ВАЖЕН в обеспечении безопасности скрипта.
Итак. В чем же вся загвостка. Сначала рассмотрим случай, когда у нас register_globals = On. Как вы уже, наверное, знаете, данные в скрипт могут передаваться тремя способами, сказал грубо, на самом деле их два. Первый это GET, т.е. данные передаются через адресную строку браузера после символа “?”, второй – POST, при его использовании данные предаются в неявном для пользователя виде. Метод POST используется, как правило, для отправки данных формы. Ну и третий – это Куки, переданные от пользователя скрипту.
Рассмотрим такой случай. У нас есть форма, которая находится по адресу index.php? form. В форме несколько текстовых полей полей. Пусть это будет family, name, phone. Форма отправляется на тот же index.php но методом POST. Проверив все данные, мы записали пользователю две Куки с именами family и form, во второй мы записали время доступа к форме, к примеру.
Представим, что у нас часть файла index.php состоит из следующего кода, т.е. в случае если пользователь уже ввел данные на форме, они ему показываются, если нет – выводится форма. И все это по адресу index.php?form.
А теперь задумайтесь.. Что будет в $form, ведь мы передаем переменную, как GET параметром, так и через Куки. Вот. Дальше вы судорожно будете искать ошибку в том, что, почему $form у вас пустое или наоборот.
Т.е. фактически все сводится к тому, что есть возможность подмены всех переменных. По сути это существенный минус в безопасности, поскольку очень велика вероятность того, что злоумышленник сможет посмотреть какие- либо важные файлы на сервере.
Теперь о том, как это реализовать под register_globals = Off
В PHP существуют несколько глобальных массивов. $_GET, $_POST, $_COOKIE, $_REQUEST (объединение первых трех, не рекомендуется в целях безопасности), $_FILES (для аплода файлов), $_SESSIONS (сессии), $_SERVER (серверные переменные), $_ENV (переменные среды), $GLOBALS (объединяет все).
Что это значит. Ниже я просто перепишу скрипт, данные мною ранее для register_globals = Off..
Теперь никаких проблем не возникнет.
На всякий случай уточню, что в $_****[‘name’] вместо name надо написать имя текстового поля или Куки или параметра, переданного из адресной строки.
В этой же главе хочу рассмотреть следующий маленький пример. Опять же сначала рассмотрим пример с включенным register_globals.
Скрипт выведет значении $a равное 7. Т.е. по сути, мы имеем, что переменные доступные как внутри, так и вне функции. Это не есть хорошо, поскольку при большом скрипте таких переменных $a может быть уйма, а как следствие в любой функции значение переменно может быть изменено и результат выполнения скрипта будет непредсказуем.
Теперь, если тот же самый код выполнить при register_globals = Off, выведется 2. Поскольку изменения переменной $a внутри функции не затронут переменную $а в основном теле скрипта. Тут надо читать мануал про область видимости переменных.
Если же нам надо получить эту семерку, то надо возвращать из функции значение локальной $a и сохраняя это значение в глобальной $a.
4. Основные аспекты синтаксиса. Литерал ор но литерал…
1. Опять же многие начинающие программисты не понимают разницы между записью: $_POST[‘pole’] и $_POST[pole]. Первый вариант – синтаксически верен, а второй нет. PHP будет пытаться найти не элемент pole, а элемент с именем, которое хранится в константе pole, которой у вас – нет.
Кавычками обрамляются литералы, т.е. строки. Если у вас массив – индексный, то в нем не надо писать $_POST[‘1’], а надо $_POST[1].
2. Вывод переменных часто осуществляют таким образом:
Такая строка «разбирается» интерпретатором намного должен, чем
Первый вариант наиболее предпочтителен, да и с точки зрения редактирования программного кода – легче понять, где у тебя переменная, а где у тебя текст.
Источник статьи: http://www.internet-technologies.ru/articles/uchimsya-pisat-skripty-pravilno.html
Как пишутся скрипты на PHP
В этой статье:
- Размещение PHP на HTML-странице
- Комментарии в скриптах
- Отображение текста
- Переменные и константы в PHP
- Оператор присваивания
- О типах данных
Для написания кода на PHP подходит любой текстовый редактор (например Notepad++).
Размещение PHP на HTML-странице
Код скрипта PHP может размещаться непосредственно на HTML-странице. Чтобы узнать, как это делается, давайте рассмотрим следующий простой пример:
С первого взгляда пример напоминает обычный файл HTML. Единственное новшество здесь –– конструкция .
Все, что стоит между , интерпретируется как код на языке PHP. Здесь мы также видим пример использования команды echo –– одной из наиболее важных, часто используемых команд при программировании на этом языке. Команда echo применяется, когда необходимо что-либо написать в текущем документе. Так наша небольшая программа на PHP в HTML-документе выводит фразу «А это PHP». Все что находится вне процессор РНР передает без изменения непосредственно на динамическую web-страницу.
Вместо специального тега могут также использоваться теги
Наш первый сценарий
Тексты сцеариев (php-программ) должны храниться в файлах с раширением php.
РНР-код состоит из отдельных операторов, каждый из которых завершается точкой с запятой (ее отсутствие вызовет сообщение об ошибке).
Первый скрипт на РНР (файл index.php) будет достаточно простым, но уже он продемонстрирует совместное использование HTML и РНР.
PHP-программа состоит из двух операторов присваивания, определения значения константы и вывода текста и текущей даты в окно браузера с помощью команды echo.
Данный текст можно набрать в любом текстовом редакторе, например, в NotePad++, и сохранить под именем index.php. Следует убедиться, что файл сохранен как php-файл, в противном случае он не будет корректно обработан РНР.
В случае локальной работы необходимо скопировать файл index.php в каталог документов web-сервера. Для Denver это home/localhost/www (если в настройках не указано иное). После чего можно переходить непосредственно к запуску скрипта.
Для запуска скрипта index.php следует открыть web-браузер, а затем ввести в адресной строке полный путь к этому скрипту. В случае локальной установки адрес будет таким:
Если все сделано правильно, на экране мы увидим:
Файл styles.css (таблица стилей):
Прямо из браузера мы можем просмотреть код этой странички, сформированный web-сервером:
Таким образом, имя переменной заменяется ее значением, которое помещается на то же место, где в программе стояло имя этой переменной.
Итак, PHP-файлы обычно представляют собой смесь HTML, CSS и РНР. При этом РНР-код всегда заключается внутри конструкции . Web-сервер посылает HTML-код браузеру без изменения. РНР-код выполняется, и если он формирует теги и какой-либо текст для отображения, этот текст вставляется на то место, где размещался РНР-код. Браузер интерпретирует HTML-теги страницы и отображает результат на экране.
PHP-код может располагаться в произвольном месте и многократно включаться в текст скрипта. С его помощью можно также формировать и HTML-теги, что видно из нашего примера.
Комментарии в скриптах
Содержание PHP-скрипта представляет собой код на РНР или на HTML. Но есть также комментарии, которые предназначены для описания скрипта.
В РНР существует три типа комментариев. Первый позволяет располагать комментарии в нескольких строках, начиная их символами /* (записываются без пробела) и заканчивая символами */, например:
Следует иметь ввиду, что вложенные комментарии записывать нельзя.
Многострочные комментарии могут оказаться полезными там, где надо вставить значительный объем текста. Кроме того, распространенным приемом при отладке программы является заключение части кода в комментарий (чтобы предотвратить его выполнение).
Остальные два типа комментариев начинаются с символов // или символа # и продолжаются только до конца строки, в которой они записаны. Этот тип комментариев удобен тем, что их можно размещать справа от операторов, например:
Очень часто комментарий добавляют в начало сценария, чтобы дать о нем краткую информацию и указать, какие функции он выполняет. Например:
Отображение текста
Оператор echo, который предназначен для отображения произвольного текста на web-странице, является, пожалуй, наиболее употребительным оператором РНР. В простейшем случае после echo следует поместить одну строку в кавычках. Текст может быть заключен как в двойные кавычки, так и в простые кавычки (апострофы). Для отображения чисел кавычки необязательны, например:
В общем случае после echo можно записать несколько строк для вывода, которые разделяются запятыми.
При необходимости длинная строка может быть размещена на нескольких строках в тексте скрипта, например:
Отдельные строки могут объединяться при помощи оператора сцепления «.» –– точка. В результате образуется единая строка, которая передается оператору echo. Например:
Для отображения кавычки следует разместить перед ней обратный слеш, например:
Замечание. Если выводится одна текстовая строка, то вместо оператора echo можно использовать функцию print. В этом случае различий между echo и print нет. Однако в echo мы можем добавлять к первой строке другие строки, разделяя их запятыми.
Отображение большого текста
При использовании echo для отображения большого объема текста его можно записать так: вначале ставим символы эквивалентна . Например, вывод значения отдельной переменной можно записать в сокращенной форме (без пробелов) так: .
Переменные, оператор присваивания
Как и в любом языке программирования, переменные предназначены для хранения данных. В РНР имена переменных всегда начинаются со знака доллара $, далее следует буква или знак подчеркивания, после которого может следовать произвольное количество букв, цифр или знаков подчеркивания. Следует помнить, что в именах переменных большие буквы и малые буквы различаются. Например, $var и $Var –– это разные переменные.
После создания переменной (в результате присваивания ей некоторого значения), доступ к этой переменной возможен в любом месте скрипта. При этом одна и та же переменная может содержать на протяжении программы значения разных типов.
Переменная существует до тех пор, пока выполняется программа.
Для присвоения значения переменной в РНР используется оператор присваивания, обозначаемый знаком равенства =. Ниже приведены примеры операторов присваивания:
Обратим внимание, что одним переменным присвоены числа, а другим — строки.
Задание. Вывести все значения этих переменных в браузер: (1) каждое значение –– в новой строке; (2) –– все значения –– в одной строке.
Иногда не требуется менять в программе один раз заданное значение. Для этого используются константы — их значения не изменяются в процессе выполнения скрипта.
Для описания константы используется функция define, которой передается имя константы и ее значение. Существует соглашение, по которому имена констант всегда пишутся в верхнем регистре (большими буквами), например:
Следует обратить внимание, что при определении константы перед ней не ставится знак доллара. Попытка изменения значения константы с помощью оператора присваивания приведет к ошибке.
Константам нельзя давать имена, которые являются служебными словами языка РНР (так как перед именем константы не ставится знак доллара).
Зарезервированные (служебные) слова РНР:
and | array | as | break | default |
die | do | echo | endif | endswitch |
endwhile | global | if | include | |
require | eval | lnclude_onc e | require_once | return |
case | сfunction | class | const | continue |
declare | else | elseif | empty | enddeclare |
endfor | endforeach | exception | exit | extends |
for | foreach | function | isset | list |
new | old_function | or | php_user_filter | static |
switch | unset | use | while | xor |
В языке РНР определено множество встроенных констант, которые можно использовать в сценариях. Эти константы начинаются с двух символов подчеркивания и заканчиваются тоже двумя символами подчеркивания. Например:
__CLASS__ | __FILE__ | __FUNCTION__ | __LINE__ | __METHOD__ |
Прерывание выполнения сценария
Наиболее часто для останова выполнения сценария применяется функция exit(). Другой полезной функцией является die(«Сообщение»), которая позволяет также вывести сообщение об ошибке. Это позволяет сообщить пользователю причину, по которой сценарий завершился неудачей.
Уничтожение переменной
Иногда требуется принудительно уничтожить переменную. Для этого предназначена функция unset().
Если попробовать выполнить оператор echo «$variable» после вызова функции unset, то мы получим сообщение об ошибке –– переменная $variable больше не будет существовать.
Можно одновременно уничтожить несколько переменных:
Следующий текст при первом чтении можно пропустить
Типы данных
В языке РНР тип переменной определяется автоматически при создании переменной на основе ее значения. Тем не менее, следует иметь представление о типах данных, которые могут использоваться. Всего их восемь:
- Логический тип, содержит значения TRUE или FALSE.
- Целое число.
- Вещественное число.
- Текст произвольной длины.
- Массив.
- Объект.
- Ресурс (например, файл).
- NULL Значение NULL.
В данном случае тип переменной определяется однозначно. Трудности начинаются при смешивании различных типов данных в одном выражении, например, при сложении целого числа и строки, которая изображает число. Ниже приведено несколько примеров подобных выражений:
Для предотвращения потенциальных проблем не следует смешивать различные типы данных. Но даже и в таком случае РНР выполняет неявное преобразование типов. Если же требуется выполнить явное преобразование типа, то требуемый тип должен быть указан слева от имени переменной в круглых скобках. Вот несколько примеров явного преобразования типов:
$int_variable = (integer) $variable;
$float_variable = (float) $variable;
$string_jyariable = (string) $variable;
При преобразовании в логический тип boolean, следующие значения преобразуются в значение FALSE.
- Целое число 0.
- Вещественное число 0.0.
- Пустая строка и строка «0».
- Массив с нулевым количеством элементов.
- Объект, не имеющий свойств.
- Специальный тип NULL.
При преобразовании к типу целых значений другие типы преобразуются так:
- Логическое FALSE преобразуется в целое число 0, логическое TRUE преобразуется в целое число 1.
- Вещественные числа округляются в меньшую сторону. При преобразовании в вещественное число сперва осуществляется преобразование в целочисленное значение.
Возможно также преобразование строковых значений в числовые типы данных, но при этом имеется ряд особенностей.
Любые другие значения, включая все ресурсы, преобразуются в TRUE.
Язык РНР предназначен для создания динамических web-страниц.
- Код РНР заключается между тегами .
- Оператор echo предназначен для отображения текста.
- Имеется возможность включать в код РНР большие блоки текста
- В РНР используются три вида комментариев: /* … */, // и #.
- Имя переменной предваряется знаком доллара $, начинается с буквы или знака подчеркивания, после которого может следовать произвольное количество букв, цифр или знаков подчеркивания.
Источник статьи: http://afirewall.ru/kak-pishutsya-skripty-na-php