dbshell. Простейший скрипт для управления БД как простая замена phpmyadmin’у.

Предыстория

Сидел я дома на GPRS-канале. В аську постучался товарищ с просьбой помочь восстановить забытый пароль от неизвестной CMS. Из исходных данных были только реквизиты от FTP и MySQL. phpMyAdmin в силу скудости канала закачать туда не получилось бы. Задача не являлась чем-то уникальным, и сподвигла меня на написание небольшого инструмента. Цели и задачи

Создание php-скрипта, закачиваемого на web-хостинг, и позволяющего:

  1. Просмотреть списки процессов MySQL
  2. Просмотреть списки таблиц БД
  3. Просмотреть структуру таблиц БД
  4. Просмотреть содержимое таблиц БД
  5. Исполнить запросы вводимые в форму

Когда это нужно

Данный скрипт будет полезен в случаях когда:

  1. Из всех реквизитов хостинга есть только FTP и MySQL(ssh-доступ отсутствует)
  2. Недостаточно быстрый канал (например ноут+gprs через мобильник), и залить туда более мощный инструмент для просмотра и правки не представляется возможным
  3. MySQL на хостинге не позволяет делать внешние подключения
  4. Не требуется ни снимать, ни заливать данные. То есть для мелких операций, вроде очистки таблицы или смены пароля у пользователя в БД

Требования

— Единственный скрипт, размером не более 10 КБайт — Работает под любыми браузерами — Минимальный размер генерируемого HTML — кода

Установка

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

dbshell-0.2


Стандарт написания кода на PHP

За основу для данного стандарта взята статья http://www.reg.ru/coding_standards.

Оформление кода

Лесенка в 4 пробела.

Обязательна «лесенка» с отступом в 4 пробела (half-tab). При этом запрещается в редакторе изменять размер отображаемой табуляции, например выставлять отображение табуляции в 4 пробела. Код, созданный Вами при таких настройках, будет некорректно отображаться в других редакторах с другими настройками.

Величина отступа у двух соседних строчек, не должна превышать 4 пробела:

// Правильно
function get_id(
    $name   //!< Имя
) {

// Неправильно
function get_id(
                $name   //!< Имя
) {

Пробелы после запятых.

После запятых и точек с запятой (если, конечно, они не расположены в конце строки) ставятся пробелы. Перед запятой и точкой с запятой пробелы не ставятся:

$a = array (1, 2, 3);
for ($i = 0; $i < $count; $i++) {  };

Пробелы вокруг знаков операций.

Любые операторы / знаки операций (например =, ==, ⇒, <, >, &&, || и т.п.) обязательно отделяются пробелами с обоих сторон

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

$a = $b * $c + $d * $e;
$a = $b * $c  +  $d * $e;

Пробелы вокруг сложных индексных выражений.

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

$a[1];
$a[ 1 + 2 + 2 + 4 * function( $a{ $b->{c} } ) ];

Пробелы после знака комментария.

После символа начала комментария («») перед текстом самого комментария ставится пробел: <code> Комментарии начинаются С ЗАГЛАВНОЙ БУКВЫ! Вторая строка комментария </code> Исключение составляют fancy comments, где допускается сливать начальнуй символ решётки с последующими символами: <code> / MY COMMENT INIT * </code>

Пробелы после ключевых слов

После любых ключевых слов языка php обязательно следует пробел. Примеры:

$array = array ();
foreach ($array as $k => $item) {
    if ($item) { $array[$k] = $item * 2; }
}

<<Опять пробелы???>>

Для того, чтобы понять, насколько хорошо отформатирован Ваш исходный текст: достаточно ли отступов, пробелов и пустых строк — попробуйте отключить подсветку синтаксиса в Вашем редакторе. Если после отключения подсветки код по-прежнему легко читаем (просмотр и анализ текста производится легко, любые конструкции легко выделяются визуально) — значит код действительно удобочитаем.

Не стоит полагаться на подсветку синтаксиса как на «костыль», скрывающий недостатки форматирования.

Выравнивайте комментарии точно так же, как и код.

Левый край комментариев выравнивается точно так же, как и основной код, т.е. используется принцип «лесенки».

//// тили-тили
//// трали-вали
if ($cond) {
    /*
    Это дело мне по силе,
    Откажусь теперь едва ли.
    */

}
else {
    # Это мы не проходили,
    # Это нам не задавали!
}

Ставить символы «» вначале строки, если левая граница кода находится правее, не допускается. тили-тили

// трали-вали
if ($cond) {
// ТАК ДЕЛАТЬ НЕЛЬЗЯ!!!
}

Максимальная длина строк. Разбиение длинных строк.

Строки не оставлять слишком длинными; ограничение — 80 символов в строке. При необходимости строка разбивается на несколько. Примеры допустимого разбивания конструкций:

if (
    very_long_condition_1
    && very_long_condition_2
) {
    statement;
}

if (
        ..
    &&
        ...
    ||
        ...
) {
    ...
}

Для контроля длины строк рекомендуется включить режим «статического переноса строк» после 80 символов. Большинство редакторов имеют эту возможность.

Открывающая фигурная скобка на той же строке, что и ключевое слово.

Старайтесь придерживаться компактного (K&R) стиля оформления циклов и блоков ветвления: открывающая фигурная скобка находится на той же строке, что и ключевое слово for, if, else, while и т.п. Закрывающая фигурная скобка блока, состоящего из нескольких строк, должна находиться на одной вертикали с ключевым словом начинающим конструкцию. Примеры:

if ($condition) {
    statement1;
}
else {
    statement2;
}

for ($i = 0; $i < $count; $i++) {
    statement;
}

Пробел перед открывающей фигурной скобкой.

Перед открывающей фигурной скобкой в блочных конструкциях всегда ставится пробел:

foreach ($array as $item) {
    statement;
}

Допускается компактное оформление блоков из одного оператора

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

foreach ($array as $item) { $item *= 2; }

Разбивайте код на абзацы, при необходимости снабжённые комментариями

Код внутри функций должен быть разделён на смысловые блоки, выполняющие определённую узкую задачу. Смысловые блоки отделяются друг от друга пустыми строками. Для дальнейшего улучшения сопровождабельности кода, добавляйте вначале каждого абзаца однострочный комментарий, объясняющий, что делает эта последовательность операторов.

Выравнивайте сходные элементы кода по вертикали.

Выравнивайте сходные элементы по вертикали, особенно если они достаточно короткие чтоб поместиться в одну строку:

$wm_conts_map = array (
    first_name  => 'iname',
    last_name   => 'fname',
    email       => 'email',
);

mkdir($tmpdir)          or die ("can't mkdir $tmpdir");
chmod($tmpdir, 0777)    or die ("can't change mode for $tmpdir");

Переменные и константы

Обязательно комментируйте константы.

Над константами обязательно необходимо ставить комментарий в формате doxygen

//! Режим отладки
define ("DEBUG_MODE", "1");

Не отделяйте имена переменных и функций от следующей за ними открывающей скобки.

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

# ХОРОШО
if (open_region($i)) { next CANDIDATE; }

$candidates[$i] = $incumbent[ $candidates[$i]['region'] ];
# ПЛОХО!
if (open_region ($i)){ next CANDIDATE; }

$candidates[$i] = $incumbent [ $candidates[$i]['region'] ];

Индексы ассоциативных массивов — только строки.

Индексы ассоциативных массивов должны представлять собой только текстовые значения (тип кавычек — не важен)

# ХОРОШО
$array['type_id'] = 1;
$array["type_id"] = 2;

# ПЛОХО!
$array[type_id] = 3;

Осмысленные названия идентификаторов.

Выбирайте осмысленные названия для идентификаторов (переменных, констант, функций). Исключение составляют итераторы циклов, где допускаются короткие идентификаторы: $i, $n и т.п. При этом не допускается калька с русского языка («$polzovatel», «$sajt» и т.п.). Если вы не можете вспомнить, что это имя значит — у вас проблемы.

Строчные буквы для названий переменных и функций.

Названия всех переменных и функций должны состоять только из строчных букв, цифр и знаков подчёркивания: «get_domain_name» и т.п.

Хотя короткие идентификаторы типа «$gotit» возможно и неплохи, используйте знак подчеркивания для разделения слов. В общем случае «$var_names_like_this» прочесть легче чем «$VarNamesLikeThis».

Заглавные буквы для констант.

Константы именуются только с использованием заглавных букв:

define ("DEBUG", 0);

Именуйте массивы во множественном числе, а скаляры в единственном.

Массивы рекомендуется называть во множественном числе, например $users, $objects, а скаляры — в единственном: $user, $object.

Функции

Одна функция выполняет одну задачу.

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

Имена функций должны содержать глагол.

Наименования функций должны включать глагол, например «get_domain_name», или «chash_my_program».

Имена, заданные без учёта этого принципа, вроде «flat_components», могут быть истолкованны совершенно по разному, например как «get_flat_components», «set_flat_components», «update_flat_components», «remove_flat_components» или «add_flat_components»

Используйте устоявшиеся пары антонимов в именах функций

В книге Стива Макконелла «Совершенный код» приводятся устоявшиеся пары антонимов, рекомендуемые для использования в именах функций/методов, а именно:

  • add / remove,
  • begin / end,
  • create / destroy,
  • first / last,
  • increment / decrement,
  • insert / delete,
  • lock / unlock,
  • min / max,
  • next / prev,
  • old / new,
  • open / close,
  • show / hide,
  • source / target,
  • start / stop,
  • up / down.

Использование «несогласованных» пар глаголов вроде add / delete или insert / destroy вводит в заблуждение и усложняет анализ кода.

Имена private-функций начинаются с подчёркивания.

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

Отступы и комментарии для функций. Документирование входных параметров функций

Функции отделены друг от друга минимум одной пустой строкой. Для каждой функции необходимо краткое однострочное описание того, что она делает. Так же необходимо дать краткое описание входных параметров:

/**
     Получить имя домена по его id (краткое однострочное описание)

    Прочее описание

*/
function get_domain_name(
    $id //!< id домена
) {
    ...
}

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

Не более 3-х параметров у функций.

Функция может принимать не более 2-х, максимум 3-х аргументов. При большем количестве аргументов либо проводится рефакторинг с целью уменьшения количества входных параметров, либо используются именованные параметры. Именованные параметры обязательно документируются

Документирование выходных параметров функций.

Если выходные параметры функции не очевидны / нетривиальны, особенно это касается возврата сложных структур данных, их обязательно надо документировать

Библиотеки.

Комментарий вначале библиотеки.

Вначале библиотеки обязателен комментарий, описывающий её назначение.

/**  Краткое описание библиотеки
    \author Пупкин Василий

    Подробное описание

*/

Комментарий вначале класса.

Вначале класса обязателен комментарий, описывающий её назначение.

/**
     Краткое описание класса
*/
class myclass {
 ...
}

Наименование библиотек в стиле mylib.lib.php

Файлы библиотек следует называть в стиле mylib.lib.php. В то время как исполняемые файлы («скрипты»), следует именовать маленькими буквами, с применением знака подчёркивания: clear_cache.php.

Динамическая подгрузка тяжёлых опциональных модулей.

Если требуется использовать «тяжёлую» библиотеку (скажем, отъедающую 5 Мб памяти и более), при этом, необходимость в этой библиотеке возникает лишь изредка, при определённых условиях — лучше её динамически, когда в нём возникает необходимость:

define ("", $_SERVER['DOCUMENT_ROOT']);
$include_file = DOCUMENT_ROOT."/libs/mylib.lib.php";
if ($condition) {
    if (file_exists($include_file)) {
        include_once($include_file);
    }
}

Подгрузка библиотек только по абсолютному пути.

Для указания пути к библиотеки обязательно использовать полный путь в файловой системе. Его можно получить из переменной окружения $_SERVER[’DOCUMENT_ROOT’], либо указав его в константе.

define ("", $_SERVER['DOCUMENT_ROOT']);
$include_file = DOCUMENT_ROOT."/libs/mylib.lib.php";
if ($condition) {
    if (file_exists($include_file)) {
        include_once($include_file);
    }
}

SQL, базы данных

Осмысленные названия полей и таблиц.

Выбирайте осмысленные названия для полей и таблиц. При этом не допускается калька с русского языка (‘polzovatel‘, ‘sajt‘ и т.п.). Если вы не можете вспомнить, что это имя значит — у вас проблемы.

Имена таблиц и полей в обратных апострофах.

Имена таблиц, полей и их псевдонимов обязательно заключаются в обратные апострофы (символ ‘).

Форматирование SQL-запросов

Запросы длиной более 50 символов (примерно) рекомендуется разбивать на несколько строк, подгоняя текст по горизонтали. Например так:

    SELECT `fields`
      FROM `tables` `t`
     WHERE conditions
       AND more conditions
     GROUP BY `fields`
     ORDER BY `fields`
     LIMIT limits

или так:

    SELECT
        `fields`
    FROM
        `tables` `t`
    WHERE
        conditions
    AND
        more conditions
    GROUP BY
        `fields`
    ORDER BY
        `fields`
    LIMIT
        limits

Ключевые слова — заглавными буквами.

Все ключевые слова SQL записываются заглавными буквами, все наименование таблиц, полей, пользовательских функций — строчными.

Названия полей и таблиц — строчными буквами.

При именовании таблиц и полей не допускается использование заглавных букв. Допускаются только строчные латинские буквы, цифры и знак подчёркивания. Пример: «name_of_the_table».

Названия таблиц — во множественном числе.

Таблицы следует именовать по-английски, во множественном числе. Например: «domains», «users».

Первичный ключ с именем «id».

В каждой таблице (за исключением таблиц, где необходимы составные ключи, например таблиц для обеспечения связей многие-ко-многим) обязательно должно быть поле с именем «id» и типом INT, для которого должен быть создан первичный ключ:

id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY

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

Ссылочные поля — с именем <tablename>_id

Все поля, использующиеся для связи с другими таблицами по их первичному ключу, именуются как »<tablename>_id», где »<tablename>» — имя таблицы в единственном числе. Примеры наименований: domain_id, user_id.

Комментарии

Кодировка комментариев на русском языке должна быть ЕДИНОЙ на протяжении всего проекта (в зависимости от принятых для этого проекта договорённостей).

Комментирование функций.

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

/**
     Краткое описание функции

    Полное описание функции
*/
function my_func(
    $xml,       //!< Описание аргумента 1
    $xsl_file   //!< Описание аргумента 2
) {
    ....
}

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

Комментирование циклов.

Перед телом цикла обязательно должен стоять комментарий, кратко описывающий работу цикла

// Описание рабты цикла
foreach () {
    ...
}

Комментирование условий.

Перед условием обязательно должен стоять комментарий, кратко описывающий его работу

// Описание условия
if () {
    ...
}

Шаблоны.

Экранирование поставляемых данных во избежание XSS-атак При подстановке в шаблон данных, передаваемых пользователем (например, переданных ранее через форму на сайте), эти данные обязательно экранируются с помощью фильтра html (за исключением ОСОБЫХ случаев):

<?= htmlspecialchars($form_data);?>

Пробелы

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

Лесенка.

При использовании логических / блочных конструкций TT данные, внутри блока сдвигаются вправо для улучшения удобочитаемости

    {if $ru}
        Русский текст
    {else}
        Английский текст
    {/if}

Проверки на непустоту списков.

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

Шаблон должен интерпретироваться без ошибок, даже если отсутствуют необходимые данные.

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

HTML-код

Не использовать спецсимволы, записанные в национальной кодировке.

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

Для каждого чекбокса должен быть label.

Для каждого элемента <input type=«checkbox» …> должен быть предусмотрен элемент <label>, для того, чтобы чекбокс срабатывал также по клику по метке:

    <label><input type="checkbox" name="test" value="1">Тестовая метка</label>

Высота textarea

Textarea в форме минимум на 10 строк высоты (очень неудобно постоянно делают 4-6 строк)

Textarea в форме минимум на 95% её ширины.

Возможно следует задать минимум в см.

Использование таблицы для формы

Использование в форме тегов th для заголовков полей и тегов td содержащих поля. При этом чекбоксы с их лэйблами хранятся в тэгах td аналогично input.

<form>
    <table>
        <tr>
            <th>Field1:</th>
            <td><input ...></td>
        </tr>
    </table>
</form>

JavaScript

Всегда объявляйте переменные.

Всегда объявляйте переменные в JavaScript, даже если синтаксис языка допускает использование переменной без её объявления. Не позволяйте себе «расслабиться»!

    var variable = 'Value';
    alert( variable );

Вопросы на засыпку для web-программиста

Не так давно у меня появилась небольшая своя хитрая методика оценки знаний web-программиста при проведении собеседования. Делюсь.Задаётся 3 вопроса:

  1. чем left join отличается от right join, и up join от down join
  2. чем /^\d+$/ отличается от /[0-9]+/, и /^\q+$/ от /^\w{q}$/i
  3. чем [R=301] отличается от [L], и %{SITE_NAME} от %{SCRIPT_OWNER}

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


Базовый курс подготовки web-программиста на PHP.

 

Введение

Время чтения курса без практических занятий — 815 минут. Практические занятия включают в себя разбор котрольных заданий в объёме 540 минут (по часу на каждую главу курса).

Цели и задачи курса

Начальные навыки.

Для успешного прохождения курса слушатель должен иметь следующие навыки

  • Базовые навыки html-верстки;
  • Навыки программирования на любом ЯП.
  • Навык установки web-сервера с интерпретатором php

Основные принципы работы web-сервера

URL и его структура

Рассмотрим типичный пример адресной строки браузера.

Адресная строка браузера

Адресная строка браузера

Протокол

Протокол — набор правил обмена сообщений. http — один из протоколов для передачи данных по сети. Так же можно вспомнить: ftp, https, smb, и даже такие экзотические, как obex и svn. http — специализируется на передаче гипертекстовых документов (web-страниц).

Хост(HTTP_HOST, HOST, Имя домена)

Хост определяет к какому сайту направлен наш http — запрос. Хост выполняет двойную роль(направляется запрос к DNS-серверу):

  1. Является указателем на конкретный компьютер в сети, на котором устанавлен web-сервер
  2. Является указателем на виртуальный хост на web-сервере, из которого берутся данные.
Понятие виртуального хоста.

Виртуалхост — запись в настройках web-сервера, определяющая из какого корневого каталога для какого хоста, прописанного вURL, отдавать данные.

Корневой каталог(DOCUMENT_ROOT) — каталог, начиная с которого клиенту отдаётся содержимое документов, находящихся в нём. То есть доступ к подкаталогам DOCUMENT_ROOT возможен, к надкаталогам — нет.

Рассмотрим последовательность совершения браузером запроса к web — серверу.

Схема работы виртуальных хостов веб-сервера

Схема работы виртуальных хостов веб-сервера

  1. Получение IP-адреса web-сервера. Согласно настройкам операционной системы идёт обращение к DNS: передаётся имя домена, и получается IP адрес
  2. Получение содержимого web-страницы. Браузер подключается к web-серверу, используя полученный от DNS IP-адрес, передаёт имя домена(HOST) и запрос документа(REQUEST_URI) и получает его содержимое.

Часто встречающиеся ситуации, когда IP-адрес web-сервера получить не удаётся:

  • DNS работает неверно;
  • DNS недоступен;
  • доменное имя незарегистрировано;
  • настройки файрвола не позволяют получить IP;

В данном случае ОС просто не знает под каким IP-адресом web-сервер подключен к сети, и браузер никуда не может послать имя домена и запрос документа(REQUEST_URI). В этом случае можно прямо указать какой к какому серверу необходимо подключиться (все браузеры имеют настройку «использовать прокси-сервер»), указав IP и порт(как правило это порт 80).

Как проверить доступность DNS и web-сервера.

Для проверки доступности, и просмотра вывода, DNS — сервера используется команда nslookup.

Пуск->Выполнить->nslookup [имя домена]

Ответ DNS-сервера, если он доступен, выглядит так:

nslookup perpetum-mobile.ru
Server:         62.213.0.12
Address:        62.213.0.12#53

Non-authoritative answer:
Name:   perpetum-mobile.ru
Address: 81.177.46.165

Разберём вывод nsloockup:

  • Server: 62.213.0.12 — IP- адрес DNS, который нам ответил
  • Address: 62.213.0.12#53 — полный адрес DNS (вместе с портом) который нам ответил
  • Name: perpetum-mobile.ru — имя домена, запрос на выдачу IP которого был отправлен
  • Address: 81.177.46.165 — IP адрес web-сервера, на котором располагается сайт perpetum-mobile.ru
Проверка web-сервера

Для проверки физической доступности web-сервера можно использовать команду telnet.

Пуск->Выполнить->nslookup [IP адрес или имя домена] [порт]

Как правило, web-сервер работает на порту 80.

Разберём вывод команды telnet

telnet perpetum-mobile.ru 80
Trying 81.177.46.165...
Connected to perpetum-mobile.ru (81.177.46.165).
Escape character is '^]'.
  • Trying 81.177.46.165 — «пытаюсь соединиться» если в качестве аргумента команды telnet вы ввели имя домена, а не IP адрес, но при этом этой строчки не появилось — это причина задуматься о том, что DNS по какой-то причине недоступен. Вывод DNS обычно кэшируется ОС.
  • Connected to perpetum-mobile.ru (81.177.46.165) соединено с web-сервером, если этой строчки так и не появилось, но появилась предыдущая — очень вероятно, что запрашиваемый север недоступен.
  • Escape character is ’]’. — приглашение на ввод.

REQUEST_URI

REQUEST_URI — запрос документа у web-сервера. Если HTTP_HOST определяет из какого корневого каталога будет получен документ, то REQUEST_URI определяет:

  • путь этого документа относительно корня (SCRIPT_NAME);
  • дополнительные параметры вызова (QUERY_STRING).

REQUEST_URI может содержать только следующие символы:

  • символы латинского алфавита;
  • следующие знаки препинания:
    • -(тире),
    • .(точка), _(нижнее подчеркивание),
    • %(процент), ?(знак вопроса)
    • , =(равно), &(амперсант);
    • любые другие символы ASCII двухбайтные символы Unicode, где каждый байт кодируется через %[HEX-код];

SCRIPT_NAME. Mime-types

Mime-type — тип документа, определяемый по расширению. К типу может быть привязано какое-то действие, но по умолчанию web-сервер просто передаёт содержимое документа web-клиенту(браузеру), но может быть и какая-то обработка. Примеры mime-types:

  • text/plain — простой текст;
  • text/html — html документ;
  • image/png — изображение в формате PNG

QUERY_STRING

QUERY_STRING — дополнительные параметры документа. Имеет вид пар «ключ=значение». Пары отделяются друг от друга амперсантами &. Ключ от значения отделяется знаком «равно». Отделяется от SCRIPT_NAME знаком вопроса.

http-протокол

HTTP — протокол — описания порядка обмена служебной информацией (заголовками) данными. Наблюдать какая служебная информация в виде заголовков передаётся от браузера web-серверу и обратно можно, например, с помощью плагина к FireFox, который называется LiveHTTPHeader

http-заголовки в плагине LiveHTTPHeader для FireFox

http-заголовки в плагине LiveHTTPHeader для FireFox

Скачать его можно тут: http://livehttpheaders.mozdev.org/

Независимо от типа запроса сохраняется следующая последовательность:

  1. передача заголовков запроса
  2. передача заголовков ответа и блока данных(если они есть)

Заголовки запроса. Методы GET и POST.

Метод GET

При осуществлении запроса методом GET все параметры запроса к сайту (за исключением cookie) передаются через REQUEST_URI.

http-заголовки запроса GET

GET /project_checkout.php HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/

Основные элементы html-страницы, позволяющие делать GET-запросы

Гиперссылки

<a href="http://yandex.ru" title="Яндекс" target="_blank">
    Гиперссылка
</a>
Гиперссылка

Гиперссылка

Изображения

<img src="/images/crazytux.png" title="Бешенный пингвин1" border="2"
alt="Пингвин1"/>
<img src="/images/crazytux_.png" title="Бешенный пингвин2" border="2"
alt="Пингвин2"/>
Изображение в браузере

Изображение в браузере

Внешние таблицы стилей

<link href="css/style.css" rel="stylesheet" type="text/css" />

Внешние файлы с JavaScript

<script type="text/javascript" src="/scripts.js"></script>

Фреймы

<iframe src="/frame.php"></iframe>
Фрейм

Фрейм

Формы

<form action="" method="GET" target="_blank">
    <input type="text" name="textfield" value="textvalue"/><br/>
    <label>
        <input type="checkbox" name="checkbox" checked/>Checked
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio1" />radio-one
    </label><br/>
    <label>
        <input type="radio" name="radio" value="radio2" selected/>radio-two
    </label><br/>
    <input type="submit" name="get" value="Отправить форму"/>
</form>

Данный html-код генерит страцичку следующего вида:

Форма

Форма

При отправке этой формы открывается новое окно, в которое загружается url:

http://xepace.localhost/images/index.html?textfield=textvalue&checkbox=o......
&radio=radio2&...
get=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D1%84%D0%BE%D1%80%D0%BC%D1%83
Метод POST

При осуществлении запроса методом POST кроме параметров, которые можно наблюдать в строке браузера, передаётся скрытая строка параметров

http-заголовки запроса POST

POST /images/index.html HTTP/1.1
Host: xepace.localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) Gecko/20070914 Firefox/2.0.0.9
Referer: http://xepace.localhost/
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
pass=&hid=hidden_value&textarea1=textarea_value&post=POST_FORM

Основные элементы html-страницы, позволяющие делать POST-запросы

Формы

<form action="" method="POST" target="_blank">
    <input type="password" name="pass" value=""/><br/>
    <input type="hidden" name="hid" value="hidden_value"/>
    <textarea name="textarea1">textarea_value</textarea><br/>
    <input type="submit" name="get" value="Отправить POST форму"/>
</form>

В новую страницу будет загружен url

http://xepace.localhost/images/index.html

а в заголовках отправлены значения полей в виде

Прочие заголовки запроса

Заголовки ответа.

TTP/1.x 200 OK
Date: Tue, 24 Jun 2008 17:34:13 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 5547
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

Коды ответа.

200
HTTP/1.x 200 OK
Content-Type: text/html; charset=utf-8
500
HTTP/1.x 500 Internal Server Error
Content-Type: text/html; charset=iso-8859-1
403
HTTP/1.x 403 Forbidden
Content-Type: text/html; charset=iso-8859-1
404
HTTP/1.x 404 Not Found
Content-Type: text/html; charset=iso-8859-1
304
GET /main.css HTTP/1.1
Host: xepace.localhost
Referer: http://xepace.localhost/project_checkout.php
If-Modified-Since: Wed, 04 Jun 2008 09:25:46 GMT
HTTP/1.x 304 Not Modified
302
HTTP/1.x 302 Found
Location: 1.php
Content-Length: 0
Content-Type: text/html

Куки

Куки — информация, отсылаемая в заголовке ответа. Сохраняется в браузере, и передается в виде заголовка запроса, если

  1. время хранения не истекло;
  2. имя хоста к которому осуществляется запрос, совпадает с шаблоном в сохранённых куках;
  3. REQUEST_URI запроса к web-серверу содержит PATH, в куках;

Заголовок ответа, сохраняющий куки в браузере, выглядит так:

Set-Cookie: cookie1=qwerty; expires=Wed, 25-Jun-2008 22:49:28 GMT; path=/libs; domain=xepace.localhost

А это заголовок запроса, если хранящеся куки удовлетворяют необходимым условиям:

Cookie: cookie1=qwerty;

Сессии

У куков есть определенные проблемы с безопасностью, связанные с тем, что все значения передаются в http-заголовках напрямую. Для данных, которые нежелательны для раскрытия (к примеру можно было запоминать логин и пароль входа) лучше применять механизм сессии.

Сессия — набор данных, хранящихся в файле во временном каталоге или в оперативной памяти, содержащих информацию, характерную для определенного посетителя. Принадлежность данных к конкретному файлу определяется на основе куков — ID сессии. Значение этих куков, как правило, совпадают с именем файла сессии. Значение ID сессии так же можно передавать не через cookie, а в качестве одного из параметров QUERY_STRING. Если web-приложение, работающее с сессией написано на php, то это можно сделать через файл .htaccess.

Настройка параметров подкаталогов через .htaccess

Для отдельного каталога в виртуальном хосте и всех его подкаталогов можно определить собственные настройки web-сервера. Это делается с помощью файла .htaccess

Управление способом передачи ID сессии

Немного забегая вперёд, отметим, что для настройки PHP, работающего в окружении web-сервера, используются ключи конфигурационного файла php.ini. Некоторые из них можно задавать через .htaccess, в том числе и эти 3 ключа, управляющие способом передачи ID сессии.

  • session.use_cookies — использовать cookie для передачи ID сессии
  • session.use_only_cookies — использовать только cookie для передачи ID сессии
  • session.use_trans_sid — использовать QUERY_STRING для передачи ID сессии

Для того, чтобы ID сессии передавался только через cookie в .htaccess достаточно прописать следующее

php_flag session.use_cookies On
php_flag session.use_only_cookies On
php_value session.use_trans_sid 0

Кодировка по умолчанию

AddDefaultCharset utf-8
AddDefaultCharset windows-1251

Индекс каталога. Документ по умолчанию

Если REQUEST_URI не содержит не содержит имени конечного файла, а только имя каталога, то имя файла в каталоге, которое берётся по умолчанию прописывается в .htaccess директивой

DirectoryIndex index.html

Если необходимо не использовать файл по умолчанию, а вывести содержимое запрашиваемого каталога — используйте:

Options +Indexes
Страница индекса каталога

Страница индекса каталога

Разрешение и запрещение доступа

Запретить доступ для всех

Deny from all

Запретить доступ для 192.168.0.1 и 192.168.0.1

Deny from 192.168.0.1 192.168.0.1

Запретить доступ для всех кроме 192.168.0.1 и 192.168.0.1

Deny from all
Allow from 192.168.0.1 192.168.0.1

http-авторизация

Окно http-авторизации

Окно http-авторизации

Авторизация и аутентификация будут производиться при помощи двух файлов: .htaccess и .htpasswd . При помощи первого файла будет выдаваться форма запроса логина и пароля. Для этого в файл .htaccess следует добавить следующие строки:

AuthUserFile /home/user/public_html/.htpasswd
AuthName "example of http-auth"
AuthType Basic
Require valid-user admin

AuthUserFile — указывает на файл, в котором хранятся имена пользователей и пароли. Требуется указать полный путь. Стоит заметить, что файл с паролями следует размещать так, чтобы он не был доступен для просмотра из интернета. О том, что из себя представляет этот файл, будет сказано ниже.

AuthName — текст, заключенный в кавычках после этой директивы, будет выведен в окне запроса логина и пароля.

AuthType — тип авторизации. В данном случае используется тип Basic. Есть еще один — Digest. Разница заключается в том, что тип Basic хранит пароли зашифрованные алгоритмом DES, а Digest для этих целей использует MD5.

Require — определяет кому давать доступ. valid-user означает что доступ будет предоставлен тем кто введет правильно логин и пароль. Эту директиву можно настроить так чтобы она впускала только пользователей определенной группы или просто пользователей перечисленных после нее через пробел.

Для создания парольного файла нужно выполнить:

htpasswd -c .htpasswd admin

Где:

  • .htpasswd — имя парольного файла (можно не менять);
  • admin — логин доступа.
  • После этого в консоли вводится пароль и подтверждение пароля.

Парольный файлик — готов. Можно просто создать файл .htpasswd и ручками впечатать туда: yourname:yourpass (где: yourname — логин, yourpass — пароль), но это крайность, т.к. если твой сайт находится на общем хостинге, есть вероятность что другие пользователи хостинга будут мониторить логин:пароль.

Переопределение стандартных страниц ошибок

Переопределить стандартые страницы ошибок можно с помощью директивы

ErrorDocument

Например, чтобы для отображения 404-й ошибки использовалась страница с REQUEST_URI /errors/404.html достаточно прописать:

ErrorDocument 404 /errors/404.html

mod_rewrite

mod_rewrite — плагин к web-серверу apache, позволяющий налету подменять одни REQUEST_URI другими, с последющим редиректом или без.

Options +FollowSymLinks
RewriteEngine on

Это отдельная большая тема и тут рассматриваться не будет.

Синтаксис PHP, работающего в окружении web-сервера. Часть 1.

Структура скрипта. Формирование заголовков ответа.

Скрипт PHP — по сути является приложением, принимающим заголовки от браузера и формирующим заголовки ответа и содержимое. Создадим в DOCUMENT_ROOT web-сервера файл 0.php следующего содержания.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Заголовки, которые будут сформированиы этим скриптом будут выглядеть так:

HTTP/1.x 200 OK
Date: Sun, 06 Jul 2008 07:07:39 GMT
Server: Apache/2.2.6 (Mandriva Linux/PREFORK-8mdv2008.0)
X-Powered-By: PHP/5.2.6
Content-Length: 74
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

В браузер будет передано следующее содержимое:

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3
</h2>
</body>
</html>

Которое в окне браузера отобразится как заголовок первого уровня «Test» и заголовок 2-гоуровня «3».

Из приведённых примеров можно сделать следующие выводы:

  1. Содержимое файла с расширением .php не передаётся браузеру в неизменном виде, а обрабатывается интерпретатором PHP.
  2. Интерпретатор PHP по умолчанию формирует http-заголовки, показывающие, что содержимое страницы сгенерировано динамически и его следует отображать как html-страничку
  3. Всё содержимое файла с расширением .php передаётся браузеру без изменений, за исклученим блоков <?php … ?>, которые выполняются как программа, с возможностью вывода в виде html-кода

Есть возможность прописать собственные заголовки, для того, чтобы, например, содержимое генерируемой страницы отображалось не как html-страница, а как простой текст (без интерпретации тегов) (файл 1.php)

<?php header("Content-Type: text/plain");?>
<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
<?php
    $a = 1;
    $b = 2;
    $c = $a + $b;
    echo $c;
?>
</h2>
</body>
</html>

Сгенерированная страничка выведется в виде простого текста.

<html>
<head>
</head>
<body>
<h1>Test</h1>
<h2>
3</h2>
</body>
</html>

Ещё пара выводов:

  1. В тексте .php — файла может быть произвольное число блоков <?php ?>, каждый из которы будет исполняться как программа.
  2. Поскольку заголовки всегда отправляются перед тем как содержимое, вызовы функции header должны осуществляться перед тем, как будет вывод ЛЮБОГО текста. Таже если будет пробел перед первым <?php — заголовок не будет отправлен, и вместо него будет передан заголовок по умолчанию (в данном случае «Content-type: text/html»)

Получение информации об установленном интерпретаторе PHP.

В PHP есть стандартная функция, которая выводит в виде красивого форматированного html-кода параметры установленного интерпретатора PHP. Разместим в файле 2.php следующий код.

<?php phpinfo();?>

Сгенерированный этой функцией код формирует страницу следующего вида:

Страница информации о текущей версии PHP

Страница информации о текущей версии PHP

Переменные. Фукции для работы с переменными. Присваивание.

Массивы. Фукции для работы с массивами. Присваивание. List

Служебные массивы как средство передачи параметров скрипту.

Синтаксис PHP, работающего в окружении web-сервера. Часть 2.

Условия.

Операторы сравнения. Арифметические операторы.

Циклы foreach, for, while. Операторы continue и break

Функции. Встроенные функции.

Операторы include и include_once.

Принцип разделения данных и формы.

Операции ввода-вывода в PHP.

Работа с файловой системой

Функции работы с каталогами. Чтение содержимого каталога

Функции работы с файлами. Получение информации о файлах. Права.

Чтения из файла и запись в файл.

Работа с удалёнными документами с помощью http-протокола.

Работа по http-протоколу c использованием библиотеки curl.

Работа c удалённым документом как с файлом.

Загрузка файлов на сервер.

Работа с датой и временем.

Работа со строками в PHP.

2 вида кавычек. Операция конкатенации(слияния).

Длина строки

Разбиение строки на части по разделителю. Слияние строки по разделителю.

Выделение подстрок и поиск по подстроке.

Регулярные выражения

Когда возникает необходимость в регулярных выражениях.

Классы символов.

Псевдонимы классов символов.

Повторители.

Группировка.

Модификаторы

Ограничения регулярных выражений. Многострочное сопоставление.

MySQL. Часть 1

Табличное представление данных. Типы данных в столбцах.

Понятие первичного ключа

Понятие справочной таблицы.

Понятие внешнего ключа

Понятия сервера БД. Привелегии. Подключение. Простейшие запросы.

Запрос на создание таблицы.

Запрос на вставку строки в таблицу.

Запрос на выборку из таблицы

Условие в запросе.

Запрос на изменение записи в таблице.

Запрос на удаление строки

Запрос на удаление таблицы.

Основные популярные инструменты для работы с MySQL

phpMyAdmin

Sypex Dumper

MySQL. Часть 2.

Индексы

Сортировка выборки.

Лимитированная выборка.

Группировка выборки. Групповые операции.

Сложные запросы

Запрос со связыванием основной таблицы со справочной.

Использование подзапросов

7.6 Работа с MySQL из PHP.

Подключение к БД и установление кодировки соединения.

Осуществление запросов.

Получение количества выбранных строк.

Получение количества изменённых строк.

Получение значения первичного ключа вставленной строки.

Получение результата запроса на выборку.

Примеры реализации простых web-приложений.

Авторизация

Форма обратной связи. Отправка почты.

Счетчик посетителей

Гостевая книга. C уведомлением по почте.

Вопрос-ответ

Новости

Статья и комментарии