Учебник PHP. Самоучитель.

УЧЕБНИК PHP
справочник функций <Оnline>
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Учебник PHP

Подготавливая учебник, который Вы видите, авторы ставили перед собой цель дать достаточно подробное изложение языка РНР, по крайней мере, тех его частей, которые используются при разработке самых различных Web-приложений. Учебник разработан сотрудниками IT-студии SoftTime, и постоянно дополняется, поэтому, - следите за обновлениями! Неотъемлемой частью учебника являются те практические приложения, которые также можно скачать у нас на сайте по адресу www.softtime.ru.

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

С авторами можно связаться по адресу softtime@softtime.ru, а также вы можете задать свой вопрос на форуме по PHP, который открылся на нашем сайте.

С наилучшими пожеланиями от коллектива авторов,
Руководитель отдела разработки ПО компании "Информсвязьстрой" М.Кузнецов.
Наверх


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
справочник функций «Оnline»
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Следующая

PHP программы

Программы PHP могут выполняться двумя способами: как сценарное приложение Web-сервером и как консольные программы. Поскольку, нашей задачей является программирование web-приложений, мы преимущественно будем рассматривать первый способ.

Дело в том, что на PHP, как правило, используется сугубо для программирования приложений, связанных с Интернетом. Однако, PHP можно еще использовать в качестве интерпретатора командной строки, в основном в *nix-системах. Последнее возможно при помощи CORBA и COM интерфейсов, а также при помощи расширения PHP-GTK. При таком использовании PHP возможно решение следующих задач:
  • создание приложений интерактивной командной строки;
  • создание кросс-платформенных GUI приложений при помощи библиотеки PHP-GTK;
  • автоматизация некоторых задач под Windows и Linux

Рассмотрим процесс выполнения php-сценария при обращении броузера к серверу. Итак, вначале броузер запрашивает страницу с расширением .php, после чего web-сервер пропускает программу через машину PHP и выдаёт результат в виде html-кода. Причем, если взять стандартную страницу HTML, изменить расширение на .php и пропустить её через машину PHP, последняя просто перешлёт её пользователю без изменений. Чтобы включить в этот файл команды PHP, необходимо заключить команды PHP в специальные теги, которых различают 4 вида (они эквивалентны и можно использовать любые):

  1. Инструкция обработки XML:
    <?php
    ...
?>
  2. Инструкция обработки SGML:
    <?
    ...
?>
  3. Инструкция обработки сценариев HTML:
    <script language = "php">
    ...
</script>
  4. Инструкция в стиле ASP:
    <%
    ...
%>

Мы будем придерживаться стиля XML или SGML.

Вообще говоря, внутри какого-либо блока кода можно выйти из PHP, при условии, что дальше мы войдем в него снова и закончим код (Подробнее об этом смотрите в гл.2.). Т.е., возможна следующая конструкция:

<?
   if(5<3){
   echo("<p>Hello, world!<p>");
?>
   <p>Hello!</p>
   // эта строка не интерпретируется как код PHP
   // и выводится только если  блок кода выполняется
<?
      echo("<p>Hello, world!<p>");
   }
?>

Команда echo в PHP применяется для вывода фактически всего, что встречается на web-страницах (текст, разметку HTML, числа). Смысл ее действия, мы думаем, понятен из приведенного примера.

Следующая


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Предыдущая Следующая

Комментарии

PHP предоставляет несколько методов для вставки комментариев. Проще всего пользоваться двойным слэшем (//), после чего PHP машина игнорирует все, что расположено до конца строки. Также можно пользоваться многострочными комментариями в стиле С (/*…*/). Для однострочных комментариев можно еще пользоваться символом решетки (#) (комментарий скриптовых языков UNIX).

<php
   echo("<p>Hello</p>"); // комментарий
   echo("<p>Hello</p>"); # комментарий
   /*
      и это тоже комментарии
   */
?>

Следует помнить о том, что стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу. Например:

<php
   echo("<p>Hello</p>"); // нормальный комментарий
?>
// а вот этот комментарий отобразиться броузером.
<!-- Комментарий  HTML.
Будет виден в исходном коде HTML, но не в браузере  -->

Заметим, что комментарии можно вставлять не только после конца оператора, а, например, и вот так:

<?
   $a = "Hello, world";
   echo strstr($a,"H");
   // эту функцию мы рассмотрим позднее
?>
Предыдущая Следующая


Переменные PHP, переменные окружения, глобальные переменные

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Предыдущая Следующая

Переменные

В РНР переменные начинаются со знака доллара ($). За этим знаком может следовать любое количество буквенно-цифровых символов и символов подчеркивания, но первый символ не может быть цифрой или подчеркиванием. Следует также помнить, что имена переменных в РНР чувствительны к регистру, в отличие от ключевых слов.

При объявлении переменных в РНР не требуется явно указывать тип переменной, при этом одна и та же переменная может иметь на протяжении программы разные типы.

Переменная инициализируется в момент присваивания ей значения и существует до тех пор, пока выполняется программа. Т.е., в случае web-страницы это означает, что до тех пор, пока не завершен запрос.

Внешние переменные

После того, как запрос клиента проанализирован веб-сервером и передан РНР машине, последняя устанавливает ряд переменных, которые содержат данные, относящиеся к запросу и доступны все время его выполнения. Сначала РНР берет переменные окружения Вашей системы и создает переменные с теми же именами и значениями в окружении сценария РНР для того чтобы сценариям, расположенным на сервере были доступны особенности системы клиента. Эти переменные помещаются в ассоциативный массив $HTTP_ENV_VARS (подробнее о массивах можно узнать в главе 4).

Естественно, что переменные массива $HTTP_ENV_VARS являются системно зависимыми (поскольку это фактически переменные окружения). Посмотреть значения переменных окружения для Вашей машины Вы можете при помощи команды env (Unix) или set (Windows).

Затем РНР создает группу GET-переменных, которые создаются при анализе строки запроса. Строка запроса хранится в переменной $QUERY_STRING и представляет собой информацию, следующую за символом "?" в запрошенном URL. РНР разбивает строку запроса по символам & на отдельные элементы, а затем ищет в каждом из этих элементов знак "=". Если знак "=" найден, то создается переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:

<form action = "http://localhost/PHP/test.php" method="get">
   HDD: <input type="text" name="HDD"/><br>
   CDROM: <input type="text" name="CDROM"/><br>
<input type="submit"/>

Если Вы в этой форме в строке HDD наберете, к примеру, "Maxtor", а в строке CDROM "Nec", то она сгенерирует следующую форму запроса:

http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec

В нашем случае РНР создаст следующие переменные: $HDD = "Maxtor" и $CDROM = "Nec".

Вы можете работать с этими переменными из Вашего скрипта (у нас – test.php) как с обычными переменными. В нашем случае они просто выводятся на экран:

<?
   echo("<p>HDD is $HDD</p>");
   echo("<p>CDROM is $CDROM</p>");
?>

Если запрос страницы выполняется при помощи метода POST, то появляется группа POST-переменных, которые интерпретируются также и помещаются в массив $HTTP_POST_VARS.


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Предыдущая Следующая

Константы

Константы объявляются в РНР при помощи функции define():

define(CONSTANT, value)

Первый параметр этой функции – имя константы, второй – её значение. При использовании константы на неё ссылаются по имени:

<?
   define(CONSTANT1,15);
   define(CONSTANT2,"\x20"); // код пробела
   define(CONSTANT3,"Hello");
   echo(CONSTANT1);
   echo(CONSTANT2);
   echo(CONSTANT3);
?>

По традиции имена констант пишут буквами верхнего регистра. И хотя это только традиция, мы Вам рекомендуем ей следовать, поскольку плохие программисты получаются в том числе и из тех, кто не следовал хорошим традициям J. Существует функция defined(), которая проверяет, определена ли константа:

<?
   define(CONSTANT,"Hello");
   if(defined("CONSTANT"))
   {
      echo("<p>CONSTANT is defined</p>");
   }
?>


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Предыдущая Следующая

Типы данных в РНР. Преобразование типов

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

  • integer;
  • string;
  • boolean;
  • double;
  • array;
  • object;

Есть функция gettype(), возвращающая тип, который РНР назначил переменной:

<?
   $var = "5";
   $var1 = 5;
   echo(gettype($var));
   echo "<br>";
   echo(gettype($var1));
?>

В первом случае РНР вернет string, во втором integer.

Существует также функция settype(), которая явно устанавливает тип:

<?
   $var = "5";
   echo(gettype($var));
   settype($var,integer);
   echo "<br>";
   echo(gettype($var));
?>

Выполнение этого фрагмента кода приведет к такому же результату, как и предыдущего.

Кроме функции settype() преобразование типов в РНР можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путем указания перед переменной ее нового типа, взятого в скобки:

$var = (int)$var;

Соответственно, выполнение следующего кода приведет к тому, что РНР вернет integer:

<?
   $var = "5"; // тип string
   $var = (int)$var; // преобразуем в int
   echo(gettype($var));
?>


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Предыдущая Следующая

Операторы

Арифметические операторы

+ | Сложение
- | Вычитание
* | Умножение
/ | Деление
% | Вычисление остатка по модулю (к примеру: 5 % 2=1)

Поразрядные операторы

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

& | Поразрядная конъюнкция (AND)
| | Поразрядная дизъюнкция (OR)
^ | Поразрядное исключающее ИЛИ (XOR)
~ | Поразрядное отрицание (NOT)
<< | Сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда
>> | Сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда

Пример:

<?
   echo(4<<2); // равно 16
   echo"<br>";
   echo(5>>1); // равно 2
   echo"<br>";
   echo(6&5); // равно 4
   echo"<br>";
   echo(6|5); // равно 7
   echo"<br>";
   echo(6^5); // равно 3
>?

Разберем первый пример. Двоичный код для 4 равен 100, при сдвиге влево на 2 разряда код 100 становится равным 10000, что соответствует десятичному значению 16. Остальные примеры могут быть разобраны аналогично. Обратим внимание на то, что сдвиг влево на n позиций эквивалентен умножению на 2n, а сдвиг вправо уменьшает соответствующее значение в 2n раз с отбрасыванием дробной части результата (поэтому 5>>1 равно 2). Основное назначение этих операторов – быстрые вычисления. Так как их поддержка осуществляется на аппаратном уровне (процессор), алгоритмы, выполненные с использованием данных операторов получаются очень производительными.

Логические операторы

or или || | ИЛИ
Xor | исключающее ИЛИ
and или && | И
! | НЕ

Операторы этой группы, в отличие от поразрядных, работают с логическими переменными (boolean) и интенсивно используются в управляющих конструкциях: циклы и условия. Логические переменные, или более правильно, переменные типа Boolean имеют лишь два значения: true(истина) и false(ложь). В выражениях true и false можно заменить на 1(любое отличное от 0 число) и 0, соответственно. Возможность замены true и false на 1 и 0 – это «наследство» языка С, в котором не было специальных переменных true и false.

Логически операторы для переменных типа Boolean выполняют роль операторов сложения, вычитания для обычных переменных. Рассмотрим несколько примеров, если их смысл Вам не очень понятен – не расстраивайтесь, просто вернитесь сюда, прочитав главу 2. Оператор if(cond) проверяет условие cond, если его значение true – выполняется код в фигурных скобках, следующий за if, если false – код после оператора else. Если cond равен false – всё наоборот.

<php
   $flag = true; // Истина
   if($flag)
   {
      echo "<p>Переменная flag имеет значение true</p>";
   } else {
      echo "<p>Переменная flag имеет значение false</p>";
   }
?>

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

Переменная flag имеет значение true

Если теперь заменить строчку

    $flag = true; // Истина
    на
    $flag = false; // Ложь

Результат, выдаваемый тэгом измениться:

Переменная flag имеет значение false

Т.е. мы зашли в блок else, так как в операторе if условие ложно.

Когда условие одно, как видите, всё просто. Когда условий больше - в дело вступают логические операторы:

<php
   $flag1 = true; // Истина
   $flag2 = true; // Истина
   if($flag1 && $flag2) // И $flag1 И $flag2 истины
   {
      echo "<p>Условие: true (Оба флага истины)</p>";
        // Да
   } else {
      echo "<p>Условие: false (Один из флагов ложен)</p>";
        // Нет, один или оба ложны
   }
?>

Этот скрипт выведет: Условие: true (Оба флага истины). Если хотя бы один из операторов окажется равным false (или оба сразу) – будет выведено: Условие: false (Один из флагов ложен).

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

Заменим && (И) на || (ИЛИ)

<php
   $flag1 = true; // Истина
   $flag2 = false; // Истина
   if($flag1 || $flag2)
      // Хоть кто-то из двух флагов($flag1 $flag2) истинен
   {
      echo "<p>Условие: true (Один из флагов истин)</p>";
      // Да
   } else {
      echo "<p>Условие: false (Оба флага ложны)</p>";
      // Нет оба имеют значение false
   }
?>

Опять получаем: Условие: true.

Для И и ИЛИ, как видим, возможны два варианта операторов, причем эти операторы с разными приоритетами. Приоритетность выполнения логических операторов: or > xor > and > || > && > ! Иногда в условиях удобно использовать скобки для явного задания приоретета:

<php
   $flag1 = true;
   $flag2 = true;
   $flag3 = false;
   if( $flag1 && $flag2 || $flag3)
   {
      echo "<p>Условие истинно<p>";
   }
   else
   {
      echo "<p>Условие ложно<p>";
   }
?>

Результатом будет вывод фразы «Условие истинно», так как согласно приоритету исполнения сначала выполняется оператор &&, так как оба флага равны true – возвращается true, затем это выражение сравнивается с $flag3 (true || $flag3) – что возращает тоже true, так как одно из сравниваемых равно true.

Если же мы запишем

<php
   $flag1 = true;
   $flag2 = true;
   $flag3 = false;
   if($flag1 && ($flag2 || $flag3))
   {
      echo "<p>Условие истинно<p>";
   }
   else
   {
      echo "<p>Условие ложно<p>";
   }
?>

результатом будет «Условие ложно».

Вообще программисты не любят запоминать порядок приоритетов, поэтому для того чтобы Ваш код легко читался (в том числе и Вами) лучше всегда использовать скобки. Т.е. в первом скрипте лучше записать if(($flag1 && $flag2) || $flag3) – тогда сразу становиться понятно, что имеется ввиду.

Иногда нужно проверить условие безальтернативно, например, на ложность или истинность. Допустим, функция (func()) возвращает истину или ложь и в зависимости от этого нужно вывести на страничку те или иные теги. Например, функция mysql_query($query) – возвращает true если запрос к базе данных mySQL, размещённый в строке $query успешно выполнился и false – в противном случае.

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

<php
   if(mysql_query($query))
   {
      echo "<p>Данные успешно занесены в базу данных.<p>";
   }
?>

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

<php
   if(mysql_query($query))
   {}
   else
   {
      echo"<p>Данные не были занесены в базу данных.<p>";
   }
?>

Но это не элегантный, запутывающий способ – здесь самое время воспользоваться оператором отрицания: !, применение которого к переменной меняет её значение с true на false, а false на true:

<php
   if(!mysql_query($query))
   {
      echo"<p>Данные не были занесены в базу данных.<p>";
   }
?>


PHP if. Операторы выбора. Учебник PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы выбора/ if...else

К операторам выбора относят: условный оператор (if...else) и переключатель (switch). Синтаксис условного оператора:
if(condition) statement 1 else statement 2

Условие condition может быть любым выражением. Если оно истинно, то выполняется оператор statement 1. В противном случае выполняется оператор statement 2. Допустима сокращенная форма записи условного оператора, в которой отсутствуют else и оператор statement 2.

В свою очередь, операторы statement 1 и statement 2 могут быть условными, что позволяет организовывать цепочки проверок любой глубины вложенности. И в этих цепочках каждый условный оператор может быть как полным, так и сокращенным. В связи с этим возможны ошибки неоднозначного сопоставления if и else.

Синтаксис языка предполагает, что при вложенных условных операторах каждое else соответствует ближайшему if. В качестве такого ошибочного примера можно привести следующую конструкцию [Подбельский В.В. Язык С++. М.:Финансы и статистика, 2001]:

<?
   $x = 1;
   $y = 1;
   if($x == 1)
   if($y == 1)echo("x=1 and y=1");
   else echo("x!=1");
?>

При х равном 1 и у равном 1 совершенно справедливо печатается фраза «х = 1 and у = 1». Однако фраза «х != 1» может быть напечатана при х равном 1 и при у не равном 1, так как else соответствует ближайшему if. Внешний условный оператор, где проверяется $x == 1, является сокращенным и в качестве statement 1 включает полный условный оператор, где проверяется условие $у == 1. Т.е. проверка этого условия выполняется только при х равном 1. Простым правильным решением этой задачи является применение фигурных скобок, т.е. построение составного оператора, т.е. нам нужно фигурными скобками ограничить область действия внутреннего условного оператора, сделав его неполным. Тем самым внешний оператор превращается в полный условный:

<?
   $x = 1;
   $y = 1;
   if($x==1)
   {
      if($y==1)echo("x=1 and y=1");
   }
   else echo("x!=1");
?>

Заметим, что проверка дополнительных условий возможна при помощи оператора elseif. Оператор if может включать сколько угодно блоков elseif, но else в каждом if может быть только один. Как правило, в конструкциях if…elseif…else оператор else определяет, что нужно делать, если никакие другие условия не являются true. Однако, вообще говоря, использование оператора elseif довольно сильно ухудшает читабельность кода, и лучше в этом случае пользоваться переключателем (switch).

РНР предоставляет также возможность альтернативного синтаксиса условного оператора – без фигурных скобок, а с применением оператора endif. В следующем примере первая таблица помещается на страницу, если только $HDD равно «Maxtor», а вторая - если «Seagate». Наличие оператора endif в этом случае обязательно, так как фигурная скобка, обозначающая конец блока if, отсутствует:

<?
   if($HDD == «Maxtor»):
?>
<table>
    <caption> Maxtor </caption>
</table>
<?
   elseif($HDD == «Seagate»):
?>
<table>
   <caption> Seagate </caption>
</table>
<?
   endif;
?>

Результат выполнения скрипта:

Форма запроса

Результат выполнения скрипта

Значение переменной $HDD передается формой test.html скрипту test.php. Код формы test.html:

<form action = "http://localhost/PHP/test.php;" method="get">
   HDD: <input type="text" name="HDD"/><br>
   <input type="submit"/>
</form>

РНР также, как и С++, Java предоставляет возможность заменять блоки if…else условной операцией (в отличие от унарных и бинарных операций условная операция используется с тремя операндами). В изображении условной операции присутствуют два размещенных не подряд символа ‘?’ и ‘:’ и три операнда выражения:

выражение_1 ? выражение_2 : выражение_3

Первым вычисляется значение выражения_1. Если оно истинно (т.е. не равно нулю), то вычисляется значение выражения_2, которое и становится результатом. Если при вычислении значения выражения_1 получится ноль (ложь), то в качестве результата берется выражение_3. Классическим примером условной операции является выражение

x < 0 ? –x : x;

Это выражение возвращает абсолютное значение переменой x.
Т.е., к примеру, код

<?
   if($HDD == "Maxtor")
   {
      $CDROM = "Teac";
   }
   else
   {
      $CDROM = "Nec";
   }
?>
можно, используя условную операцию, заменить таким:

<?
   $CDROM = ($HDD == "Maxtor") ? "Teac" : "Nec";
?>

Однако если Вы не хотите кому-то глубоко и надолго запудрить мозги, злоупотреблять такими записями вряд ли стоит, поскольку код становится, мягко говоря, нечитабельным. И вообще, чем проще – тем лучше.


PHP switch. Операторы выбора, переключатель switch. Учебник PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы выбора/ Переключатель switch

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

switch(expression) // переключающее выражение
{
   case value1: // константное выражение 1
      statements; // блок операторов
   break;
   case value2: // константное выражение 2
      statements;
   break;
   default:
      statements;
}

Управляющая структура switch передает управление тому из помеченных case операторов, для которого значение константного выражения совпадает со значением переключающего выражения. Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, помеченному меткой default. В каждом переключателе может быть не более одной метки default, однако она может отсутствовать вообще. Приведем пример программы с переключателем. В этой программе выводятся названия нечетных целых десятичных цифр от 1 до 9 не меньше заданной, в зависимости от числа, указанного в форме test.html. Форма test.html не отличается от той, что мы уже использовали:

<form action = "http://localhost/PHP/chapt2/switch.php" method="get">
    number: <input type="text" name="number"/><br>
    <input type="submit"/>
</form>

<?
switch($number)
{
    case 1:
      echo ("one ");
    case 2: case 3:
      echo ("free");
    case 4: case 5:
      echo ("five");
    case 6: case 7:
      echo ("seven");
    case 8: case 9:
      echo ("nine");
    break;
    default:
      echo ("This isn't number or number is > 9 or < 1");
}
?>

Результат выполнения скрипта:

Форма запроса

Результат выполнения скрипта

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

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

Как видим, после конструкции switch приведен составной оператор, однако это совершенно не обязательно – после switch может находиться любой оператор, помеченный служебным словом case.

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

Заметим также, что в PHP в качестве меток case могут использоваться не только литералы, но и сами метки могут быть переменными. В качестве меток case в PHP не могут выступать только массивы и объекты.


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы цикла

Операторы цикла задают многократное исполнение операторов в теле цикла. В PHP определены 4 разных оператора цикла:

  • цикл с предусловием:

while(condition)
{
   statements;
}

  • цикл с постусловием:

do
{
   statements;
} while(condition);

  • итерационный цикл:

for(expression1;expression2;expression3)
{
   statements;
}

  • итерационный цикл foreach:

foreach (array as [$key =>] $value)
{
   statements;
}

Если 3 первых оператора цикла берут свое начало от С-подобных языков, то последний оператор позаимствован у языка Perl (кстати, цикл foreach мы разберем попозже – в главе 4, посвященной массивам).


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы цикла/ While

Оператор while называется оператором цикла с предусловием. При входе в цикл вычисляется выражение условие, и, если его значение отлично от нуля, выполняется тело цикла. Затем вычисления выражения условия и операторов тела цикла выполняется до тех пор, пока значение выражения условия не станет равным нулю. Оператором while удобно пользоваться для просмотра всевозможных последовательностей, если в конце них находится заранее известный символ. (Это очень удобно в C++, к примеру для определения длины строки, поскольку в С++, по определению, строка есть последовательность символов типа char, заканчивающаяся нулевым символом).

Пример простейшего цикла while:

<?
   $var = 5;
   $i = 0;
   while(++$i <= $var)
   {
      echo($i); echo('<br>');
   }
?>

Этот код выдает в окне браузера цифры от одного до пяти:

1
2
3
4
5

Для выхода из цикла применяется оператор break. При обнаружении этого оператора текущая итерация цикла прекращается, и последующие итерации не происходят. При выполнении следующего примере, несмотря на то, что переменная $var = 7, в окне браузера появятся цифры от 1 до 5.

<?
   $var = 7;
   $i = 0;
   while(++$i <= $var)
   {
      echo($i);
      echo('<br>');
      if($i==3)break;
   }
?>

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

<?
   $var = 7;
   $i = 0;
   while(++$i <= $var)
   {
      if($i==5)
      {
         continue;
      }
      echo($i);
      echo('<br>');
   }
?>

В этом примере выводятся цифры от 1 до 7, кроме цифры 5:

1
2
3
4
6
7

Заметим, что если Вы условный оператор поставите после операторов echo, код будет ошибочным, и выведутся все цифры от 1 до 20, поскольку проверка условия выхода из цикла на данной итерации, будет происходить уже после выполнения этой итерации.

Бесконечный цикл реализуется при помощи оператора while следующим образом:

   while(1)
   {
        ...
   }

Это тоже самое, что и запись while(true).


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы цикла/ Do…while

Этот оператор называется оператором цикла с постусловием. При входе в цикл в любом случае выполняется тело цикла (т.е. цикл всегда будет выполнен хотя бы один раз), затем вычисляется условие, и если оно не равно 0, вновь выполняется тело цикла. В нижеследующем примере ноль всегда будет добавлен в список, независимо от условия (++$i <= $var):

<?
   $var = 5;
   $i = 0;
   do
   {
      echo($i); echo('<br>');
   }
   while(++$i <= $var)
?>

Результат:

1
2
3
4
5

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

Бесконечный цикл реализуется так:

   do ; while(1);


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP

    If... else

    Switch

    Операторы цикла

    While

    Do While

    For

  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Операторы языка PHP
Предыдущая Следующая

Операторы цикла/ For

Как уже говорилось, итерационный цикл имеет следующий формат:

   for(expression1;expression2;expression3)
   {
      statements;
   }

Здесь expression1 (инициализация цикла) – последовательность определений и выражений, разделяемая запятыми. Все выражения, входящие в инициализацию, вычисляются только один раз при входе в цикл. Как правило, здесь устанавливаются начальные значения счетчиков и параметров цикла. Смысл выражения-условия (expression2) такой же как и у циклов с пред- и постусловиями. При отсутствии выражения-условия предполагается, что его значение всегда истинно. Выражения expression3 вычисляются в конце каждой итерации после выполнения тела цикла.

В следующем скрипте, мы по традиции выведем числа от 0 до 5:

<?
   $var = 5;
   $i = 0;
   for ($i = 0; $i <= $var; $i++)
   {
      echo($i);
      echo('<br>');
   }
?>

Результат аналогичен, показанному на предыдущем рисунке.

Бесконечный цикл можно организовать следующим образом:

   for(;;);

или

   for(;1;);


Строковые функции PHP. Работа со строками

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Несмотря на то, что эта глава написана скорее в духе справочника, материал, изложенный в ней, достаточно серьезен, хотя и не самый сложный для понимания. Умение грамотно работать со строками очень важно для программиста. Строковых функций в PHP немало, причем многие из них, так или иначе, просто дублируют друг друга. Однако, приемы работы с основными блоками функций (функции поиска и замены в тексте, функции удаления пробельных символом (trim-функции), функции форматного вывода) надо представлять очень четко.

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


Htmlspecialchars. Строковые функции PHP. Работа со строками

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функция htmlspecialchars

htmlspecialchars()

Вообще говоря, эта функция относится к функциям преобразования символов, о которых мы тоже будем говорить в этой главе. Эту функцию мы вынесли в самое начало из-за того, что она делает одну простую, но важную вещь – производит преобразование спецсимволов в их HTML эквиваленты. Попросту говоря, эта функция гарантирует, что если Вы вдруг вздумаете написать в гостевой книге или на форуме какой-то код (php, javascript и т.д.) он отобразиться совершенно нормально, но выполняться не будет! Т.е. функцию надо применять, если нужно вывести в броузере какой-то код. Кроме того, эта функция избавляет Вас от всяких кретинов, которым нечем заняться кроме как писать в Ваших гостевых книгах (и любых формах ввода) какие либо скрипты. Ну а теперь, собственно, о функции.

Синтаксис:

string htmlspecialchars(string str [, int quote_style [, string charset]]);

Первый аргумент – строка, в которой надо выполнить преобразование. В качестве второго необязательного аргумента принимается одна из двух констант: ENT_QUOTES или ENT_QUOTES. Первая константа передается если надо транслировать кавычки, а вторая, если этого делать не надо. Третий необязательный аргумент принимает строку, представляющую набор символов, используемых в преобразовании (по умолчанию ISO-8859-1).

К примеру, если Вы обрабатываете какое-то сообщение $msg формы, то обработка его функцией htmlspecialchars() возможна следующим образом:

$msg = htmlspecialchars($msg);

Как видите, все просто.

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

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

<?
   $action = $HTTP_POST_VARS["action"];
   if ( empty($action) )
   {
   ?>
      <HTML>
      <HEAD>
      <TITLE>Примерчик</TITLE>
      </HEAD>
      <BODY>
      <center>
      <table width=1 border=0>
      <form action=test1.php method=post>
         <input type=hidden name=action value=post>
         <tr><td colspan=2>Сообщение<br><textarea cols=50 rows=8 name=msg>
         <? echo $msg; ?>
         </textarea></td></tr>
         <tr><td colspan=2><input type=submit value='Добавить'></td></tr>
      </form>
      </table>
      </center>
      </BODY>
      </HTML>
   <?
   }
?>

Ничего сложного, просто форма для ввода сообщения. Выводится и обрабатывается введенное сообщение файлом, указанным action’е формы (test1.php). Код, написанный в этом файле тоже прост:

<?
   $msg = substr($HTTP_POST_VARS["msg"],0,1024);
   $msg = htmlspecialchars($msg);
   print "<P>".$msg."</P>\n";
?>

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

А теперь давайте немного пошутим, и введем в форму для вода сообщения вместо безобидного текста вот такой javascript-код (пока тоже безобидный):

<Script Language="JavaScript">
   alert("Приветик!"); // функция вывода в JavaScript
</Script>

Т.е. наша форма примет следующий вид:

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

<Script Language="JavaScript">alert("Приветик!");</Script>

А вот если, мы не обработали сообщение функцией htmlspecialchars() (закомментарьте строку $msg = htmlspecialchars($msg); в test1.php), то мы увидим уже не текст скрипта, а результат его выполнения:

Как понимаете, "приветик" может быть совсем не таким безобидным.


Строковые функции PHP. Поиск в тексте. substr, strpos, strrpos, strstr, strchr, stristr, strrchr, substr_count, strspn, strcspn

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции поиска в тексте

substr()
strpos()
strrpos()
strstr()
strchr()
stristr()
strrchr()
substr_count()
strspn()
strcspn()

substr()

Синтаксис:

string substr(string string, int start[, int length])

Эта функция возвращает часть строки. Первый аргумент – исходная строка; второй – положение в строке, которую надо вернуть, первого символа (отсчет начинается с нуля); третий – длина строки в символах, которую надо вернуть. Если третий аргумент не указан, то возвращается вся оставшаяся часть строки.

Пример:

<?
   $string = substr("Hello, world!", 6, 2);
   echo ();
?>

Результат выполнения – символ "w". Если же третий параметр не указывать, т.е. написать
$string = substr("Hello, world!", 6);

то возвратиться подстрока "world!".

strpos()

Синтаксис:

string strpos(string haystack, string needle[, int offset])

Эта функция обеспечивает действие, обратное функции substr. Т.е. она возвращает позицию в строке haystack, в которой найдена переданная ей подстрока needle. Т.е. следующий скрипт

<?
   $string = strpos("Hello, world!", "world");
   echo($string);
?>

вернет нам число 7.

Необязательный параметр offset позволяет указать в строке позицию, с которой надо начинать поиск:

strrpos()

Синтаксис:

string strrpos(string haystack, string needle)

Эта функция ищет в строке haystack последнюю позицию, где встречается символ needle.

strstr()

Синтаксис:

string strstr(string haystack, string needle)

Функция strstr() возвращает участок строки, заданной в параметре haystack, начиная с первого фрагмента, указанного в параметре needle и до конца строки. В случае неудачи функция возвращает false.

Пример:

<?
   $url = "http://www.softtime.ru";
   $www = strstr($url,"w");
   echo ($www);
?>

Результат: www.softtime.ru

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

strchr()

Синтаксис:

string strchr(string haystack, string needle)

Данная функция работает абсолютно идентично функции strstr():

<?
   $url = "http://www.softtime.ru";
   $www = strstr($url,"w");
   echo ($www);
?>

Результат: www.softtime.ru

stristr()

Синтаксис:

string stristr(string haystack, string needle)

Эта функция работает абсолютно аналогично функции strstr(), только является нечувствительной к регистру.

strrchr()

Синтаксис:

string strrchr(string haystack, string needle)

А эта функция отличается от аналогичных ей тем, что осуществляет поиск последнего вхождения подстроки. Т.е. функция strrchr() возвращает участок строки, заданной в параметре haystack, начиная с последнего фрагмента, указанного в параметре needle и до конца строки. В случае неудачи возвращает false.

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

Даже не знаю, что придумать в качестве примера на эту функцию. Ну давайте посмотрим, какая у нас директория (у меня, естественно) прописана последней в переменной окружения $PATH:

<p>
   <font color=red> Это все, что у меня есть :)</font>
</p>
<?
   echo ($PATH);
?>
<p>
   <font color=red> А это – из последнего:</font>
</p>
<?
   $dir = substr(strrchr($PATH, ";"), 1);
   echo ($dir);
?>

И вот что мы видим в результате:

substr_count()

Синтаксис:

int substr_count(string haystack, string needle)

Функция substr_count() находит количество вхождений фрагмента в строку. Она возвращает число фрагментов needle, присутствующих в строке haystack.

Пример:

<?
   $str = "dfhd@ffs@dfskfk@asas";
   $substr_count = substr_count($str,"@");
   echo ($substr_count);
?>

Результат: 3.

strspn()

Синтаксис:

int strspn(string str1, string str2)

Функция strspn() определяет присутствие начальных символов в строке. Она возвращает длину начального фрагмента строки str1, состоящего полностью из символов, которые есть в строке str2.

Пример:

<?
   $str = "dfhd@ffs@dfskfk@asas";
   $substr_count = strspn($str,"df");
   echo ($substr_count);
?>

Результат: 2.

strcspn()

Синтаксис:

int strcspn(string str1, string str2)

Обратная функции strspn() функция strcspn() Определяет отсутствие начальных символов в строке.

Функция strcspn() возвращает длину начального фрагмента строки str1, состоящего полностью не из символов, которые есть в строке str2.


Функции PHP: strlen(), chr(), ord(). Строковые функции PHP. Работа со строками

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции strlen(), chr() и ord()

strlen()
chr()
ord()

strlen()

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

<?
   $string = "Hello, world!!!";
   $string_len = strlen($string);
   echo ($string_len);
?>

chr()

Эта функция принимает в качестве аргумента ASCII код символа и возвращает соответствующий этому коду фактический символ:

<?
   $str = chr(36);
   echo ($str); // возвращает символ "$"
?>

ord()

Выполняет действие, обратное функции chr():

<?
   $str = ord('$');
   echo($str); // возвращает 36
?>


Trim-функции (функции удаления пробельных символов). Строковые функции PHP. Работа со строками

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Trim-функции (функции удаления пробельных символов)

trim()
ltrim()
rtrim()
chop()

Это очень полезная группа функций, без которых сложно обойтись при работе со строками. К пробельным символам относятся символы "\n", "\r", "\t", "\v", "\0" и собственно пробел. Особенно часто мы с этими функциями будем работать при изучении файлового ввода-вывода.

trim()

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

Пример:

<?
   $string = trim("   Hello, world!   ");
?>

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

<?
   $str = "   Hello, world!   ";
   $str1 = trim("   Hello, world!   ");
   $str_len = strlen($str);
   $str1_len = strlen($str1);
   echo(" размер исходной строки '$str' = $str_len, <br>
   размер строки после удаления пробелов = $str1_len");
?>

И вот результат, доказывающий, что функция ведет себя вполне прилично:

Размер исходной строки 'Hello, world!' = 19,
размер строки поле удаления пробелов = 13

ltrim(), rtrim() и chop()

Функция ltrim() удаляет из строки начальные пробельные символы (т.е., те которые слева); rtrim()– конечные пробельные символы. Функция chop() является синонимом функции rtrim().


Функции форматного вывода printf() и sprintf(). Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции форматного вывода. Спецификаторы преобразования

printf()
sprintf()
sscanf()

printf() и sprintf()

Синтаксис:

int printf(string format [, mixed args])
string sprintf(string format [, mixed args])

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

С одной стороны этими функциями можно пользоваться просто как функциями вывода:

<?
   printf("Hello!"); // выводит  "Hello!"
   sprintf("Hello!"); // сама по себе ничего не выводит,
   $str = sprintf("Hello!"); // а просто возвращает строку,
   printf($str); // которую затем можно вывести в выходной поток
?>

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

Спецификация определяется символом "%", за которым может следовать до пяти спецификаторов в следующем порядке:

  1. Спецификатор заполнения
    Устанавливает символ, которым строка заполняется до заданного размера. По умолчанию используется пробел. Спецификатор заполнения действует только при наличии спецификатора минимальной ширины
  2. Спецификатор выравнивания
    По умолчанию дополнение строки до минимальной ширины производится с левого края (т.е., строка выравнивается по правому краю). Если добавлен символ дефиса, то строка выравнивается по левому краю
  3. Спецификатор минимальной ширины
    Представляет собой целое число, задающее минимальный размер форматированной строки. Если переданная строка меньше, то она дополняется символами, указанными в спецификаторе заполнения
  4. Спецификатор точности
    Предназначен для указания количества десятичных знаков в представлении чисел с плавающей точкой. При применении этого спецификатора для форматирования строк, он определяет максимальное количество символов, которое нужно взять из переданной строки
  5. спецификатор типа
    Этот спецификатор предназначен для указания типа данных, которые переданы в качестве аргумента. Спецификатор может принимать одно из следующих значений:
    • b – целое число, представляемое в двоичном виде;
    • с – целое число, представляемое в виде символа с тем же ASCII кодом;
    • d – целое число, представляемое в десятичном виде;
    • f – число с плавающей точкой, представляемое в виде десятичной дроби;
    • o – целое число, представляемое в восьмеричном виде;
    • s – строка;
    • x – целое число, представляемое в шестнадцатеричном виде в нижнем регистре;
    • X – целое число, представляемое в шестнадцатеричном виде в верзнем регистре

Теперь, после разговора о спецификаторах типа, выведем с помощью функции printf() строку в формате даты dd/mm/yyyy. Следующий код выводит в результате строку "02/03/2003":

<?
   $day = 2;
   $month = 3;
   $year = 2003;
   printf("%02d/%02d/%04d", $day, $month, $year);
?>

Результат:

02/03/2003

В этом примере, месяц и день мы форматируем как двузначные числа, а год – как четырехзначное. При этом мы указываем, что целые числа дополняются до минимальной длины нулями слева: %04d

Первый символ – спецификатор заполнения и он равен нулю. Так как дополнение дописывается к началу числа, спецификатор выравнивания отсутствует. Спецификатор минимальной ширины равен двум. Спецификатор точности также отсутствует, так как мы форматируем целое число. Спецификатор типа представлен символом d, так как мы форматируем число как десятичное целое.

Приведем еще один пример.

<?
   $value = 19;
   printf("%.3f", $value);
?>

Этот скрипт выводит число 19 в виде 19.000

Еще одна форматная функция

функция sscanf()

Синтаксис:

mixed sscanf(string str, string format [, string var1 ...])

Эта функция является полной противоположностью функции printf(). Она интерпретирует строку str согласно формату format, аналогично спецификации printf(). При указании только двух аргументов полученные значения возвращаются как массив.

Давайте рассмотрим такой пример. Пусть у нас есть строка, в которой находится информация о названии и серийном номере изделия в виде "maxtor/203-5505" и нам надо вытащить из нее серийный номер. Пишем вот такой скриптик:

<?
   $product = "maxtor/203-5505";
   $str = sscanf($product,"maxtor/%3d-%4d");
   echo ("$str[0]-$str[1]");
?>

Результат:

203-5505

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

Давайте поработаем еще с датой изготовления этого изделия, которая нам явилась в виде "august 10 2003", а нам надо чтоб она выводилась в виде " 10 aug 2003". Работаем.

<?
   $date = "august 10 2003";
   list($month, $day, $year) = sscanf($date, "%s %d %d");
   echo("Date: $day-".substr($month,0,3)."-$year");
?>

Результат:

Date: 10-aug-2003

Важное замечание: при указании необязательных параметров их надо передавать по ссылке (ссылка обозначается указанием символа "&" перед переменной).

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

<?
   $book = "1\tThinking in PHP";
   $str = sscanf($book,"%d\t%s %s %s", &$id, &$first, &$second, &$last);
   echo ("book number $id - $first $second $last");
?>

Результат:

book number 1 - Thinking in PHP>


Функции преобразования кодировки: convert_cyr_string(), bin2hex(). Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции преобразования кодировки

convert_cyr_string()
bin2hex()

convert_cyr_string()

Синтаксис:

string convert_cyr_string(string str, string from, string to)

Функция преобразует строку из одной кодировки кириллицы в другую. Она переводит строку str из кодировки from в кодировку to. Значения from и to это одиночные символы, определяющий кодировку:

  • k - koi8-r;
  • w - windows-1251;
  • i - iso8859-5;
  • a - x-cp866;
  • d - x-cp866;
  • m - x-mac-cyrillic;

Давайте для примера перекодируем слово "определяющий" из кодировки windows-1251 в koi8-r и обратно:

<?
   $str1 = "определяющий";
   $str2 = convert_cyr_string($str1,"w","k");
   echo ("result of translate '$str1' to koi8-r is '$str2'");
   echo ("<br>");
   $str3 = convert_cyr_string($str2,"k","w");
   echo ("result of translate '$str2' to win is '$str3'");
?>

И вот результат:

result of translate 'определяющий' to koi8-r is 'ПРТЕДЕМСАЭЙК'
result of translate 'ПРТЕДЕМСАЭЙК' to win is 'определяющий'

bin2hex()

Производит побайтовое преобразование символьных данных в шестнадцатеричный вид.

Функция bin2hex() принимает в качестве единственного параметра строку и возвращает строковое шестнадцатеричное представление символов, содержащихся в этой строке.

Для примера давайте перекодируем тоже самое слово "определяющий":
<?
   $str1 = "определяющий";
   $str2 = bin2hex($str1);
   echo($str2);
?>

И вот какая абракадабра из этого получилась:

Результат:

cfd0d2c5c4c5ccd1c0ddc9ca


Функции работы с бинарными данными - pack() и unpack(). Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции работы с бинарными данными

pack()
unpack()

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

Итак, функция:

pack()

Синтаксис:

string pack(string format [ ,mixed $args, ...])

Функция pack() упаковывает заданные в ее параметре аргументы в бинарную строку. Формат параметров и их количество задается при параметром $format, при помощи тех же спецификаторов форматирования, о которых мы говорили, только без знака %. После каждого спецификатора может стоять число, которое говорит о том, сколько информации будет обработано данным спецификатором. Для форматов a, A, h и H это число задает количество символов, которые будут помещены в бинарную строку из тех, что находятся параметре-строке при вызове функции (то есть, фактически определяется размер поля вывода строки). Если мы используем спецификатор "@", то мы определяем абсолютную позицию, в которую будут помещены данные. Для всех остальных спецификаторов следующие за ними числа задают количество аргументов, на которые распространяется действие данного формата. Вместо числа можно указать *, в этом случае спецификатор действует на все оставшиеся данные. Заметим, что функция возвращает упакованные данные в шестнадцатеричном формате.

Список спецификаторов формата:

  • a - строка, свободные места в поле заполняются символом с кодом 0;
  • A - строка, свободные места заполняются пробелами;
  • h - шестнадцатеричная строка, младшие разряды в начале;
  • H - шестнадцатеричная строка, старшие разряды в начале;
  • c - знаковый байт (символ);
  • C - беззнаковый байт;
  • s - знаковое короткое целое;
  • S - беззнаковое короткое число;
  • n - беззнаковое целое (16 битов, старшие разряды в конце);
  • v - беззнаковое целое (16 битов, младшие разряды в конце);
  • i - знаковое целое (размер и порядок байтов определяется архитектурой);
  • I - беззнаковое целое;
  • l - знаковое длинное целое (32 бита, порядок знаков определяется архитектурой);
  • L - беззнаковое длинное целое;
  • N - беззнаковое длинное целое (32 бита, старшие разряды в конце);
  • V - беззнаковое целое (32 бита, младшие разряды в конце);
  • f - число с плавающей точкой;
  • d - число двойной точности;
  • x - символ с нулевым кодом;
  • X - возврат назад на 1 байт;
  • @ - заполнение нулевым кодом до заданной абсолютной позиции.

Функция

unpack()

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

Синтаксис:

array unpack(string $format, string $data)

Давайте попробуем что-нибудь запаковать. К примеру, так.

<?
   $bin = pack("nvn*",0x5722,0x1148, 65, 66); // запаковываем, согласно формату
   $var = bin2hex($bin); // перекодируем из шестнадцатеричного формата
   echo($var);
?>

Итак, что мы увидели: функция вернула 6 байтов, причем в такой последовательности:

0х57, 0х22, 0х48, 0х11, 0х00, 0х41, 0х00, 0х42. Понятно, почему так. Согласно заданному нами формату (nvn*), первое число мы возвращаем как беззнаковое целое со старшими разрядами в конце, второе тоже как беззнаковое целое, только в конце – младшие разряды (поэтому нам вернулось 0х48, 0х11, а не 0х11, 0х48), и все остальное до конца мы возвращаем как беззнаковое целое со старшими разрядами в конце.


Функции работы с текстом. Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции работы с блоками текста

wordwrap()
str_replace()
substr_replace()
strtr()
stripslashes()
stripcslashes()
addslashes()
addcslashes()
quotemeta()
strrev()

wordwrap()

Синтаксис:

string wordwrap(string str [, int width [, string break [, int cut]]])

Функция wordwrap() разбивает исходный текст на строки с определенными завершающими символами. Согласно синтаксису, эта функция разбивает блок текста str на несколько строк, которые завершаеются символами break, так, чтобы в одной строке было не более width букв. Поскольку разбиение происходит по границам слов, текст остается вполне читаемым.

К примеру:

<?
   $str = "Вставай, страна огромная";
   $mod_str = wordwrap($str,5,"\t");
   echo($mod_str);
?>

str_replace()

Синтаксис:

string str_replace(string from, string to, string str)

Функция str_replace() заменяет в исходной строке str одни подстроки на другие. Т.е. функция заменяет в строке str все вхождения подстроки from на to и возвращает результат. Эта функция может работать с двоичными строками.

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

   $txt = str_replace("[B]","<B>",$txt);

Т.е. если Вы используете для отображения текста полужирным шрифтом символы "[B]", Вы должны их заменить на символ "<B>", используемые в НТМL.

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

substr_replace()

Синтаксис:

string substr_replace(string str, string replacement, int start [, int length])

Эта функция заменяет в исходной строке одни подстроки на другие. Она возвращает строку str, в которой часть от символа с позицией start и длиной length заменяется строкой replacement. Если аргумент длины length не указан, замена проводится до конца.

Если значение аргумента start положительно, то отсчет производится от начала строки str, в противном случае - от конца. В случае неотрицательного значения length, оно указывает длину заменяемого фрагмента. Если же оно отрицательно, то это - число символов от конца строки str до последнего символа заменяемого фрагмента.

strtr()

Синтаксис:

string strtr(string str, string from, string to)

string strtr(string str, array from)

Эта функция предназначена для комплексной замены в строке и имеет два вида синтаксиса. В первом случае функция strtr() возвращает строку str, в которой каждый символ, присутствующий в строке from, заменяется на символ из строки to. Если строки from и to различной длины, то лишние конечные символы у той строки, которая длинее, игнорируются. Во втором случае функция strtr() возвращает строку, в которой фрагменты строки str заменяются на фрагменты, соответствующие индексам значений элементов массива from. Сначала функция пытается заменить наибольшие фрагменты исходной строки, при этом не выполняя замену в уже модифицированных частях строки. Таким образом, можно выполнить несколько замен сразу:

<?
   $str = array("" => "M.Kuznetsov",
             "<name2>" => "I.Simdyanov");
   $str_out = "Авторы этого учебника  и  приветствуют вас!";
   echo strtr($str_out,$str);
?>

А вот как можно при помощи этой функции отменить действие функции htmlspecialchars():

<?
   $var = array_flip(get_html_translation_table());
   $str = strtr($str, $var);
?>

Т.е., из строки, в которой все спецсимволы заменены на их HTML-эквиваленты, мы получаме исходную строку.

stripslashes()

Синтаксис:

string stripslashes(string str)

Функция удаления обратных слешей. Т.е. производится замена в строке str предваренных слешем символов на их кодовые эквиваленты. Функция работает с символами: ", ", \.

stripcslashes()

Синтаксис:

string stripcslashes(string str)

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

Она возвращает строку, в которой закомментированные обратным слешем спецсимволы, (с целью визуального отображения), преобразуются в их двоичное представление. Функция распознает C-подобные записи (восьмеричные и шестнадцатеричные последовательности \n, \r и т.д.).

addslashes()

Синтаксис:

string addslashes(string str)

Функция добавления слешей перед символами строки "," и \. Эту функцию удобно использовать при вызове функции eval().

addcslashes()

Синтаксис:

string addcslashes(string str, string charlist)

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

Возвращает строку str, в которую вставлены символы обратного слеша перед перечисленными в списке charlist символами. Это позволяет преобразовывать символы, которые не печатаются в их визуальное С-представление.

quotemeta()

Синтаксис:

string quotemeta(string str)

Функция цитирования метасимволов. Возвращает строку, в которую добавлены обратные слеши перед каждым из следующих символов: . \\ + * ? [ ^ ] ( $ ). Функцию можно использовать для подготовки шаблонов в регулярных выражениях.

strrev()

Синтаксис:

string strrev(string str)

Функция производит реверс строки.


Функции объединения и разделения строк. Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции объединения/разделения строк

str_repeat()
str_pad()
chunk_split()
strtok()
explode()
implode()
join()

str_repeat()

Синтаксис:

string str_repeat(string str, int number)

Функция повторения строки. Повторяет строку str то количество раз, которое указано в параметре number.

К примеру:

<?
   echo str_repeat("Hello!",3);
   // выводит Hello! Hello! Hello!
?>

str_pad()

Синтаксис:

string str_pad(string strinput, int pad_length [, string pad_string [, int pad_type]])

Эта функция дополняет строку другой строкой до определенной длины. Аргумент strinput задает исходную строку. Аргумент pad_length задает длину возвращаемой строки. Если он имеет меньшее значение, чем исходная строка, то добавления не производится. Необязательный аргумент pad_string указывает на то, какую строку использовать в качестве дополнения. По умолчанию используются пробелы. Необязательный аргумент pad_type указывает, с какой стороны следует дополнять строку: справо, слево или с обеих сторон. Аргумент pad_type может принимать следующие значения:

  • STR_PAD_RIGHT (по умолчанию)
  • STR_PAD_LEFT
  • STR_PAD_BOTH

chunk_split()

Синтаксис:

string chunk_split(string str [, int chunklen [, string end]])

Эта функция возвращает фрагмент строки. Функция chunk_split() возвращает строку, в которой между каждым блоком строки str длиной chunklen (по умолчанию chunklen = 76) вставляется последовательность из разделителей end (по умолчанию: end = "\r\n").

strtok()

Синтаксис:

string strtok(string arg1, string arg2)

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

Пример:

<?
   $str ="I am very glad to see%you% adhahjasdad";$tok = strtok($str, " ");
   while($tok)
   {
     echo ($tok);
     echo (" ");
     $tok = strtok(" %");
   };
   // выведет: "I" "am" "very" "glad" "to" "see" "you":
?>

I am very glad to see you

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

explode()

Синтаксис:

string explode(string arg, string str [, int maxlimit])

Функция explode() производит разделение строки в массив. Она возвращает массив строк, каждая из которых соответствует фрагменту исходной строки str, находящемуся между разделителями, указанными аргументом arg. Необязательный параметр maxlimit указывает максимальное количество элементов в массиве. Оставшаяся неразделенная часть будет содержаться в последнем элементе.

Пример:

<?
   $str = "one two three for five";
   $str_exp = explode(" ", $str);
   /* теперь $str_exp = array([0] => one, [1] => two,
      [2] => three, [3] => for, [4] => five)
   */
?>

implode()

Синтаксис:

string implode(string var, array param)

Функция implode() является обратной функции explode() и производит объединение массива в строку. Функция возвращает строку, которая последовательно содержит все элементы массива, заданного в параметре param, между которыми вставляется значение, указанное в параметре var. Для примера выведем все то, что мы только что "умассивили" функцией explode(), используя пробел в качестве разделителя:

Пример:

<?
   $str = "one two three four five";
   $str_exp = explode(" ", $str);
   /* $str_exp = array([0] => one, [1] => two,
     [2] => three, [3] => four, [4] => five)
   */
   $str_imp = implode(" ", $str_exp);
   echo($str_imp);

Результат:

one two three four five

join()

Синтаксис:

string join(string var, array param)

Аналог функции implode() - производит объединение массива в строку.

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


Функции сравнения строк. Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции сравнения строк

strcmp()
strncmp()
strcasecmp()
strncasecmp()
strnatcmp()
strnatcasecmp()
similar_text()
levenshtein()

strcmp()

Синтаксис:

int strcmp(string str1, string str2)

Эта функция сравнения строк. Она сравнивает две строки и возвращает:

  • 0 - если строки полностью совпадают;
  • 1 - если, строка str1 лексикографически больше str2;
  • 1 – если, наоборот, строка str1 лексикографически меньше str2

Функция является чувствительной к регистру, т.е. регистр символов влияет на результаты сравнений (поскольку сравнение происходит побайтово).

Пример:

<?
   $str1 = "ttt";
   $str2 = "tttttttttt";
   echo("Result of strcmp ($str1 , $str2) is ");
   echo(strcmp (str1, str2)); echo("<br>");
   echo("Result of strcmp ($str2, $str1)> is ");
   echo(strcmp (str2, str1)); echo("<br>");
   echo("Result of strcmp ($str1 , $str1) is ");
   echo(strcmp (str1,str1));
?>

Результат:

Result of strcmp (ttt , tttttttttt) is -1
Result of strcmp (tttttttttt, ttt) is 1
Result of strcmp (ttt, ttt) is 0

strncmp()

Синтаксис:

int strncmp(string str1, string str2, int len)

Эта функция отличается от strcmp() тем, что сравнивает начала строк, а точнее первые len байтов. Если len меньше длины наименьшей из строк, то строки сравниваются целиком.

В остальном функция ведет себя аналогично strcmp(), т.е. возвращает:

  • 0 - если строки полностью совпадают;
  • 1 - если, строка str1 лексикографически больше str2;
  • 1 – если, наоборот, строка str1 лексикографически меньше str2

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

strcasecmp()

Синтаксис:

int strcasecmp(string str1, string str2)

Функция работает аналогично strcmp(), только при работе не учитывается регистр букв.

strncasecmp()

Синтаксис:

int strncasecmp(string str1, string str2, int len)

Функция strncasecmp() cравнивает начала строк без учета регистра.

strnatcmp()

Синтаксис:

int strnatcmp(string str1, string str2)

Производит так называемое "естественное" сравнение строк.

Об этой функции поговорим поподробнее. Данная функция является имитатором сравнение строк человеком, т.е. она сравнивает строки так, как их сравнивал бы человек. Т.е., если, к примеру, мы будем сравнивать файлы с названиями pict1.gif, pict20.gif, pict2.gif, pict10.gif, то обычное сравнение приведет к следующему их расположению: pict1.gif, pict10.gif, pict2.gif, pict20.gif. Естественная же сортировка даст результат, который нам более привычен: pict1.gif, pict2.gif, pict10.gif, pict20.gif.

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

<?
   $array1 = $array2 = array("pict10.gif", "pict2.gif", "pict20.gif", "pict1.gif");
   echo("обычная сортировка:"); echo ("<br>");
   usort ($array1, strcmp);
   print_r ($array1);
   echo ("<br>"); echo("естественная сортировка:"); echo("<br>");
   usort ($array2, strnatcmp);
   print_r ($array2);
?>

Этот скрипт выведет следующее:

обычная сортировка:
Array([0]=>pict1.gif [1]=> pict10.gif [2]=>pict2.gif [3]pict20.gif)
естественная сортировка:
Array([0]=>pict1.gif [1]=> pict2.gif [2]=>pict10.gif [3]pict20.gif)

strnatcasecmp()

Синтаксис:

int strnatcasecmp(string str1, string str2)

Производит "естественное" сравнение строк без учета регистра. Функция выполняет то же самое, что и strnatcmp(), только без учета регистра.

similar_text()

Синтаксис:

int similar_text(string str_first, string str_second [, double percent])

Эта функция производит определение схожести двух строк.

Функция similar_text() определяет схожесть двух строк по алгоритму Оливера. Функция возвращает число символов, совпавших в строках str_first и str_second. Третий необязательный параметр передается по ссылке и в нем сохраняется процент совпадения строк.

Вместо стека, как в алгоритме Оливера, эта функция использует рекурсивные вызовы. Сложность алгоритма этой функции равна O((max(n,m))3), что делает эту функцию медленной. (Грубо говоря, скорость выполнения этой функции пропорциональна N3, где N – длина наибольшей строки.

Пример:

<?
   $str1 = "Hello, world!";
   $str2 = "Hello!";
   $var = similar_text($str1,$str2);
   $var1 = similar_text($str1, $str2, &$tmp);
   // параметр $tmp передаем по ссылке
   echo("Результат выполнения функции similar_text()
   для строк $str и $str1 в количестве символов:");
   echo("<br>"); echo("$var"); echo("<br>");
   echo("и в процентах:"); echo("<br>");
   echo($tmp); // для вывода информации в процентах обращаемся к $tmp
?>

Результат:

Результат выполнения функции similar_text() для строк Hello, world! и Hello! в количестве символов:
6
и в процентах:
63.157894736842

levenshtein()

Функция выполняет определение различия Левенштейна двух строк.

Синтаксис:

int levenshtein(string str1, string str2)
int levenshtein(string str1, string str2, int cost_ins, int cost_rep, int cost_del)
int levenshtein(string str1, string str2, function cost)

Под понятием "различие Левенштейна" понимается минимальное число символов, которое требовалось бы заменить, вставить или удалить для того, чтобы превратить строку str1 в str2.

Сложность алгоритма этой функции равна O(m*n), т.е. пропорциональна произведению длин строк str1 и str2, поэтому эта функция намного более быстрая, чем функция similar_text().

Как видим, у функции три вида синтаксиса. В первом случае функция возвращает число необходимых операций над символами строк для преобразования str1 в str2:

<?
   $str1 = "Hello, world!";
   $str2 = "Hello!";
   $var = levenshtein($str1,$str2);
   echo($var); // вернет 7
?>

Во втором случае добавляется три дополнительных параметра: стоимость операции вставки cost_ins, замены cost_rep и удаления cost_del. Естественно, функция в этом случае становится менее быстродействующей. Возвращается интегральный показатель сложности трансформации (ИПСТ).

<?
   $str1 = "Hello, world!";
   $str2 = "Hello!";
   $var = levenshtein($str1,$str2,3,3,3);
   echo($var); // вернет 21
?>

Число 21, между прочим, это 7*3 :). Т.е. ИПСТ равен произведению количества символов, необходимых для замены (а как мы посчитали в предыдущем примере их надобно 7) на стоимость, в этом случае, одной из операций. В этом примере, поскольку стоимость одинакова, не имеет значения, какую операцию брать. В случае, если стоимости различны, при вычисления ИПСТ берется наибольший. Т.е., если мы напишем в этом примере

$var = levenshtein($str1, str2 ,2,3,6);

то функция вернет нам значение 42.

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


Функции работы с URL. Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции работы с URL

parse_url()
parse_str()
rawurlencode()
rawurldecode()
base64_encode()
base64_decode()

parse_url()

Функция обрабатывает URL и возвращает его компоненты.

Синтаксис:

array parse_url(string url)

Эта функция возвращает ассоциативный массив, включающий множество различных существующих компонентов URL: "scheme", "host", "port", "user", "pass", "path", "query" и "fragment".

И если мы напишем вот такой скриптик

Пример:

<?
   $url = "http://www.google.com.ru/search?hl=ru&ie=UTF-8&oe=UTF-8&q=softtime&lr=";
   $arr = parse_url($url);
   print_r($arr);
?>

то получим следующий результат:

Array ( [scheme] => http [host] => www.google.com.ru [path] => /search [query] => hl=ru&ie=UTF-8&oe=UTF-8&q=softtime&lr= )

parse_str()

Заносит компоненты URL в переменные.

Синтаксис:

void parse_str(string str [, array arr])

Функция parse_str() интерпретирует строку str так, как если бы эта строка содержала в себе переменные и их значения и передавалась бы в URL. Т.е. функция устанавливает для этих переменных значения. Если задан второй необязательный параметр arr, то значения, найденные при помощи функции parse_str(), сохраняться не в глобальных переменных, а в элементах указанного массива. Пример приводить не буду, вроде все понятно.

rawurlencode()

Функция кодирования URL.

Синтаксис:

string rawurlencode(string str)

Функция rawurlencode возвращает строку, в которой все не алфавитно-цифровые символы, за исключением дефиса "-", знака подчеркивания "_" и точки ".", заменены последовательностями: знак процента (%), за которым следуют две шестнадцатеричные цифры, обозначающие код символа. Кодирование нужно для того, чтобы буквенные символы не обрабатывались как разделители URL-строки и не искажались при передаче в сетях.

rawurldecode()

Производит декодирование URL.

Синтаксис:

string rawurldecode(string str)

Думаю, что с этой функцией все понятно, добавлю лишь, что она аналогична функции urldecode(), но не воспринимает "+" как пробел.

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

<?
   $url = "http://www.google.com.ru/search?hl=ru&ie=UTF-8&oe=UTF-8&q=софттайм&lr=";
   echo("исходная строка: $url");echo("<br>");
   echo("закодировали:");echo("<br>");
   $url_code = rawurlencode($url);
   echo($url_code);echo("<br>");
   echo("и раскодировали:");echo("<br>");
   $url_decode = rawurldecode($url_code);
   echo($url_decode);
?>

И вот что получилось:

исходная строка: http://www.google.com.ru/search?hl=ru&ie=UTF-8&oe=UTF-8&q=софттайм&lr= закодировали: http%3A%2F%2Fwww.google.com.ru%2Fsearch%3Fhl%3Dru%26ie%3DUTF-8%26oe%3DUTF-8%26q%3D%F1%EE%F4%F2%F2%E0%E9%EC%26lr%3D и раскодировали: http://www.google.com.ru/search?hl=ru&ie=UTF-8&oe=UTF-8&q=софттайм&lr=

base64_encode()

Функция кодирует данные в кодировке MIME base64.

Синтаксис:

string base64_encode(string data)

Функция base64_encode() возвращает строку, переданную в параметре data в кодировке MIME base64.

Кодировка MIME base64 разработана для передачи двоичных данных через транспортные слои, которые не содержат восьмой бит, к примеру, как почтовые тела. Заметим, что данные в кодировке Base64 занимают примерно на 30% больше места, чем оригинал.

base64_decode()

Декодирует данные, закодированные в кодировке MIME base64.

Синтаксис:

string base64_decode(string encoded_data)

Функция base64_decode() декодирует encoded_data и возвращает оригинал данных. Пример приводить не буду – все просто, и, поверьте, работает.


Функции преобразования регистра. Строковые функции PHP.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Функции преобразования регистра

strtolower()
strtoupper()
ucfirst()
ucwords()

strtolower()

Функция производит преобразование символов строки в нижний регистр.

Синтаксис:

string strtolower(string str)

Пример:

<?
   $str = "HELLO WORLD";
   $str = strtolower($str);
   echo $str; // выведет "hello world"
?>

strtoupper()

Производит преобразование строки в верхний регистр.

Синтаксис:

string strtoupper(string str)

Отмечают, что функция не очень хорошо иногда работает с русскими буквами.

Пример:

<?
   $str = "Hello World";
   $str = strtoupper($str);
   echo $str;
   // выведет HELLO WORLD
?>

ucfirst()

Производит преобразование первого символа строки в верхний регистр.

Синтаксис:

string ucfirst(string str)

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

<?
   $str = "hello world";
   $str = ucfirst($str);
   echo $str;
   // выведет Hello world
?>

ucwords()

Производит преобразование первого символа каждого слова строки в верхний регистр.

Синтаксис:

string ucwords(string str)

Возвращает строку, у которой первый символ каждого слова в строке заглавный.

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

<?
   $str = "hello world";
   $str = ucwords($str);
   echo $str;
   // выведет Hello World
?>


Строковые функции PHP. Заключение. Функции: count_chars(), soundex, metaphone

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции

    4. Строковые функции

    Htmlspecialchars

    Поиск в тексте

    Функции strlen(), chr() и ord()

    Trim-функции

    Форматный вывод

    Преобразование кодировки

    Работа с бинарными данными

    Работа с блоками текста

    Объединение/ разделение строк

    Сравнение строк

    Работа с URL

    Преобразование регистра

    Заключение

  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Строковые функции PHP
Предыдущая Следующая

Заключение к главе 3

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

count_chars()
soundex()
metaphone()

count_chars()

Возвращает информацию о символах строки.

Синтаксис:

mixed count_chars(string str [, int mode])

Функция count_chars() подсчитывает частоту встречаемости каждого байта (0-255) в строке str и возвращает результат в массив согласно необязательному аргументу mode, который может принимать следующие значения:

  • 0 (значение по умолчанию) - массив с байтами в качестве индексов и частотой повторения в качестве значений элемента массива;
  • 1 - похож на 0, но отсутствующие в строке str байты не возвращаются;
  • 2 - похож на 0, но возвращаются только те байты, которые отсутствуют;
  • 3 - возвращается строка, состоящая из всех обнаруженных символов;
  • 4 - возвращается строка, состоящая из всех отсутствующих символов;

soundex()

Функция вычисления хеша сходности произношения.

Синтаксис:

string soundex(string str)

Функция soundex() используется для проверки правописания, когда приблизительно известно как звучит слово, но не известно, как оно пишется, и имеется словарь (база данных), относительно которого можно осуществить проверку.

Возвращается строка из 4 символов: первая буква слова и 3 цифры.

metaphone()

Производит вычисление метафон-хеша.

Синтаксис:

string metaphone(string str)

Данная функция схожа по действию с функцией soundex(), так как тоже вычисляет код произношения слова, переданного в строке str, но только с повышенной точностью вычисления, поскольку вроде как использует правила произношения английского языка.


Массивы. Инициализация массивов.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Инициализация массивов

В PHP существует 2 метода инициализации массивов. Первый из них состоит в простом присвоении значений элементам массива:

<?
   $car[] = "passenger car";
   $car[] = "land-rover";
   echo($car[1]); // выводит "land-rover"
?>

Индекс массива можно указать явно:

<?
   $car[0] = "passenger car";
   $car[1] = "land-rover";
   echo($car[1]); // выводит "land-rover"
?>

Заметим, что если при объявлении элементов массива смешиваются переменные с явной индексацией, и без индексации, то тому элементу, индекс которого не задан, PHP присвоит первый доступный индекс, после самого большого использованного до сих пор индекса. Например, если мы создадим массив с элементами, индексы которых будет равны, скажем, 10, 20 и 30, а потом создадим элемент, индекс которого явно не укажем, то ему автоматически присвоится индекс 31:

<?
   $car[10] = "passenger car";
   $car[20] = "land-rover";
   $car[30] = "station-wagon";
   $car[] = "victoria";
   echo($car[31]);
?>

Альтернативный способ определения массивов состоит в использовании конструкции array():

<?
   $car = array("passenger car","land-rover");
   echo($car[1]); // выводит "land-rover"
?>

Для явного указания индексов в этом случае применяется оператор =>:

<?
   $car = array("passenger car", 5 => "land-rover",
      "station-wagon","victoria");
   echo($car[0]); echo("<br>"); // выводит "passenger car"
   echo($car[5]); echo("<br>"); // выводит "land-rover"
   echo($car[6]); echo("<br>"); // выводит "station-wagon"
   echo($car[7]); // выводит "victoria"
?>

Индексами массива могут быть и строки:

<?
   $car = array("pc" => "passenger car", "lr" => "land-rover");
   echo($car["lr"]); echo("<br>"); // выводит "land-rover"
   echo($car["pc"]);  // выводит "passenger car"
?>


Массивы. Цикл foreach для обхода массивов.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Цикл foreach для обхода массивов

Обход массива в цикле в PHP4 можно организовать при помощи цикла foreach, который имеет следующий синтаксис:

foreach (array as [$key =>] $value)
{
   statements;
}

Смысл этого цикла прост: при проходе каждого элемента массива в переменную $key помещается индекс этого элемента, а в переменную $value – его значение. Имена этих двух переменных совершенно произвольны.

Пример:

<?
   $car = array("passenger car", "land-rover",
      "station-wagon","victoria");
   foreach($car as $index => $val)
   {
      echo("$index -> $val <br>");
   }
?>

Как видно из синтаксиса, переменная $key необязательна и может быть опущена:

<?
   echo(
      "available cars: <br> <ul>"
   );
   $car = array("passenger car", "land-rover",
      "station-wagon","victoria");
   foreach($car as $val)
   {
      echo("<li>$val</li>\n");
   }
   echo("</ul>");
?>


Массивы. Многомерные массивы.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Многомерные массивы

count()
in_array()
reset()

Для инициализации многомерных массивов используются вложенные конструкции array(). Обход многомерных массивов достигается при помощи вложенных циклов. В следующем скрипте показан пример создания и обхода многомерного массива.

Пример:

<?
   $ship = array(
      "Passenger ship" => array("Yacht","Liner","Ferry"),
      "War ship" => array("Battle-wagon","Submarine","Cruiser"),
      "Freight ship" => array("Tank vessel","Dry-cargo ship","Container
      cargo ship")
   );
   foreach($ship as $key => $type)
   {
      echo(
      "<h2>$key</h2>\n"."<ul>\n");
      foreach($type as $ship)
      {
         echo("\t<li>$ship</li>\n");
      }
   }
   echo("</ul>\n");
?>

Результат выполнения этого скрипта::

Passenger ship

  • Yacht
  • Liner
  • Ferry

    • War ship

    • Battle-wagon
    • Submarine
    • Cruiser

      • Freight ship

      • Tank vessel
      • Dry-cargo ship
      • Container cargo ship

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

Функция count()

Синтаксис:

int count(mixed var)

Эта функция принимает в качестве аргумента массив и возвращает количество элементов в нем. Как понимаете, штука незаменимая когда будем бегать по массиву циклом for().

Функция in_array()

Синтаксис:

boolean in_array(mixed needle, array haystack [, bool strict])

Эта функция ищет в массиве haystack значение needle и возвращает true если оно найдено и false в противном случае.

Функция reset()

Синтаксис:

mixed reset(array array)

Функция reset() устанавливает указатель массива на первый элемент и возвращает значение первого элемента массива.

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

Ну а теперь вплотную займемся сортировками.


Массивы. Сортировка массивов.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Функции сортировки массивов

sort()
rsort()
asort()
arsort()
ksort()
krsort()
array_reverse()
shuffle()
natsort()

sort()

Функция сортировки массива по возрастанию.

Синтаксис:

void sort(array array [, int sort_flags])

Функция сортирует массив array по возрастанию. Необязательный аргумент sort_flags указывает как именно должны сортироваться элементы (задает флаги сортировки). Допустимыми значениями этого аргумента являются следующие:

  • SORT_REGULAR – задает нормальное сравнение элементов (сравнивает элементы "как есть")
  • SORT_NUMERIC - сравнивает элементы как числа
  • SORT_STRING - сравнивает элементы как строки

Вообще говоря, эта функция предназначена для сортировки списков. Под списком понимается массив, ключи которого начинаются с нуля и не имеют пропусков. Функция sort() воспринимает любой массив как список.

Рассмотрим примерчик.

Пример:

<?
   $arr = array("2", "1", "4", "3","5");
   sort($arr);
   for($i=0; $i < count($arr); $i++)
   {
      echo ("$i:$arr[$i]  ");
   }
   // выводит "0:1 1:2 2:3 3:4 4:5"
?>

Результат:

0:1 1:2 2:3 3:4 4:5

Заметим такую вещь. Если вы сортируете строки, т.е, к примеру, массив выглядит вот так

   array("one", "two", "abs", "three", "uic", "for","five");

то эта чудо-функция вернет вам следующее:

Результат:

0:abs 1:five 2:for 3:one 4:three 5:two 6:uic

Т.е. строки она сортирует в так называемом альфа-бета порядке, попросту говоря – по старшинству первой буквы в алфавите.

rsort()

Сортировка массива по убыванию.

Синтаксис:

void rsort(array arr [, int sort_flags])

Аналогична функции sort(), только сортирует по убыванию. Выполним тот же скрипт, что и для функции sort(), только вместо sort($arr) поставим rsort($arr).

Результат:

0:5 1:4 2:3 3:2 4:1

asort()

Сортировка ассоциативного массива по возрастанию.

Синтаксис:

void asort(array arr [, int sort_flags])

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

Пример:

<?
   $arr = array("a" =>"one","b" => "two","c" => "three","d" => "four");
   asort($arr);
   foreach($arr as $key => $val)
   {
      echo (" $key => $val ");
   }
?>

Результат:

d => four a => one c => three b => two

Т.е., как видим, связи "ключ-значение" сохранились.

По умолчанию функция asort() сортирует массив в алфавитном порядке. Значения флагов сортировки sort_flags приведены в описании функции sort().

arsort()

Сортировка ассоциативного массива по убыванию.

Синтаксис:

void arsort(array arr [, int sort_flags])

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

ksort()

Сортировка массива по возрастанию ключей.

Синтаксис:

int ksort(array arr [, int sort_flags])

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

<?
   $arr = array("a" =>"one","b" => "two","c" => "three","d" => "four");
   ksort($arr);
   foreach($arr as $key => $val)
   {
      echo (" $key => $val ");
   }
?>

Результат:

a => one b => two c => three d => four

krsort()

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

Синтаксис:

int krsort(array arr [, int sort_flags])

То же самое, что и функция ksort(), только упорядочивает массив по ключам в обратном порядке (по убыванию).

array_reverse()

Расстановка элементов массива в обратном порядке.

Синтаксис:

array array_reverse(array arr [, bool preserve_keys])

Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива arr, переданного в параметре. При этом связи между ключами и значениями сохраняются. Можно еще необязательный параметр preserve_keys сделать true, тогда в обратном порядке переставятся еще и ключи.

Своруем идейку примерчика на эту функцию из php-шного мануала:

<?
   $arr = array ("php", 4.0, array ("green", "red"));
   $result = array_reverse ($arr);
   echo "Массив: <br>";
   foreach($result as $key => $val)
   {
      echo ("$key => $val <br>");
   }
   echo("<br>");
   echo "Сортированный массив: <br>";
   $result_keyed = array_reverse ($arr, false);
   foreach($result_keyed as $key => $val)
   {
      echo ("$key => $val<br> ");
   }
?>

Т.е., что получилось:

В первом случае:

Результат:

Массив:
0 =>Array
1 =>4
2 =>php

Сортированный массив:
0 =>Array
1 =>4
2 =>php

А если еще и второй параметр как true засобачить, то вот что выйдет:

Результат:

Массив:
0 =>Array
1 =>4
2 =>php

Сортированный массив:
2 =>Array
1 =>4
0 =>php

shuffle()

Перемешивание элементов массива случайным образом.

Синтаксис:

void shuffle(array arr)

Функция shuffle() перемешивает элементы масиива arr случайным образом.

natsort()

Выполняет "естественную" сортировку массива.

Синтаксис:

void natsort(array arr)

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

Пример:

<?
   $array1 = $array2 = array("pict10.gif", "pict2.gif", "pict20.gif", "pict1.gif");
   echo ("обычная сортировка:"); echo ("<br>");
   sort($array1);
   print_r($array1);
   echo ("<br>"); echo ("естественная сортировка:"); echo ("<br>");
   natsort($array2);
   print_r($array2);
?>

Результат:

обычная сортировка:
Array ( [0] => pict1.gif [1] => pict10.gif [2] => pict2.gif [3] => pict20.gif )
естественная сортировка:
Array ( [3] => pict1.gif [1] => pict2.gif [0] => pict10.gif [2] => pict20.gif )


Массивы. Работа с курсором (указатель) массива.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Работа с курсором (указатель) массива

end()
next()
prev()
current()
key()
each()

О функции reset() мы с вами уже говорили. Напомним, что эта функция производит сброс курсора массива, т.е. устанавливает внутренний курсор массива на начало массива и возвращает значение первого элемента.

Функция end() выполняет действие, обратное функции reset() – переносит курсор в конец массива. Синтаксис функции аналогичен синтаксису функции reset():

end()

Синтаксис:

mixed end(array array arr)

next()

Функция next() производит перенос курсора массива вперед на одну позицию.

Синтаксис:

mixed next(array array arr)

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

prev()

Функция prev() производит перенос курсора назад на одну позицию. Синтаксис и работа функции полностью аналогичны функции next().

Синтаксис:

mixed prev(array array arr)

current()

Для определения текущего элемента массива, без изменения положения курсора, используется функция current().

Синтаксис:

mixed current(array array arr)

Функция current() возвращает значение элемента, на котором в данный момент находится курсор массива, при этом не сдвигая курсор. В том случае, если курсор оказался за пределами массива, или массив состоит из пустых элементов, функция возвратит false.

Полным синонимом функции current() является функция pos().

key()

Функция key() возвращает индекс текущего элемента массива.

Синтаксис:

mixed key(array array arr)

Ну а теперь поговорим об обещанной функции each().

each()

Синтаксис:

array each(array array arr)

Функция each() возвращает пару "индекс - значение" текущего элемента массива и сдвигает курсор массива на следующий элемент. При этом, как видно, функция возвращает массив, причем он имеет четыре элемента:

  1. [1] => "значение"
  2. [value] => "значение"
  3. [0] => индекс
  4. [key] => индекс

Если курсор достиг конца массива, функция возвращает false. Посмотрим, как работает эта функция:

Пример:

<?
   $name = array("maks", "igor", "sergey");
   $each_name = each($name);
   print_r($each_name);
   echo("<br>");
   $each_name = each($name);
   print_r($each_name);
   echo("<br>");
   $each_name = each($name);
   print_r($each_name);
?>
И что мы получили:

Результат:

Array ( [1] => maks [value] => maks [0] => 0 [key] => 0 )
Array ( [1] => igor [value] => igor [0] => 1 [key] => 1 )
Array ( [1] => sergey [value] => sergey [0] => 2 [key] => 2 )

Функцию each() можно использовать в паре с функцией list() для перебора элементов массива. К примеру, вот так:

Пример:

<?
   $name = array("maks", "igor", "sergey");
   reset($name);
   while(list($key, $val) = each($name))
   {
      echo ("$key = $val<br>");
   }
?>
И вот что на выходе:

Результат:

0 = maks
1 = igor
2 = sergey


Массивы. Функция array_walk().

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы

    Инициализация массивов

    Цикл foreach

    Многомерные массивы

    Сортировка массивов

    Работа с курсором массива

    Функция array_walk()

  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Массивы
Предыдущая Следующая

Функция array_walk()

array_walk()

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

Синтаксис:

bool array_walk(array arr, callback func [, mixed userdata])

Как видно из синтаксиса этой функции, она применяет пользовательскую функцию func к каждому элементу массива arr. В пользовательскую функцию передаются два или три аргумента: значение текущего элемента, его индекс и аргумент userdata. Последний аргумент является необязательным. Заметим, что в случае, если func требует более трех аргументов, при каждом ее вызове будет выдаваться предупреждение, и, чтобы они не выдавались, нужно поставить знак "@" перед функцией array_walk(). Заметим также, что функция func получает значения и индексы массива arr таким образом, что не может их изменять. Если возникает такая необходимость, нужно передавать аргумент arr по ссылке. В этом случае все изменения отразятся в массиве.

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

Пример:

<?
   $name = array ("m"=>"maks", "i"=>"igor", "s"=>"sergey");
   function print_array ($item, $key)
   {
      echo "$key=>$item<br>\n";
   }
   array_walk ($name, 'print_array');
?>

И что вышло:

Результат:

m=>maks
i=>igor
s=>sergey

Важное замечание. Вообще говоря, в приведенном выше коде, есть, скажем так неточность. А именно – мы не установили курсор массива в начало массива, и перед тем, как вызывать функцию array_walk() надо вызывать функцию reset() для этой цели, потому что array_walk() начинает работать с того элемента, на котором находится курсор массива.

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

Пример:

<?
   $number = array ("1"=>"15", "2"=>"20", "3"=>"25");
   function printarray ($item, $key)
   {
      echo "$key=>$item<br>\n";
   }
   function add_array (&$item, $key)
   // параметр $item передаем по ссылке, так как
   // его нам надо изменять
   {
      $item = $item + 1;
   }
   echo("Before:<br>");
   array_walk ($number, 'printarray');
   echo("After:<br>");
   array_walk ($number, 'add_array');
   array_walk ($number, 'printarray');
?>

Результат:

Before:
1=>15
2=>20
3=>25
After:
1=>16
2=>21
3=>26


Определение и вызовы функций. Функции.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции

    Определения и вызовы функций

    Область видимости переменных

    Время жизни переменной

    Что такое рекурсия

  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Функции
Предыдущая Следующая

Определения и вызовы функций

Функция объявляется при помощи ключевого слова function, после которого в фигурных скобках записываются различные операторы, составляющие тело функции:

function MyFunction()
{
 // операторы
}

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

function MyFunction($var, $var1, $var2)

Если функция возвращает какое-либо значение, в теле функции обязательно должен присутствовать оператор return:

function MyFunction()
{
  return $ret; // возвращается значение переменной $ret
}

Пример простой функции.

<?
  function get_sum()
  {
    $var = 5;
    $var1 = 10;
    $sum = $var + $var1;
    return $sum;
  }
  echo(get_sum()); // выводит 15
?>

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

<?
  function get_sum()
  {
    $var = 5;
    $var1 = 10;
    $sum = $var + $var1;
    echo $sum;
  }
  get_sum();
?>

Переменные $var и $var1 мы можем объявить как аргументы и в этом случае в теле функции их определять не надо:

<?
  function get_sum($var, $var1)
  {
    $sum = $var + $var1;
    echo $sum;
  }
  get_sum(5,2); // выводит 7
?>

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

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

<?
  function get_sum($var) // аргумент передается по значению
  {
    $var = $var + 5;
    return $var;
  }
  $new_var = 20;
  echo(get_sum($new_var)); // выводит 25
  echo("<br>$new_var"); // выводит 20
?>

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

  function get_sum($var, $var1, &$var2)

В этом случае переменные $var и $var1 будут переданы по значению, а переменная $var2 - по ссылке. В случае, если аргумент передается по ссылке, при любом изменении значения параметра происходит изменение переменной-аргумента:

<?
  function get_sum(&$var) // аргумент передается по ссылке
  {
    $var = $var + 5;
    return$var;
  }
  $new_var = 20;
  echo(get_sum($new_var)); // выводит 25
  echo("<br>$new_var"); // выводит 25
?>


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

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции

    Определения и вызовы функций

    Область видимости переменных

    Время жизни переменной

    Что такое рекурсия

  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Функции
Предыдущая Следующая

Область видимости переменных

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

<?
  function get_sum()
  {
    $var = 5; // локальная переменная
    echo $var;
  }
  $var = 10; // глобальная переменная
  get_sum(); // выводит 5 (локальная переменная)
  echo("<br>$var"); // выводит 10 (глобальная переменная)
?>

Локальную переменную можно сделать глобальной, если перед ее именем указать ключевое слово global. Если внешняя переменная объявлена как global, то к ней возможен доступ из любой функции:

<?
function get_sum()
  {
    global $var;
    $var = 5; // изменяем глобальную переменную
    echo $var;
  }
  $var = 10;
  echo("$var<br>"); // выводит 10
  get_sum(); // выводит 5 (глобальная переменная изменена)
?>

Доступ к глобальным переменным можно получить также через ассоциативный массив $GLOBALS:

<?
  function get_sum()
  {
    $GLOBALS["var"] = 20; // изменяем глобальную переменную $var
    echo($GLOBALS["var"]);
  }
  $var = 10;
  echo("$var<br>"); // выводит 10
  get_sum(); // выводит 20 (глобальная переменная изменена)
?>

Массив $GLOBALS доступен в области видимости любой функции и содержит все глобальные перемене, которые используются в программе.


Время жизни переменной.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции

    Определения и вызовы функций

    Область видимости переменных

    Время жизни переменной

    Что такое рекурсия

  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Функции
Предыдущая Следующая

Время жизни переменной

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

  function counter()
  {
    $counter = 0;
    return ++$counter;
  }

Для того, чтобы локальная переменная сохраняла свое предыдущее значение при новых вызовах функции, ее можно объявить статической при помощи ключевого слова static:

  function counter()
  {
    static $counter = 0;
    return ++$counter;
  }

Временем жизни статических переменных является время выполнения сценария. Т. е., если пользователь перезагружает страницу, что приводит к новому выполнению сценария, переменная $counter в этом случае инициализируется заново.


Что такое рекурсия.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции

    Определения и вызовы функций

    Область видимости переменных

    Время жизни переменной

    Что такое рекурсия

  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Функции
Предыдущая Следующая

Что такое рекурсия

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

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

<?
  function degree($x,$y)
  {
    if($y)
    {
      return $x*degree($x,$y-1);
    }
    return 1;
  }
  echo(degree(2,4)); // выводит 16
?>

Этот пример основан на том, что xy эквивалентно x*x(y-1). В этом коде задача вычисления 24 разбивается на вычисление 2*2³. Затем 2*2³ разбивается на 2*2² и так до тех пор, пока показатель не станет равным нулю.

Итерационный вариант этого примера выглядит так:

<?
  function degree($x,$y)
  {
    for($result = 1; $y > 0; --$y)
    {
      $result *= $x;
    }
    return $result;
  }
  echo(degree(2,4)); // выводит 16
?>

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

<?
  function fact($x)
  {
    if ($x < 0) return 0;
    if ($x == 0) return 1;
    return $x * fact($x - 1);
  }
  echo (fact(3)); // выводит 6
?>

Для отрицательного аргумента функция возвращает нулевое значение, так как факториал отрицательного числа не существует по определению. Для нулевого параметра функция возвращает значение 1, поскольку 0! = 1. В иных случаях вызывается та же функция с уменьшенным на 1 значением параметра, после чего результат умножается на текущее значение параметра. Т. е. происходит вычисление произведения:

k * (k - 1) * (k - 2) * ... * 3 * 2 * 1 * 1

Последовательность рекурсивных вызовов прерывается только при вызове fact(0), который и приводит к последнему значению 1 в произведении, так как последнее выражение, из которого вызывается функция, имеет вид 1 * fact(1 - 1).

Итерационно факториал можно вычислить так:

<?
  function fact($x)
  {
    for ($result = 1; $x > 1; --$x)
    {
      $result *= $x;
    }
    return $result;
  }
  echo (fact(6)); // выводит 720
?>


Работа с файлами | Открытие файлов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Открытие файлов

Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в Windows может использоваться как прямой (/), так и обратный (\) слеш. В других операционных системах используется только прямой слеш.

Открытие файлов в файловой системе сервера производится при помощи функции fopen:

  int fopen(string filename, string mode [, int use_include_path])

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

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

  • r (Открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла);
  • r+ (Открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла);
  • w (Создать новый пустой файл только для записи; если файл с таким именем уже есть вся информация в нем уничтожается);
  • w+ (Создать новый пустой файл для чтения записи; если файл с таким именем уже есть вся информация в нем уничтожается);
  • a (Открыть файл для дозаписи; данные будут записываться в конец файла);
  • a+ (Открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла);
  • b (Флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows).

Третий необязательный аргумент use_include_path определяет должны ли искаться файлы в каталоге include_path. (Параметр include_path устанавливается в файле php.ini).

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

Код, приведенный ниже, открывает файл C:/WWW/HTML/file.txt для чтения:

<?
  $file = fopen("c:/www/html/file.txt","r");
  if(!file)
    {
      echo("Ошибка открытия файла");
    }
?>

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

<?
  $file = fopen("c:/www/html/river.jpg","rb");
  if(!file)
    {
      echo("Ошибка открытия файла");
    }
?>


Работа с файлами | Отображение файлов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Отображение файлов

Содержимое открытого файла можно отобразить в браузере с помощью функции fpassthru:

  int fpassthru (int file)

Аргумент file представляет собой дескриптор файла.

<?
  $file = fopen("c:/www/html/pavlovo.jpg","rb");
  if(!file)
    {
      echo("Ошибка открытия файла");
    }
    else
    {
      fpassthru($file);
    }
?>

Для текстовых файлов существует еще одна функция отображения readfile:

  readfile (string filename)

Обращаем ваше внимание на то, что в качестве аргумента эта функция принимает имя файла, а не его дескриптор:

<?
  readfile ("file.txt");
?>


Работа с файлами | Закрытие файлов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Закрытие файлов

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

  int fclose (int file)

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


Работа с файлами | Чтение из файлов и запись в файлы

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Чтение из файлов и запись в файлы

Чтение из файлов

Прочитать строку из открытого файла можно с помощью функции fread:

  string fread ( int file, int length )

Эта функция возвращает строку длиной length символов из файла с дескриптором file.

Пример (чтение из файла):

<?
  $file = fopen("c:/www/html/file.txt","r");
  if(!file)
    {
      echo("Ошибка открытия файла");
    }
    else
    {
      $buff = fread ($file,100);
      print $buff;
    }
?>

Для чтения из файла можно также пользоваться функцией fgets:

   string fgets ( int file, int length)

Эта функция читает и возвращает строку длиной length - 1 байт. Чтение прекращается, когда достигнута новая строка или конец файла. При достижении конца файла функция возвращает пустую строку.

Для чтения файла с удалением из него тегов HTML применяется функция fgetss:

   string fgetss (int file, int length [, string allowable_tags])

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

Если необходимо записать содержимое файла в массив, применяется функция file:

   array file (string filename [, int use_include_path])

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

<?
  $file_array = file("file.txt");
  if(!$file_array)
  {
    echo("Ошибка открытия файла");
  }
  else
  {
    for($i=0; $i < count($file_array); $i++)
    {
      printf("%s<br>", $file_array[$i]);
    }
  }
?>

Эта функция удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле:

<?
  $file_array =  file ("file.txt");
  if(!$file_array)
  {
    echo("Ошибка открытия файла");
  }
  else
  {
    $num_str =  count($file_array);
    echo($num_str);
  }
?>

Заметим, что функцию file следует применять лишь для чтения небольших файлов.

Для чтения файлов с расширением *.csv применяется функция fgetcsv:

  array fgetcsv ( int file, int length, char delim)

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

Формат CSV является одним из форматов, в котором может сохранять файлы MSExcel. В следующем примере производится чтение созданного MSExcel файла file.csv, содержащего пароли пользователей.

<?
  $count = 1;
  $file =  fopen ("file.csv","r");
  while ($data = fgetcsv ($file, 1000, ","))
  {
    $num = count ($data);
    $count++;
    for ($i=0; $i < $num; $i++)
    {
      print "$data[$i]<br>";
    }
  }
  fclose ( $file );
?>

Запись в файлы

Запись в файлы осуществляется функциями fputs и fwrite, которые абсолютно идентичны:

  int fputs ( int file, string string [, int length ])
  int fwrite ( int file, string string [, int length ])

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

В этом примере в файл "file.txt" записывается строка "Hello, world!"

<?
  $file = fopen ("file.txt","r+");
  $str = "Hello, world!";
  if ( !$file )
  {
    echo("Ошибка открытия файла");
  }
  else
  {
    fputs ( $file, $str);
  }
  fclose ($file);
?>


Работа с файлами | Копирование, переименование и удаление файлов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Копирование, переименование и удаление файлов

Копирование файлов осуществляется функцией copy:

  int copy ( string file1, string file2)

Функция копирует файл с именем file1 в файл с именем file2. Если файл file2 на момент копирования существовал, то он перезаписывается.

Переименование файла производится с помощью функции rename:

  int rename ( string old, string new)

Эта функция переименовывает файл с именем old в файл с именем new.

Функция rename не выполняет переименования файла, если его новое имя расположено в другой файловой системе.

Удаление файла осуществляется посредством функции unlink:

  int unlink ( string filename)


Работа с файлами | Атрибуты файлов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Атрибуты файлов

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

Функция file_exists проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае:

  bool file_exists ( string filename)

Функция fileatime возвращает время последнего обращения к файлу:

  int fileatime ( string filename)

Функция filemtime возвращает время последней модификации содержимого файла:

  int filemtime ( string filename)

Функция file_size возвращает размер файла в байтах:

  int file_size ( string filename)

Функция file_type возвращает тип файла:

  string file_type ( string filename)

Строка, возвращаемая этой функцией, содержит один из следующих типов файла:

  • char (специальное символьное устройство);
  • dir (каталог);
  • fifo (именованный канал);
  • link (символическая ссылка);
  • block (специальное блочное устройство);
  • file (обычный файл);
  • unknown (тип не установлен).

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

<?
  clearstatcache();
?>


Работа с файлами | Перемещение по файлам

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Перемещение по файлам

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

Установка указателя текущей позиции в начало файла производится функцией rewind:

  int rewind ( int file)

Аргумент file является дескриптором файла.

Узнать текущее положение указателя можно при помощи функции ftell:

  int ftell ( int file)

Установить указатель в любое место файла можно, используя функцию fseek:

  int fseek ( int file, int offset [, int whence ])

Функция fseek устанавливает указатель файла на байт со смещением offset (от начала файла, от его конца или от текущей позиции, в зависимости от значения параметра whence). Аргумент file представляет собой дескриптор файла. Аргумент whence задает с какого места отсчитывается смещение offset и может принимать одно из следующих значений:

  • SEEK_SET (отсчитывает позицию начала файла);
  • SEEK_CUR (отсчитывает позицию относительно текущего положения указателя);
  • SEEK_END (отсчитывает позицию относительно конца файла).

По умолчанию аргумент whence имеет значение SEEK_SET.

Узнать, находится ли указатель в конце файла, можно с помощью функции feof:

  int feof ( int file)

Если указатель находится в конце файла, функция возвращает true, в ином случае возвращается false.

Функцию feof удобно использовать при чтении файла:

<?
  $file = fopen ("file.txt","r");
  if ($file)
  {
    while(!feof($file))
    {
      $str = fgets($file);
      echo $str;
      echo ("<br>");
    }
    fclose ( $file);
  }
  else
  {
    echo("Ошибка открытия файла");
  }
?>

При помощи этой функции удобно также определять количество строк в файле:

<?
  $file = fopen ("file.txt","r");
  if ($file)
  {
    $counter = 0;
    while(!feof($file))
    {
      $str = fgets ($file);
      $counter++;
    }
    echo($counter);
    fclose ($file);
  }
  else
  {
    echo("Ошибка открытия файла");
  }
?>


Работа с файлами | Работа с каталогами

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Работа с каталогами

Для установки текущего каталога применяется функция chdir:

  int chdir ( string directory)

Работать с этой функцией можно следующим образом:

  • chdir("/tmp/data"); // переход по абсолютному пути
  • chdir("./js"); // переход в подкаталог текущего каталога
  • chdir(".."); // переход в родительский каталог
  • chdir("~/data"); // переходим в /home/пользователь/data (для Unix)

Чтобы узнать текущий каталог можно воспользоваться функцией getcwd:

  string getcwd ( string path)

Для того чтобы открыть каталог используется функция opendir, открывающая каталог, заданный параметром path:

  int opendir ( string path)

После того, как каталог открыт, прочитать его можно функцией readdir:

  string readdir ( int dir)

Эта функция возвращает имена элементов, содержащихся в каталоге. Кроме файлов и папок в каталогах находятся также элементы "." и "..". Первый элемент указывает на текущий каталог, а второй - на родительский. Текущий каталог, кстати, можно открыть, указав его имя как ".":

   $dir = opendir (".");

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

  void closedir ($dir)

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

<?
  $dir = opendir (".");
  echo "Files:\n";
  while ($file = readdir ($dir))
  {
    echo "$file<br>";
  }
  closedir ($dir);
?>

Заметим, что эта функция возвращает также "." и "..". Если этого делать не нужно, то исключить эти значения можно следующим образом:

<?
  $dir = opendir (".");
  while ( $file = readdir ($dir))
  {
    if (( $file != ".") && ($file != ".."))
    {
      echo "$file<br>";
    }
  }
  closedir ($dir);
?>

В качестве примера на рассмотренные функции, давайте создадим скрипт, удаляющий все файлы из каталога c:/temp, к которым не было доступа в течение суток. Функция удаления файлов в этом случае вызывается рекурсивно.

<?
  function delTemporaryFiles ($directory)
  {
  $dir = opendir ($directory);
  while (( $file = readdir ($dir)))
  {
    if( is_file ($directory."/".$file))
    {
      $acc_time = fileatime ($directory."/".$file);
      $time =  time();
      if (($time - $acc_time) > 24*60*60)
      {
        if (  unlink ($directory."/".$file))
        {
          echo ("Файлы успешно удалены");
        }
      }
    }
    else if ( is_dir ($directory."/".$file) && ($file != ".") && ($file != ".."))
    {
      delTemporaryFiles ($directory."/".$file);
    }
  }
  closedir ($dir);
  }
  delTemporaryFiles ("c:/temp");
?>

Создание каталогов производится с помощью функции mkdir:

  bool mkdir ( string dirname, int mode)

Эта функция создает каталог с именем dirname и правами доступа mode. В случае неудачи возвращает false. Права доступа задаются только для каталогов UNIX, поскольку в Windows этот аргумент игнорируется. Ниже приведен пример создания каталога test в директории c:/temp.

<?
  $flag = mkdir ("c:/temp/test", 0700);
  if($flag)
  {
    echo("Каталог успешно создан");
  }
  else
  {
    echo("Ошибка создания каталога");
  }
?>

Удалить каталог можно с помощью функции rmdir:

  bool rmdir ( string dirname)

Теперь удалим только что созданный каталог /test:

<?
  $flag = rmdir ("c:/temp/test");
  if($flag)
  {
    echo("Каталог успешно удален");
  }
  else
  {
    echo("Ошибка удаления каталога");
  }
?>

Функция rmdir удаляет только пустые каталоги. Для того чтобы удалять непустые каталоги, давайте напишем функцию и удалим каталог c:/temp со всеми вложенными папками и файлами:

<?
  function full_del_dir ($directory)
  {
  $dir = opendir($directory);
  while(($file = readdir($dir)))
  {
    if ( is_file ($directory."/".$file))
    {
      unlink ($directory."/".$file);
    }
    else if ( is_dir ($directory."/".$file) &&
             ($file != ".") && ($file != ".."))
    {
      full_del_dir ($directory."/".$file);
    }
  }
  closedir ($dir);
  rmdir ($directory);
  echo("Каталог успешно удален");
  }
  full_del_dir ("c:/temp")
?>

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


Работа с файлами | Методы PUT и POST

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами

    Открытие файлов

    Отображение файлов

    Закрытие файлов

    Чтение и запись

    Копирование, удаление

    Атрибуты файлов

    Перемещение по файлам

    Работа с каталогами

    Методы PUT и POST

  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с файлами
Предыдущая Следующая

Методы PUT и POST

Методы HTTP PUT и HTTP POST предназначены для загрузки файлов на сервер.

Протокол HTTP предоставляет три метода для работы с информацией, находящейся на Web-сервере: GET, PUT и POST. Метод GET применяется для получения Web-страниц, при этом все переменные формы передаются в URL. Поскольку на многих Web-серверах установлено ограничение на максимальную длину URL (как правило, не более 1024), не стоит применять метод GET, если требуется передача данных большего объема.

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

   PUT /path/filename.html HTTP/1.1

В этом случае Web-сервер должен сохранить содержимое этого запроса в виде /path/filename.html в пространстве имен URL Web-сервера. По умолчанию сам Web-сервер не выполняет такие запросы, а задает CGI-сценарий для их обработки. В Apache назначить сценарий для обработки PUT-запросов, можно изменив директиву Script, находящуюся в файле httpd.conf, к примеру, так:

   Script PUT /cgi-bin/put.cgi

Это означает, что обрабатывать PUT-запросы будет CGI-скрипт put.cgi.

Как правило, для загрузки файлов на сервер используют метод HTTP POST. Этот метод позволяет передавать большие объемы данных из формы и сохраняет все переменные формы в теле запроса.


Регулярные выражения | Базовый синтаксис и создание регулярных выражений

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

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

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

Алгоритм поиска с использованием регулярных выражений был впервые разработан одним из создателей UNIX Кеном Томпсоном. Интересно, что изначально регулярные выражения появились не в теории вычислительных систем, а в нейрофизиологии. Основу теории регулярных выражений заложили нейрофизиологи У. Мак-Каллох и У. Питтс, работавшие над способами математического описания нервных процессов. Позднее математик С. Клини, основываясь на этих исследованиях, опубликовал работу "Представление событий в нейронных сетях", в которой и было введено понятие регулярных выражений. Кен Томпсон, основываясь на этих работах, адаптировал теорию регулярных выражений для алгоритмов поиска информации. Именно начиная с его работ, регулярные выражения стали использоваться в текстовых редакторах и вошли во многие языки программирования.

Базовый синтаксис и создание регулярных выражений

Простейшее регулярное выражение можно записать так:

"abc"

Это выражение соответствует любой строке, которая содержит подстроку "abc".

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

"[abc]"

Этому регулярному выражению соответствует любая строка, содержащая abc либо вместе, либо каждый из них в отдельности. Выражение в квадратных скобках иногда еще называют бра-кет выражением.

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

"[а-Я]"

Это выражение соответствует всем буквам русского алфавита, поскольку любые два символа, разделяемые дефисом, задают соответствие диапазону символов, находящихся между ними. Заметьте, что регулярное выражение "[а-Я]" описывает символы как нижнего, так и верхнего регистров, поэтому более подробно это выражение можно записать так:

"[а-яА-Я]"

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

"[0-9]"
  или
"[0123456789]"

Оба этих выражения эквивалентны и соответствует любой цифре.


Регулярные выражения | Групповой символ

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Групповой символ

При создании регулярных выражений часто удобно пользоваться групповым символом точки ".", который объединяет два одиночных символа, за исключением символа \n. К примеру:

  .ок

Это выражение, в частности соответствует строкам "кок", "док", "ток".

Выражение

   "x.[0-9]"

соответствует строке, содержащей символ x, за которым идет любой другой символ и цифры от 0 до 9. Этому критерию, к примеру, удовлетворяют строки "xy1", "xz2" и т. д.


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

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Ветви

В регулярном выражении может быть несколько ветвей, которые разделяются символом |, действующим как оператор OR (ИЛИ). Т. е., если в выражении используются ветви, то для соответствия регулярного выражения какой-либо строке, достаточно, чтобы только одна из ветвей соответствовала этой строке:

"abc|абв"

Этому регулярному выражению соответствует любая строка, содержащая подстроки "abc" или "абв". Ветвление удобно применять при проверке расширений и имен файлов, зон доменных имен и т. д. К примеру, следующее регулярное выражение проверяет, содержатся ли в строке подстроки "ru", "com" или "net":

"ru|com|net"


Регулярные выражения | Исключающее выражение

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Исключающее выражение

Для исключения последовательности символов из поиска перед этой ней ставится символ "^":

"[^а-я]"

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


Регулярные выражения | Квалификаторы

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Квалификаторы

Регулярное выражение можно уточнить при помощи квалификаторов - так называются символы +, ?, *. Квалификаторы говорят о том, сколько раз последовательность символов может встретиться в строке и указываются непосредственно после той части выражения, к которой они применяются:

  • "a+" - хотя бы один а (строки "абв" и "абва" соответствуют этому выражению, а строка "укр" - нет);
  • "a?" - ноль или один а (строки "абв" и "укр" соответствуют этому выражению, а строка "абва" - нет);
  • "a*" - ноль или более а (строки "абв" и "абва" и "укр" соответствуют этому выражению).


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

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Границы

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

  • "xy{2}" соответствует строке, в которой за x следует два y;
  • "xy{2,}" соответствует строке, в которой за x следует не менее двух y (может быть и больше);
  • "xy{2,6}" соответствует строке, в которой за x следует от двух до шести y;

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

  • "x(yz){2,6}" соответствует строке, в которой за x следует от двух до шести последовательностей yz;
  • "x(yz)*" соответствует строке, в которой за x следует ноль и более последовательностей yz;


Регулярные выражения | Подвыражения

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Подвыражения

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

(морская)*волна

Это выражение соответствует строкам "волна", "морская волна", "морская морская волна" и т.д.


Регулярные выражения | Соответствие началу и концу строки

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Соответствие началу и концу строки

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

Символ ^ соответствует началу строки:

"^xy"

Такое выражение соответствует любой строке, начинающейся с xy. Обратите внимание, что в этом случае символ ^ ставится за пределами выражения в скобках, к примеру:

"^[a-z]"

Знак доллара $ соответствует концу строки:

"xy$"

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


Регулярные выражения | Сопоставление со специальными символами

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Сопоставление со специальными символами

В тех случаях, когда нужно сопоставить выражение строке, в которой встречаются спецсимволы, о которых говорилось выше в этой главе, такие как $, ^, { и т. д., перед ними ставится символ обратной косой черты (\). Например, для того, чтобы найти в строке символ $, в регулярном выражении нужно написать "\$".

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

То же самое относится и к самому символу обратной косой черты. Если нужно провести сопоставление с символом обратной косой черты, то в этом случае ставится две обратных косых черты, т. е. \\.


Регулярные выражения | Классы символов

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

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

Классами символов называются сокращенные обозначения для предопределенных символов.

  • Класс [[:alnum:]] - буквенно-цифровые символы
  • Класс [[:digit:]] - десятичные цифровые символы
  • Класс [[:xdigit:]] - шестнадцатеричные цифровые символы
  • Класс [[:alpha:]] - буквенные символы
  • Класс [[:upper:]] - прописные буквенные символы
  • Класс [[:lower:]] - строчные буквенные символы
  • Класс [[:punct:]] - знаки пунктуации
  • Класс [[:space:]] - символы пробела
  • Класс [[:blanc:]] - символы табуляции и пробела
  • Класс [[:print:]] - печатные символы
  • Класс [[:cntrl:]] - управляющие символы
  • Класс [[:graph:]] - печатные символы, за исключением пробельные

Вы можете использовать классы символов в регулярных выражениях точно также как и остальные символы. К примеру:

  • Эквивалентом выражения "[a-zA-Z_0-9]" является выражение "[[:alnum:]]";
  • Выражению "[0-9]" эквивалентно выражение "[[:digit:]]"
  • Выражению "[a-Z]" эквивалентно регулярное выражение "[[:alpha:]]".


Регулярные выражения | Функции для работы с регулярными выражениями

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

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

PHP поддерживает два вида записи регулярных выражений: POSIX и Perl. POSIX расшифровывается как Portable Operating System Interface (интерфейс переносной операционной системы) и является стандартом для интерфейсов приложений. В этом разделе мы будем работать с регулярными выражениями в стиле POSIX, а позже рассмотрим Perl-совместимые регулярные выражения.

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

ereg()

  bool ereg(string pattern, string string [, array regs])

Данная функция ищет в строке string соответствие регулярному выражению, заданному в шаблоне pattern. Если соответствия подвыражений с шаблоном будут найдены, то они сохраняются в массиве соответствий regs. При этом $regs[0] содержит копию строки string, $regs[1] содержит подстроку, начинающуюся с первой левой скобки, $regs[2] хранит подстроку, начинающуюся со второй левой скобки и т.д.

Ниже приведен код, преобразующий дату из формата YYYY-MM-DD в формат DD.MM.YYYY.

<?
  $date = "2003-03-21";
  if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs))
  {
    echo "$regs[3].$regs[2].$regs[1]";
  }
  else
  {
    echo "Неверный формат даты: $date";
  }
?>

ereg_replace()

  string ereg_replace(string pattern, string replacement, string string)

Эта функция заменяет найденный в строке string шаблон pattern на строку replacement и, если соответствие было найдено, возвращает модифицированную строку.

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

<?
  $number = "1952";
  $str = "Он родился в пятьдесят втором.";
  echo("до замены:$str");
  $str = ereg_replace("пятьдесят втором", $number, $str);
  echo("<br> после замены: $str");
?>

Результат:

до замены: Он родился в пятьдесят втором.
после замены: Он родился в 1952.

eregi()

  bool eregi (string pattern, string string[, array regs])

Эта функция идентична функции ereg, за исключением того, что она игнорирует регистр.

eregi_replace()

  string eregi_replace (string pattern, string replacement, string string)

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

split()

  array split (string pattern, string string [, int limit])

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

Эта функция полезна при разделении дат, доменных имен и т.д.

К примеру:

<?
  $url = "www.softtime.ru";
  $array = split ("\.", $url);
  foreach($array as $index => $val)
  {
    echo("$index -> $val <br />");
  }
?>

Результат:

0 -> www
1 -> softtime
2 -> ru

То же самое можно проделать с датой:

<?
  $date = "10-12-2003";
  $array = split ("-", $date);
  foreach($array as $index => $val)
  {
    echo("$index -> $val <br />");
  }
?>

Результат:

0 -> 10
1 -> 12
2 -> 2003

spliti()

  array spliti (string pattern, string string [, int limit])

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


Регулярные выражения | Perl-совместимые регулярные выражения

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения

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

    Групповой символ

    Ветви

    Исключающее выражение

    Квалификаторы

    Границы

    Подвыражения

    Начало и конец строки

    Спец символы

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

    Функции для работы

    Perl-совместимые выражения

  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Регулярные выражения
Предыдущая Следующая

Perl-совместимые регулярные выражения

PHP поддерживает ряд функций для работы с Perl-совместимыми регулярными выражениями (PCRE - Perl Compatible Regular Expression). Такие выражения заключаются в ограничители, в качестве которых, как правило, используется прямой слеш:

/mail/

Это выражение соответствует строке, содержащей слово "mail".

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

  • i (Игнорировать регистр при поиске соответствия. Т. е. выражение "/mail/i" будет соответствовать как строке "MAIL", так и строке "mail".);
  • x (Игнорировать пробельные символы).

Для PCRE-выражений характерно применение общих типов символов, которые аналогичны классам символов для регулярных выражений в стиле POSIX. Наиболее часто встречающиеся общие типы символов приведены ниже.

  • \d - соответствие десятичной цифре
  • \D - соответствие любому символу, за исключением десятичных цифр
  • \s - соответствие пробельным символам
  • \S - соответствие любым символам, кроме пробельных
  • \h - наличие границы слова
  • \B - отсутствие границы слова
  • \Z - конец строки или символ перевода конца строки
  • \A - начало строки

Теперь рассмотрим основные функции, которые есть в PHP для работы с PCRE-выражениями.

preg_match()

  int preg_match (string pattern, string subject [, array matches])

Эта функция ищет в строке subject соответствие регулярному выражению pattern. Если задан необязательный параметр matches, то результаты поиска помещаются в массив.

Приведем несколько примеров.

<?
  $str = "PHP один из лучших языков программирования для Web";
  if (preg_match ("/php/i", $str))
  {
    echo("Соответствие найдено");
  }
  else
  {
    echo("Соответствие не найдено");
  }
?>

Результат:

Соответствие найдено

<?
  $str = "PHP один из лучших языков программирования для Web";
  if (preg_match ("/\bweb\b/i", $str))
  {
    echo("Соответствие найдено");
  }
  else
  {
    echo("Соответствие не найдено");
  }
?>

Результат:

Соответствие найдено

<?
  // получаем www-адрес (имя хоста) из url
  $url = "http://www.php.net/download.html";
  preg_match("/^(http:\/\/)?([^\/]+)/i", $url, $matches);
  $host = $matches[2];
  echo("www-адрес: $host");
  echo("<br>");
  // получаем последние два сегмента имени хоста (доменное имя)
  preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  echo "доменное имя: {$matches[0]}\n";
?>

Результат:

www-адрес: www.php.net
доменное имя: php.net

preg_replace()

mixed preg_replace (mixed pattern, mixed replacement, mixed subject
                            [,int limit])

Эта функция ищет в строке subject соответствия регулярному выражению pattern, и заменяет их на replacement. Необязательного параметр limit задает число соответствий, которые надо заменить. Если этот параметр не указан, или равен -1, то заменяются все найденные соответствия.

<?
  $str = "May 15, 2003";
  $pattern = "/(\w+) (\d+), (\d+)/i";
  $replacement = "1 \${1} \$3";
  print preg_replace($pattern, $replacement, $str);
?>

Результат:

1 May 2003

А вот как можно написать функцию, которая будет практически полным аналогом функции htmlspecialchars.

<?
  function my_htmlspecialchats($document)
  {
    $search = array ("']*?>.*?'si",
                     "'<[\/\!]*?[^<>]*?>'si",
                     "'([\r\n])[\s]+'",
                     "'&(quot|#34);'i",
                     "'&(amp|#38);'i",
                     "'&(lt|#60);'i",
                     "'&(gt|#62);'i",
                     "'&(nbsp|#160);'i",
                     "'&(iexcl|#161);'i",
                     "'&(cent|#162);'i",
                     "'&(pound|#163);'i",
                     "'&(copy|#169);'i",
                     "'&#(\d+);'e");
    $replace = array ("",
                      "",
                      "\\1",
                      "\"",
                      "&",
                      "<",
                      ">",
                      " ",
                      chr(161),
                      chr(162),
                      chr(163),
                      chr(169),
                      "chr(\\1)");
    $text = preg_replace ($search, $replace, $document);
    return $text;
  }
  $doc = "alert;"; // напишем java-скрипт
  my_htmlspecialchats($doc);  // выводит "alert;"
  echo($doc);
?>


Сессии в PHP (cookies, сессии)

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP

    Сессии в PHP

    Cookies

  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Сессии и cookie в PHP
Предыдущая Следующая

Сессии (сеансы) в PHP

session_start()
unset()
session_register()
session_destroy()
session_unregister()

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

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

Протокол HTTP является протоколом "без сохранения состояния". Это означает, что данный протокол не имеет встроенного способа сохранения состояния между двумя транзакциями. Т. е., когда пользователь открывает сначала одну страницу сайта, а затем переходит на другую страницу этого же сайта, то основываясь только на средствах, предоставляемых протоколом HTTP невозможно установить, что оба запроса относятся к одному пользователю. Т. о. необходим метод, при помощи которого было бы отслеживать информацию о пользователе в течение одного сеанса связи с Web-сайтов. Одним из таких методов является управление сеансами при помощи предназначенных для этого функций. Для нас важно то, что сеанс по сути, представляет собой группу переменных, которые, в отличие от обычных переменных, сохраняются и после завершения выполнения PHP-сценария.

При работе с сессиями различают следующие этапы:

  • открытие сессии
  • регистрация переменных сессии и их использование
  • закрытие сессии

Открытие сессии

Самый простой способ открытия сессии заключается в использовании функции session_start, которая вызывается в начале PHP-сценария:

session_start

Синтаксис:

  session_start();

Эта функция проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.

Регистрация переменных сессии

Вообще говоря, регистрация переменных сессии осуществляется при помощи функции session_register:

session_register

Синтаксис:

  bool session_register(mixed name [,mixed...]);

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

  session_register("username");

К примеру:

<?
  $name = "maksim";
  $maksim = "my_name";
  session_register($name) // регистрируется переменная "maksim" со
                          // значением "my_name"
?>

Однако, начиная с версии PHP 4.2.0, практика регистрирования сеансовых переменных претерпела некоторые изменения, что вносит в этот вопрос некоторую путаницу. Дело в том, что функция session_register применима только к глобальным переменным и требует, чтобы параметр register_globals был включен. Начиная с этой же версии языка, сеансовые переменные всегда регистрируются в ассоциативных массивах $HTTP_SESSION_VARS и $_SESSION. Т.о., аналогом вызова функции session_register("username") при включенном register_globals являются следующие выражения:

  $_SESSION['username'] = "username";
  // или
  $HTTP_SESSION_VARS['username'] = "username";

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

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

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

  $result = session_is_registerd("username");

При использовании ассоциативных массивов $HTTP_SESSION_VARS и $_SESSION применять эту функцию не следует, а нужно напрямую проверять элементы этих массивов, к примеру, так:

  if(isset($_SESSION['username']))

Закрытие сессии

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

session_destroy

Синтаксис:

  session_destroy();

Способы разрегистрации сеансовых переменных различаются в зависимости от того, каким способом они были зарегистрированы.

При включенном register_globals и использовании функции session_register разрегистрация осуществляется при помощи функции session_unregister:

session_unregister

Синтаксис:

  session_unregister("username");

Если же регистрация осуществлялась путем с применением ассоциативных массивов, то поступают следующим образом:

unset

Синтаксис:

  unset($_SESSION["username"]);

Пример простой сессии

Рассмотрим пример простой сессии, работающей с тремя страницами. При посещении пользователем первой страницы открывается сессия и регистрируется переменная $username. Соответствующий код реализации приведен в листинге:

<?
  session_start();
  $_SESSION['username'] = "maksim";
  echo 'Привет, '.$_SESSION['username']."<br>";
?>
  <a href="page2.php">На следующую страницу </a>

Результат работы этого сценария показан на рис:

После этого, пользователь maksim нажимает на ссылку и попадает на страницу page2.php, код которой приведен в листинге:

<?
  session_start();
  echo $_SESSION['username'].' , ты пришел на другую страницу этого сайта!';
  echo("<br>");
?>
  <a href="page3.php">На следующую страницу </a>

Результат работы этого скрипта показан на рис:

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

<?
  session_start();
  unset($_SESSION['username']); // разрегистрировали переменную
  echo 'Привет, '.$_SESSION['username'];
  /* теперь имя пользователя уже не выводится */
  session_destroy(); // разрушаем сессию
?>

Как видно из рисунка, после разрегистрации сеансовой переменной значение массива $_SESSION['username'] уже недоступно:


cookies

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP

    Сессии в PHP

    Cookies

  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Сессии и cookie в PHP
Предыдущая Следующая

cookies

setcookie()
time()
mktime()

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

Определение Cookies - это текстовые строки, хранящиеся на стороне клиента, и содержащие пары "имя-значение", с которыми связан URL, по которому броузер определяет нужно ли посылать cookies на сервер.

Установка cookies

Установка cookies производится с помощью функции setcookie:

setcookie

Синтаксис:

  bool setcookie (string name [, string value [, int expire [, string path
  [, string domain [, int secure]]]]])

Эта функция имеет следующие аргументы:

  • name - имя устанавливаемого cookie;
  • value - значение, хранящееся в cookie с именем $name;
  • expire - время в секундах с начала эпохи, по истечение которого текущий cookie становится недейтвительным;
  • path - путь, по которому доступен cookie;
  • domain - домен, из которого доступен cookie;
  • secure - директива, определяющая, доступен ли cookie не по запросу HTPPS. По умолчанию эта директива имеет значение 0, что означает возможность доступа к cookie по обычному запросу HTTP.

Пример простого приложения с cookies

Давайте создадим простой сценарий, подсчитывающий при помощи cookies количество обращений посетителя к странице.

В cookie с именем counter будет храниться число посещений страницы пользователем:

<?
  $counter++;
  setcookie("counter",$counter);
  echo("Вы посетили эту страницу $counter раз");
?>

Результат выполнения сценария на рис.:

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

Рассмотрим этот вопрос подробнее, для чего модифицируем код, приведенный в листинге, поместив перед установкой cookie текст:

  Если здесь поместить текст, то возникнет ошибка, так как
  будет послан заголовок Content-type: text/html.
<?
  $counter++;
  setcookie("counter",$counter);
  echo("Вы посетили эту страницу $counter раз");
?>

Как видно из рис., при выполнении этого сценария выводится сообщение об ошибке:

Заметим, что в этих листингах мы обращаемся к переменной $counter, в которой хранится значение cookie, как к глобальной, что требует наличия включенной директивы register_globals. Если эта директива отключена, то значение, хранящееся в cookie можно получить через глобальные массивы $HTTP_COOKIE_VARS["name"] и $_COOKIE["name"]:

<?
  $_COOKIE['counter']++;
  setcookie("counter",$counter);
  echo 'Вы посетили эту страницу '.$_COOKIE['counter'].' раз';
?>

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

<?
  if(!$cookie)
  {
    /* посылаем заголовок переадресации на страницу,
    с которой будет предпринята попытка установить cookie */
    header("Location: $PHP_SELF?cookie=1");
    /* устанавливаем cookie с именем "test" */
    setcookie("test","1");
  }
  else
  {
    if(!$test)
    {
      echo("Для корректной работы приложения необходимо включить cookies");
    }
    else
    {
      /* cookie включены, переходим на нужную страницу */
      header("Location: http://localhost/test1.php");
    }
  }
?>

Установка срока годности cookies

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

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

time

Синтаксис:

  time();

Усовершенствованным вариантом функции time является функция mktime:

mktime

Синтаксис:

  int mktime ([int hour [, int minute [, int second [, int month [, int
  day [, int year [, int is_dst]]]]]]])

Аргумент is_dst этой функции определяет, попадает ли эта дата в период летнего времени и может принимать следующие значения:

  • -1 (По умолчанию. Означает, что свойство не задано);
  • 0 (Временной интервал не приходится на период летнего времени);
  • 1 (Временной интервал приходится на период летнего времени).

Примеры установки сроки годности cookies:

<?
  /* этот cookie действителен в течение 10 мин после создания */
  setcookie("name", $value, time() + 600);
  /* действие этого cookie прекращается в полночь 25 января 2010 года */
  setcookie("name", $value, mktime(0,0,0,01,25,2010));
  /* действие этого cookie прекращается в 18.00 25 января 2010 года */
  setcookie("name", $value, mktime(18,0,0,01,25,2010));
?>

Удаление cookie

Удалить cookie просто. Для этого надо вызвать функцию setcookie и передать ей имя того cookie, который подлежит удалению:

  setcookie("name");

Другие установленные cookie при этом не удаляются.

Проблемы безопасности, связанные с cookies

Иногда в cookies приходится хранить конфиденциальные данные, и в этом случае разработчик должен позаботиться о том, чтобы информация хранящееся в cookie не была передана третьим лицам. Существует несколько методов защиты информации, хранящейся в cookie:

  • установка области видимости cookies;
  • шифрование;
  • ограничение доступа для доменов;
  • отправка cookies по защищенному запросу.

Наилучшим решением является комплексное применение всех этих способов.

Установка области видимости cookie

Поскольку, по умолчанию, доступ к cookie происходит из корневого каталога, это может создать "дыры" в системе защиты, так как cookies становятся доступными в любом подкаталоге этого каталога. Ограничить доступ к cookies для всех страниц, кроме расположенных в конкретном каталоге, к примеру, /web, можно следующим образом:

  setcookie("name", $value, "/web/");

Однако и в этом случае, к примеру, каталоги /web/index.php, /web1/page.html и т. д. будут удовлетворять этому ограничению. Если такое положение также является нежелательным, можно ограничить область видимости cookies до конкретной страницы:

  setcookie("name", $value, "/web/index.php");

Однако и такой способ в полной мере не решает проблему, так как в этом случае доступ к информации, содержащейся в cookie, может получить, к примеру, скрипт /web/index.php-script/anti_cookie.php. Поэтому появляется необходимость в шифровании.

Шифрование

Применить шифрование к cookies можно разными способами, рассмотрим один из них:

<?
  // создаем вектор начального состояния для шифрования
  $vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
                             MCRYPT_MODE_CFB), MCRYPT_RAND);
  $key = "qwe233jk312jx813893xk312"; // ключ для расшифрования
  $cook_name = "maks";
  $cipher = mcrypt_encrypt(MCRYPT_CAST_256, $key, $cook_name,
                           MCRYPT_MODE_CFB, $vector);
  setcookie("username", $cipher, "/decrypt.php");
?>

Как видно из листинга 10.13, расшифровка cookie проводится при помощи скрипта decrypt.php, код которого приведен ниже:

<?
  // вектор начального состояния остается неизменным
  $vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
                             MCRYPT_MODE_CFB), MCRYPT_RAND);
  $key = "qwe233jk312jx813893xk312";
  $decrypt_name = mcrypt_ decrypt(MCRYPT_CAST_256, $key, $username,
                                  MCRYPT_MODE_CFB, $vector);
  echo("$decrypt_name, мы рады видеть вас на нашей страничке!");
?>

Ограничение доступа для доменов

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

  setcookie("name", $value, "/web/index.php", ".server.com");

При таком ограничении заданной области видимости будут соответствовать домены с именами server.com, myservser.com, php.server.com и т. д., поскольку проверка на допустимость области видимости домена осуществляется по принципу концевого соответствия.

Отправка cookies по защищенному запросу

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

  setcookie("name", $value, time() + 600, "/web/", ".server.com", 1);


Работа с FTP средствами PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP

    Основные возможности

    Другие возможности

  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с FTP средствами PHP
Предыдущая Следующая

Основные возможности PHP при работе с FTP

ftp_connect()
ftp_get()
ftp_login()
ftp_quit()

Протокол FTP (File Transfer Protocol - протокол передачи файлов) - один из старейших протоколов Интернета, предназначенный для передачи файлов между двумя хостами.

Как правило, при работе с FTP выполняются следующие стандартные действия:

  • соединение с удаленным FTP-сервером
  • регистрация на FTP-сервере
  • загрузка файлов с сервера или на сервер
  • закрытие соединения

Соединение с FTP-сервером

Соединение с удаленным FTP-сервером выполняется с помощью функции ftp_connect:

Синтаксис:

  ftp_connect (string host [, int port [, int timeout]])

В качестве обязательного параметра эта функция принимает имя хоста host, с которым необходимо установить соединение. Второй необязательный параметр port указывает на номер порта, через который осуществляется соединение. Если этот параметр не указан, то соединение осуществляется через порт 21, являющийся стандартным FTP-портом. Третий необязательный параметр определяет максимально время выполнения сценария (тайм-аут) и по умолчанию равен 90 секундам.

Соединение с удаленным FTP-сервером

<?
  $host = "ftp://ftp.server.ru";
  $connect = ftp_connect($host);
  if(!$connect)
  {
    echo("Ошибка соединения");
    exit;
  }
  else
  {
    echo("Соединение установлено");
  }
?>

Регистрация на FTP-сервере

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

Регистрация на FTP-сервере

<?
  $user = "maks";
  $password = "password";
  $result = ftp_login($connect, $user, $password);
?>

Как видно из листинга, функция ftp_login принимает три параметра: дескриптор FTP-соединения, возвращаемый функцией ftp_connect, имя пользователя и пароль.

Замечание: Регистрация на сервере не требуется, если FTP-сервер является анонимным.

Закрытие соединения

По окончании сеанса связи с FTP-сервером, нужно закрыть FTP-соединение с помощью функции ftp_quit, принимающей в качестве единственного параметра дескриптор FTP-соединения:

Синтаксис:

  ftp_quit($connect);

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

Загрузка файлов с сервера осуществляется при помощи функции ftp_get:

Синтаксис:

  bool ftp_get(int ftp_connect, string local_file,
                      string remote_file, int mode);

Аргумент mode, задающий режим пересылки файлов, должен быть указан как константа FTP_BINARY или FTP_ASCII. Режим FTP_ASCII используется для пересылки файлов, состоящих только из ASCII-символов (т. е. текстовых файлов), а двоичный режим - для пересылки всех остальных файлов.

К примеру:

<?
  $local_file = "/users/local.txt";
  $remote_file = "remote.txt";
  ftp_get($connect, $local_file, $remote_file, FTP_BINARY);
?>


Работа с FTP средствами PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP

    Основные возможности

    Другие возможности

  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Работа с FTP средствами PHP
Предыдущая Следующая

Другие возможности при работе с FTP

ftp_cdup()
ftp_mkdir()
ftp_rmdir()
ftp_pasv()
ftp_chdir()
ftp_nlist()
ftp_size()
ftp_delete()
ftp_rename()
ftp_site()

Переход в родительский каталог

Изменение текущего рабочего каталога на родительский производится с помощью функции ftp_cdup:

Синтаксис:

  bool ftp_cdup(int ftp_connect);

Пример:

<?
  $host = "ftp.server.ru";
  $port = 21;
  $user = "anonymous";
  $passwrod = "password";
  $connect = ftp_connect($host, $port, 150);
  if(!$connect)
  {
    exit();
  }
  $result = ftp_login($connect, $user, $password);
  if($result)
  {
    // сохраняем имя текущего рабочего каталога
    $current_dir = ftp_pwd($connect);
    // переходим в родительский каталог
    ftp_cdup($connect);
    // сохраняем имя нового каталога
    $new_dir = ftp_pwd($connect);
  }
  else
  {
    ftp_quit($connect);
    exit();
  }
  // Закрываем соединение
  ftp_quit($connect);
?>

Изменение текущего рабочего каталога

Изменение текущего рабочего каталога на указанный осуществляется при помощи функции ftp_chdir:

<?
  $new_dir = "web";
  ftp_chdir($connect, $new_dir);
?>

Как видно из этого листинга, функция ftp_chdir имеет два параметра: дескриптор соединения $connect и имя нового каталога $new_dir.

Удаление файлов

Удалить файл с FTP-сервера можно с помощью функции ftp_delete:

Синтаксис:

  bool ftp_delete(int ftp_connect, string remote_file);

Здесь ftp_connect - дескриптор соединения, а remote_file - имя удаляемого файла.

Создание каталога

Новый каталог можно создать, используя функцию ftp_mkdir:

Синтаксис:

  string ftp_mkdir(int ftp_connect, string directory);

Эта функция возвращает имя созданного каталога или false в случае неудачи:

<?
  $dir = "web";
  $created_dir = ftp_mkdir($connect, $dir);
?>

Перечисление файлов в каталоге

Узнать, какие файлы находятся в текущем каталоге, можно применив функцию ftp_nlist:

Синтаксис:

  array ftp_nlist(int ftp_connect, string directory);

Пример:

<?
  $file_list = ftp_nlist($connect, ".");
  if(is_array($file_list))
  {
    foreach($file_list as $file)
    {
      echo("$file <br>");
    }
  }
?>

Переименование файлов

Переименовать файлы на FTP-сервере осуществляется с помощью функции ftp_rename:

Синтаксис:

  bool ftp_rename(int ftp_connect, string from, string to);

Удаление каталогов

Для удаления каталогов применяется функция ftp_rmdir:

Синтаксис:

   bool ftp_rmdir(int ftp_connect, string directory);

Определение размера файлов

Для определения размера файлов существует функция ftp_size:

Синтаксис:

  int ftp_size(int ftp_connect, string filepath);

В случае неудачи функция возвращает -1. К примеру:

<?
  $file = "/web/user/file.txt";
  $file_size = ftp_size($connect, $file);
  if ($file_size == -1)
  {
    echo("Размер файла не определен");
  }
  else
  {
    echo("Файл $file имеет размер $file_size байт");
  }
?>

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

Послать на сервер команду можно с помощью функции ftp_site:

Синтаксис:

  bool ftp_site(int ftp_connect, string command);

Эта функция посылает на сервер команду SITE. Как правило, с помощью команд SITE выполняются такие команды операционной системы, как chmod. Список команд SITE, поддерживаемый сервером можно узнать, подключившись к нему и выполнив команду REMOTEHELP. Ниже приведен код, позволяющий изменить права доступа к файлу на удаленном сервере:

<?
  $command = "chmod 0766 /web/user/file.txt";
  ftp_site($connect, $command);
?>

Работа через брандмауэр

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

<?
  $pasv_flag = true;
  $pasv_result = $pasv_flag ? "enabled" : "disabled";
  ftp_pasv($connect, $pasv_flag);
?>


Проверка корректности данных

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных

    Проверка данных

  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Проверка корректности данных
Предыдущая Следующая

Проверка корректности данных

isset()
empty()
stripslashes()
htmlspecialchars()

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

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

Кроме чистых ошибок пользователя, необходимо также исключить ситуации, в которых возможно злонамеренное введение некорректных данных, к примеру, различных скриптов. Для этого вводимый пользователем текст необходимо обработать функциями удаления HTML-тегов (для исключения возможности написания скриптов на JavaScript и Visual Basic) и обратных слешей (для исключения возможности написания скриптов на Perl). Т. о. минимальный набор действий, необходимый для проверки корректности данных, вводимых пользователем, включает следующие этапы:

  • проверка того, что пользователь ввел данные
  • проверка допустимости вводимых пользователем данных (как правило, осуществляется при помощи регулярных выражений)
  • обработка текста, введенного пользователем функцией htmlspecialchars для удаления HTML-тегов
  • обработка текста, введенного пользователем функцией stripslashes для удаления обратных слешей

Проверка на пустоту поля

Проверка того, что пользователь ввел данные, может осуществляться, к примеру, с помощью функции isset:

<?
  $name = $HTTP_POST_VARS['name'];
  if (!isset($name))
  {
    // если переменная $name не существует просим повторить ввод имени
?>
    <h1> Вы забыли ввести ваше имя </h1>
    <!-- далее следует HTML-код формы, в которой вводится имя -->
<?
  }
  else
  {
    -
  }
?>

Для этой же цели можно использовать функцию empty:

<?
  $name = $HTTP_POST_VARS['name'];
  if (empty($name))
  {
    // если поле пустое, снова просим ввести имя
?>
    <h1> Вы забыли ввести ваше имя <h1>
    <!-- далее следует HTML-код формы, в которой вводится имя -->
<?
  }
  else
  {
    -
  }
?>

На практике удобно сначала проверить, не пустой ли action формы, а потом уже проверять различные его составляющие: поле имя, e-mail и т. д. К примеру:

<?
  $action = $HTTP_POST_VARS["action"];
  if (!empty($action))
  {
    if (empty($name))
    {
     // код, для случая, когда не введено имя
    }
    if (!empty($email))
    {
       // код, для случая, когда не введен e-mail
    }
  // дальнейший код скрипта
  }
  if (empty($action))
  {
?>
  <!-- здесь пишем HTML-код формы, в которой вводится информация -->
<?
  }
?>

Проверка допустимости вводимых данных

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

Будем исходить из того, что адрес должен иметь вид something@server.com. Как видим, у адреса две составляющие - имя пользователя и имя домена, которые разделены знаком @. В имени пользователя могут присутствовать буквы нижнего и верхнего регистров, цифры, знаки подчеркивания и минуса, точки. Для проверки разделителя между именем пользователя и именем домена в выражение требуется добавить +@. Таким образом, регулярное выражение, проверяющее имя пользователя и наличие разделителя имеет следующий вид:

  "/[0-9a-z_]+@[0-9a-z_^\.]"

Для проверки доменного имени добавляем такое выражение:

  "\.[a-z]{2,3}/i"

Объединяя эти шаги, получаем следующее регулярное выражение для проверки адресов электронной почты:

  "/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i"

Точно таким же образом вы можете проверить и остальные заполняемые пользователем поля.

Удаление HTML - тегов и обратных слешей

Как уже говорилось, вводимый пользователем текст необходимо обработать функциями удаления HTML-тегов (для исключения возможности написания скриптов на JavaScript и Visual Basic) и обратных слешей (для исключения возможности написания скриптов на Perl). К примеру, если переменная $name содержит текст с именем пользователя, то обработка этого текста выглядит так:

<?
  $name = substr($HTTP_POST_VARS["name"],0,32);
  $name = htmlspecialchars(stripslashes($name));
?>


Пишем гостевую книгу на PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга

    Пишем гостевую книгу

  12. PHP и MySQL

Продолжение следует

Пишем гостевую книгу на PHP
Предыдущая Следующая

Пишем гостевую книгу на PHP (вариант на файлах)

Сейчас мы разработаем приложение "Гостевая книга на PHP".

Сообщения будут храниться в файлах, которые расположены в директории RECORDS (позже мы разработаем вариант гостевой книги, основанный на хранении сообщений в базе данных). Код размещен в двух файлах: index.php (отображение сообщений) и addrec.php (добавление сообщений, их проверка и запись в файл).

Итак, создайте файл addrec.php и в той же директории, в которой расположен этот файл создайте директорию RECORDS.

Сначала проверяем, ввел ли пользователь данные и правильно ли он их ввел:

<?
  $error = "";
  $action = $HTTP_POST_VARS["action"];
  if (!empty($action))
  {
    $name = trim($name);
    $msg = trim($msg);
      if (empty($msg)) // если не введено сообщение
      {
        $action = "";
        $error = $error."<LI>Вы не ввели сообщение\n";
      }
      if (empty($name)) // если не введено имя
      {
        $action = "";
        $error = $error."<LI>Вы не ввели имя\n";
      }
      if (!empty($email))
      /* если введен e-mail, то проверяем с помощью регулярного выражения
      правильность ввода */
      {
        if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
        {
          $action = "";
          $error = $error."<LI> Неверно введен е-mail.&nbsр Введите e-mail
          в виде <i>softtime@softtime.ru</i> \n";
        }
      }

Теперь обрабатываем введенный пользователем текст функциями удаления HTML-тегов и обратных слешей:

$name = substr($HTTP_POST_VARS["name"],0,32);
$name = htmlspecialchars(stripslashes($name)); // обрабатываем имя
$city = substr($HTTP_POST_VARS["city"],0,32);
$city = htmlspecialchars(stripslashes($city)); // обрабатываем город
$email = substr($HTTP_POST_VARS["email"],0,32);
$email = htmlspecialchars(stripslashes($email)); // обрабатываем e-mail
$url = substr($HTTP_POST_VARS["url"],0,36);
$url = htmlspecialchars(stripslashes($url)); // обрабатываем url-адрес
$msg = substr($HTTP_POST_VARS["msg"],0,1024);
$msg = htmlspecialchars(stripslashes($msg)); // обрабатываем сообщение

В нашей гостевой книге поддерживается полужирное начертание, курсив, подчеркивание, верхние и нижние индексы. Для того, чтобы пользователь мог, к примеру, выделить блок текста в сообщении курсивом, его необходимо заключить в теги <i></i> и т.д. Поэтому для после того, как текст введен, нужно заменить эти искусственные теги на их реальное HTML-представление:

if (empty($error)) // если ошибок нет, обрабатываем сообщение
  {
    $msg = nl2br($msg);
    $msg = str_replace("[u]","<u>",$msg);
    $msg = str_replace("[U]","<u>",$msg);
    $msg = str_replace("[i]","<i>",$msg);
    $msg = str_replace("[I]","<i>",$msg);
    $msg = str_replace("[b]","<B>",$msg);
    $msg = str_replace("[B]","<B>",$msg);
    $msg = str_replace("[sub]","<SUB>",$msg);
    $msg = str_replace("[SUB]","<SUB>",$msg);
    $msg = str_replace("[sup]","<SUP>",$msg);
    $msg = str_replace("[SUP]","<SUP>",$msg);
    $msg = str_replace("[/u]","</u>",$msg);
    $msg = str_replace("[/U]","</u>",$msg);
    $msg = str_replace("[/i]","</i>",$msg);
    $msg = str_replace("[/I]","</i>",$msg);
    $msg = str_replace("[/b]","</B>",$msg);
    $msg = str_replace("[/B]","</B>",$msg);
    $msg = str_replace("[/SUB]","</SUB>",$msg);
    $msg = str_replace("[/sub]","</SUB>",$msg);
    $msg = str_replace("[/SUP]","</SUP>",$msg);
    $msg = str_replace("[/sup]","</SUP>",$msg);
    $msg = eregi_replace("(.*)\\[url\\](.*)\\[/url\\](.*)","\\1<a
                       href=\\2>\\2</a>\\3",$msg);
    $msg = str_replace("\n"," ",$msg);
    $msg = str_replace("\r"," ",$msg);

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

    /* создаем файл с именем вида "rec.+время добавления сообщения" */
    $file = fopen("records/rec.".time(),"w");
    // записываем информацию в файл, по одной строчке на каждое поле
    fputs($file,$name."\n");
    fputs($file,$city."\n");
    fputs($file,$email."\n");
    fputs($file,$url."\n");
    fputs($file,$msg."\n");
    // закрываем файл
    fclose($file);

Вызываем скрипт index.php, ответственный за отображение сообщений:

  print "<HTML><HEAD>\n";
  print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>\n";
  print "</HEAD></HTML>\n";
  }
  }

Добавляем код вывода сообщений об ошибках и HTML-код формы добавления сообщения:

  if (empty($action))
  {
    <?
    <HTML>
    <HEAD>
    <TITLE>Гостевая книга - добавление записи</TITLE>
    </HEAD&tg;
    <BODY>
    <H3>
      <? print "<center>"; ?>
      <font color=#1E90FF>Добавление записи</font>
    </H3>
    <?
    if (!empty($error))
    /* если есть ошибки, выводим сообщение об ошибках */
    {
      print "<P><font color=green>Во время добавления записи произошли
      следующие ошибки:</font></P>\n";
      print "<UL>\n";
      print $error;
      print "</UL>\n";
    }
    ?>
    <!-- пишем HTML-код формы добавления сообщений !-->
    <center>
     <table width=1 border=0>
     <form action=addrec.php method=post>
     <input type=hidden name=action value=post>
    <tr>
     <td width=50%>Имя:<font color=red><sup>*</sup><font></td>
     <td align=right>
       <input type=text name=name maxlength=32 value='<? echo $name; ?>'>
     </td>
    </tr>
    <tr>
      <td width=50%>Город:</td>
      <td align=right>
        <input type=text name=city maxlength=32 value='<? echo $city;; ?>'>
      </td>
    </tr>
    <tr>
      <td width=50%>E-Mail:</td>
      <td align=right>
        <input type=text name=email maxlength=32 value='<? echo $email; ?>'>
      </td>
    </tr>
    <tr>
      <td width=50%>URL:</td>
      <td align=right>
        <input type=text name=url maxlength=36 value='<? echo $url; ?>'>
      </td>
    </tr>
    <tr>
      <td colspan=2>Сообщение:<font color=red<sup>*</sup></font><br>
        <textarea cols=50 rows=8 name=msg><? echo $url; ?>
        </textarea>
      </td>
    </tr>
    <tr>
      <td colspan=2><input type=submit value='Добавить'></td>
    </tr>
  </form>
  <tr>
    <td colspan=2><font color=red><sup>*</sup></font> - поля,
      обязательные для заполнения
    </td><td align=left>
  </table>
  </center>
  </BODY>
  </HTML>
  <?
   }
  ?>

После окончания работы с кодом, размещенным в файле addrec.php, форма для добавления сообщений должна иметь следующий вид:

Добавление записи

Имя:*
Город:
E-Mail:
URL:
Сообщение:*
* - поля, обязательные для заполнения

Листинг файла index.php, используемого для отображения сообщений:

  <HTML>
  <HEAD>
  <TITLE>Гостевая книга</TITLE>
  </HEAD>
  <BODY>
  <?
  /* открываем директорию и считываем из нее файлы */
  $dir_rec = dir("records");
  $i = 0;
  while($entry = $dir_rec->read())
  {
    if (substr($entry,0,3)=="rec")
    {
      $names[$i]=substr($entry,4);
      $i++;
    }
  }
  $dir_rec->close(); // закрываем директорию
  @rsort($names); // сортируем файлы
  /* определяем очередность сообщений и выводим их */
  $count = $i;
  $count1 = $count;
  if (empty($start))
  {
    $start = 0;
  }
  $start = intval($start);
  if ($start < 0)
  {
    $start = 0;
  }
  print "<center>";
  if ($count > $start + 10) $count = $start + 10;
  if ($start != 0)
  {
    print "<A href=index.php?start=".($start - 10).">Предыдущие</A>";
  }
  print "<a href=addrec.php>Добавить запись</A>";
  if ($count1 > $start + 10)
  {
    print "<A href=index.php?start=".($start + 10).">Следующие</A> \n";
  }
  print "</center><br>";
  /* выводим все сообщения в цикле */
  for ($i = $start; $i < $count; $i++)
  {
    $entry = $names[$i];
    $data = file("records/rec.".$entry);
    $date = $entry;
    $name = trim($data[0]);
    $city = trim($data[1]);
    $email = trim($data[2]);
    $url = trim($data[3]);
    $msg = trim($data[4]);
    /* поле, в которое администратор может добавить ответ */
    $answer = trim($data[5]);
    print "<table border=0 cellspacing=0 cellpadding=2 width=100%>
    <tr bgcolor=#F0F0F0><td>&nbsр;";
    print "<b>$name</b>&nbsр;";
    if (!empty($city)) print "$city&nbsр";
    if (!empty($email)) print "<a href=mailto:$email><i>$email</i></A>\n";
    if (!empty($url)) print "<a href=$url>$url</a>";
    print "</td><td align=right>".date("<b>d-m-Y</b> H - i, $date)."
    </td></tr>\n<tr><td colspan=2>\n";
    print "<P>".$msg."</P>\n";
    if (!empty($answer)) // если администратор что-то ответил
    {
      print "<P><font color=#1E90FF>admin:&nbsр$answer</font></P>\n";
    }
    print "</td></tr></table>\n<br><br>\n";
  }
  print "<center>";
  if ($start != 0)
  {
    print "<A href=index.php?start=".($start - 10).">Предыдущие</A>";
  }
  print "<a href=addrec.php>Добавить запись</A>";
  if ($count1 > $start + 10)
  {
    print "<A href=index.php?start=".($start + 10).">Следующие</A> \n";
  }
  print "</center>";
  ?>
  </BODY>
  </HTML>

Гостевая книга написана.

Если ввести сообщение, то оно отобразится следующим образом:

Предыдущие Добавить запись Следующие

авторы Нижний Новгород http://www.softtime.ru 20-03-04 15 - 00

Мы рады приветствовать Вас!

admin:

Предыдущие Добавить запись Следующие

При неправильном заполнении полей гостевой книги отобразится сообщение об ошибке:

Добавление записи

Во время добавления записи произошли следующие ошибки:

  • Вы не ввели сообщение
  • Вы не ввели имя
  • Неверно введен е-mail. Введите e-mail в виде: softtime@softtime.ru
Имя:*
Город:
E-Mail:
URL:
Сообщение:*
* - поля, обязательные для заполнения


Что такое MySQL. Взаимодействие с PHP

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

PHP и MySQL. Совместная работа
Предыдущая Следующая

Что такое MySQL. Взаимодействие с PHP

Итак, для начала ответим на вопрос: что такое MySQL?

MySQL – это одна из самых популярных и самых распространенных СУБД (система управления базами данных) в интернете. Она не предназначена для работы с большими объемами информации, но ее применение идеально для интернет сайтов, как небольших, так и достаточно крупных.

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

Немаловажным фактором является ее бесплатность. MySQL распространяется на условиях общей лицензии GNU (GPL, GNU Public License).

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

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

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

Примечание

Приложение на РНР, использующее для хранения информации базу данных (в частности MySql) всегда работает быстрее приложения, построенного на файлах. Дело в том, что базы данных написаны на языке C++, и написать на PHP программу, которая работала бы с жёстким диском эффективнее базы данных - задача неразрешимая по определению, поскольку программы на PHP в принципе работают медленнее, чем программы на C++, так как РНР - интерпретатор, а С++ - компилятор.

Таким образом, основное достоинство базы данных заключается в том, что она берёт на себя всю работу с жёстким диском и делает это очень эффективно.


Реляционные базы данных

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

PHP и MySQL. Совместная работа
Предыдущая Следующая

Реляционные базы данных

Задача длительного хранения и обработки информации появилась практически сразу с появлением первых компьютеров. Для решения этой задачи в конце 60-х годов были разработаны специализированные программы, получившие название систем управления базами данных (СУБД). СУБД проделали длительный путь эволюции от системы управления файлами, через иерархические и сетевые базы данных. В конце 80-х годов доминирующей стала система управления реляционными базами данных (СУРБД). С этого времени такие СУБД стали стандартом де-факто, и для того, чтобы унифицировать работу с ними, был разработан структурированный язык запросов (SQL), который представляет собой язык управления именно реляционными базами данных.

Замечание

Взаимодействие с базой данных происходит при помощи Системы Управления Базой Данных (СУБД), которая расшифровывает запросы и производит операции с информацией в базе данных. Поэтому более правильно было бы говорить о запросе к СУБД и о взаимодействии с СУБД из Web-приложения. Но так как это несколько усложняет восприятие, далее везде мы будем говорить "база данных", подразумевая при этом СУБД.

Существуют следующие разновидности баз данных:

  • иерархические;
  • реляционные;
  • объектно-ориентированные;
  • гибридные.

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

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

В объектно-ориентированных базах данных данные хранятся в виде объектов. С объектно-ориентированными базами данных удобно работать, применяя объектно-ориентированное программирование. Однако, на сегодняшний день такие базы дан-ных еще не достигли популярности реляционных, поскольку пока значительно уступают им в производительности.

Гибридные СУБД совмещают в себе возможности реляционных и объектно-ориентированных баз данных.

В Web-приложениях, как правило, используются реляционные базы данных. Мы будем рассматривать пример базы данных, на которой основано большинство форумов, в том числе и тот, который мы далее будем разрабатывать. В этой базе хранится информация об авторах форума (authors), о названиях форумов (forums), о темах форума (themes) и, собственно, сами сообщения (posts). Таким образом, наша база данных будет включать следующие таблицы:

Таблица 1 Таблицы базы данных Forum.

authors

forums

posts

themes

Модель реляционной базы данных представляет данные в виде таблиц, разбитых на строки и столбцы, на пересечении которых находятся данные. Пример такой таблицы показан в Табл.2:

Таблица 2 Структура реляционной базы данных.

 | ряд |  |
строка | id_forum | name | Description
 | 1 | дизайн | Обсуждаются вопросы дизайна
 | 2 | MySQL | Обсуждаются вопросы, связанные с MySQL
 | 3 | PHP | Обсуждаются вопросы, связанные с PHP
 | 4 | разное | Другие вопросы

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

Каждый столбец таблицы forums представляет один элемент данных для каждого из форумов. Столбец id_forum содержит уникальный идентификатор форума, столбец name содержит название форума и столбец description содержит краткое описание проблемы, обсуждаемой на форуме.

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

  • Данные хранятся в таблицах, состоящих из столбцов и строк;
  • На пересечении каждого столбца и строчки стоит в точности одно значение;
  • У каждого столбца есть своё имя, которое служит его названием, и все значения в одном столбце имеют один тип. Например, в столбце id_forum все значения имеют целочисленный тип, а в строке name - текстовый;
  • Столбцы располагаются в определённом порядке, который определяется при создании таблицы, в отличие от строк, которые располагаются в произвольном порядке. В таблице может не быть не одной строчки, но обязательно должен быть хотя бы один столбец;

Запросы к базе данных возвращают результат в виде таблиц, которые тоже могут выступать как объект запросов.


Индексы в MySql

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

PHP и MySQL. Совместная работа
Предыдущая Следующая

Индексы

Определение

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

Интересны, как правило, не сами индексы, а уникальные индексы.

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


Первичные ключи (primary key). База данных MySQL.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

PHP и MySQL. Совместная работа.
Предыдущая Следующая

Первичные ключи

Первичный ключ (primary key) представляет собой один из примеров уникальных индексов и применяется для уникальной идентификации записей таблицы. Никакие из двух записей таблицы не могут иметь одинаковых значений первичного ключа. Первичный ключ обычно сокращенно обозначают как PK (primary key).

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

К примеру, в базе данных Forum таблицы themes и posts связаны между собой следующим образом:

Первичным ключом таблицы themes является id_theme, а таблицы posts - id_post. Обратите внимание, что поле id_theme присутствует и в таблице posts. Каждое значение этого поля в таблице posts является внешним ключом (в данном случае это внешний ключ для первичного ключа таблицы themes). Внешний ключ сокращенно обозначают как FK (foreign key).Как видно из рис.1, внешний ключ ссылается на первичный ключ таблицы themes, устанавливая однозначную логическую связь между записями таблиц themes и posts. Иначе говоря, если внешний ключ для записи (сообщения) с PK=1 в таблице posts имеет значение внешнего ключа равное 1, то это значит, что это сообщение относится к теме с PK=1 таблицы themes.


Способы задания первичных ключей (primary key). База данных MySQL.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

PHP и MySQL. Совместная работа
Предыдущая Следующая

Способы задания первичного ключа

По способу задания первичных ключей различают логические (естественные) ключи и суррогатные (искусственные).

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

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

Совет:

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

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


Нормализация базы данных

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

Взаимодействие PHP и MySQL
Предыдущая Следующая

Нормализация базы данных

Определение:

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

Определение:

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

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

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

Таблица 3. Пример избыточности в таблицах базы данных

Профессия | Сотрудник
"Инженер" | Гусев И.К.
"Инженер" | Иванов П.В.
"Рабочий" | Иванов К.Л.
"Рабочий" | Дружков П.К.
"Рабочий" | Фомичев В.М.

Эта таблица избыточна - для каждого из сотрудников повторяются одинаковые названия профессий. Т.е. схема такой базы данных не нормализована. Для небольшой базы данных это не критично, но в больших по объёму базах данных это скажется на размере базы и, в конечном счёте, на скорости доступа. Для нормализации необходимо разбить эту таблицу на две - для профессий (см. табл. 4) и для фамилий сотрудников (см. табл. 5).

Таблица 4. Таблица профессий

Профессия | Первичный ключ
"Инженер" | 1
"Рабочий" | 2

Таблица 5. Таблица сотрудников

Профессия (внешний ключ) | Сотрудник
1 | Гусев И.К.
1 | Иванов П.В.
2 | Иванов К.Л.
2 | Дружков П.К.
2 | Фомичев В.М.

Теперь каждый тип профессии обозначен уникальным числом, и строка в базе данных присутствует только в единственном экземпляре: в таблице профессий. Размер поля "профессия" уменьшился, так как строка занимает больше памяти, чем число.

Замечание

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


Работа с сервером MySQL

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

Взаимодействие PHP и MySQL
Предыдущая Следующая

Работа с сервером MySQL

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

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

  shell> mysql -h host -u user -p

После этого на экране появится запрос Enter password:, и вам нужно будет ввести свой пароль. Если соединение прошло нормально, то на экране появляется следующая информация и метка командной строки mysql>:

  Welcome to the MySQL monitor. Commands end with ; or \g.
  Your MySQL connection id is 459 to server version:
  Type 'help' for help.
  mysql>

Появление метки mysql> означает, что программа mysql готова к работе.

Отсоединиться от сервера можно в любой момент, набрав команду QUIT:

  mysql> QUIT
  Bye

Кроме этого, разорвать соединение с сервером можно также, одновременно нажав клавиши +.

Замечание

Как правило, на только, что установленном MySQL на локальной машине доступ осуществляется без ввода пароля и хоста, вводом команды mysql в командной строке.

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

Ниже приведена простая команда, запрашивающая у сервера информацию об его версии и текущей дате:

  mysql> SELECT VERSION(), CURRENT_DATE;

Ответом MySQL на этот запрос будет следующая таблица:

  +--------------+--------------------+
  | version() | current_date |
  +--------------+--------------------+
  1 row in set (0.02 sec)

На примере выполнения этого запроса можно увидеть следующие основные особенности работы с MySQL:

  • Команда, посылаемая серверу, обычно состоит из SQL-выражения, за которым следует точка с запятой. Из этого правила есть несколько исключений, когда после команды точка с запятой не ставится, к примеру, уже упомянутая команда QUIT;
  • MySQL выводит результаты запроса в виде таблицы;
  • После вывода таблицы с результатами запроса, mysql сообщает количество возвращаемых строк и время выполнения запроса. Это удобно, поскольку позволяет оценить как производительность сервера, так и эффективность выполняемого запроса;
  • После вывода результатов запроса и времени его выполнения, mysql выводит новую строку mysql>, что означает готовность к выполнению новых команд.

Заметим, что команды MySQL не чувствительны к регистру, поэтому приведенные ниже запросы абсолютно идентичны:

  mysql> select version(), current_date;
  mysql> SELECT VERSION(), CURRENT_DATE;
  mysql> Select Version(), Сurrent_DATE;

MySQL позволяет на одной строчке разместить несколько команд, но каждая из них должна заканчиваться точкой с запятой. К примеру:

  mysql> SELECT VERSION(); SELECT NOW();

На такой запрос мы получим следующий результат:

  +---------------+
  |  version() |
  +---------------+
  | 4.0.13-nt |
  +---------------+
  1 row in set (0.00 sec)
  +----------------------------------+
  | NOW()                        |
  +----------------------------------+
  | 2004-01-25 16:57:00 |
  +----------------------------------+
  1 row in set (0.03 sec)

Однако помещать все команды на одной строке совершенно необязательно:

  mysql> SELECT USER(),
      -> CURRENT_DATE;

И вот результат:

  +----------------------------+---------------------+
  | user()                    | current_date |
  +----------------------------+---------------------+
  | ODBC@localhost | 2004-01-25   |
  +----------------------------+---------------------+
  1 row in set (0.00 sec)

Заметьте, что после того, как мы перешли на новую строку, метка командной строки изменилась с mysql> на ->. Таким образом mysql показывает, что завершенного запроса не получено и она ожидает конца запроса. Эта метка весьма полезна, так как позволяет избежать некоторых ошибок. К примеру, если вы забудете поставить точку с запятой в конце запроса, mysql сообщит вам об этом, выведя метку ->:

  mysql> select user()
      ->

В завершение этого раздела, продемонстрируем, как можно использовать MySQL в качестве простого калькулятора, введя, к примеру, такой запрос:

  mysql> select cos(pi()/10), (2*5)-5;


Язык SQL

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

Взаимодействие PHP и MySQL
Предыдущая Следующая

Язык SQL

Структурированный язык запросов SQL позволяет производить различные операции с базами данных: создавать таблицы, помещать, обновлять и удалять из них данные, производить запросы из таблиц и т.д. Далее мы последовательно рассмотрим все эти операторы.

Замечание

Не смотря на то, что последний стандарт SQL принят в 1992 году, на сегодняшний день нет ни одной базы данных, где бы он полностью выполнялся. Более того, в различных базах данных часть операций осуществляется по-разному. Мы будем придерживаться диалекта SQL характерного для СУБД MySQL поэтому не все запросы могут выполняться для других баз данных.


Команды SQL

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

    Введение

    Реляционные базы данных

    Индексы

    Первичные ключи

    Задать первичный ключ

    Нормализация базы данных

    Работа с сервером MySQL

    Язык SQL

    Команды языка SQL

Продолжение следует

Взаимодействие PHP и MySQL
Предыдущая

Команды SQL

create database
use
create table
describe
alter table
drop table
drop database
insert into…values
delete
select
update
show

В этом разделе мы изучим основные команды языка SQL. Для этого на компьютере с установленным MySQL необходимо запустить клиента mysql, в окне которого можно вводить команды SQL.

Примечание

Команды SQL не чувствительны к регистру, но традиционно они набираются прописными буквами.

Типы полей базы данных

Список наиболее часто встречающихся типов приведен в таблицах 13.6 - 13.8. Для многих типов данных задается максимальная ширина отображения, указываемая в скобках, которую мы далее будем обозначать символом max. К примеру, запись INT(2) означает, что значение данного поля не может превышать 100.

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

Таблица 13.6. Числовые типы

Тип | Описание
TINYINT[(max)] | Очень маленькие целые числа диапазона -127…128.
SMALLINT[(max)] | Маленькие целые числа диапазона -32768…32767.
MEDIUMINT[(max)] | Средние целые числа.
INT[(max)] | Обычные целые числа.
FLOAT[(max,P)] | Числа с плавающей точкой одинарной точности.
DOUBLE[(max,P)] | Числа с плавающей точкой двойной точности.
DECIMAL[(max,P)] | Числа с плавающей точкой, приведенные к типу char.

Типы даты и времени приведены в таблице 13.7.

Таблица 13.7. Типы даты и времени

Тип | Описание
DATE | Дата в формате ГГГГ-ММ-ДД.
TIME | Время в формате ЧЧ-ММ-СС.
DATETIME | Дата и время в формате ГГГГ-ММ-ДД ЧЧ-ММ-СС.
YEAR | Год в формате ГГ или ГГГГ.
TIMESTAMP | Метка времени для отсчетов по транзакциям в формате ГГГГ-ММ-ДД ЧЧ-ММ-СС.

Основные строковые типы приведены в таблице 13.8.

Таблица 13.8. Строковые типы

Тип | Описание
CHAR (len)[BINARY] | Строки с длиной len, которое не превышает 255 символов. Ключевое слово BINARY указывает на то, что данные должны обрабатываться независимо от регистра.
CHAR | Синоним CHAR(1).
VARCHAR (len)[BINARY] | Синоним CHAR(len)за исключением того, что строки могут быть произвольной длины.
TEXT | Строки с максимальной длиной символов равной 65535. Данные этого типа чувствительны к регистру.
BLOB | Двоичные строки с максимальной длиной символов равной 65535. Тип BLOB (binary large object - большой двоичный объект) предназначен для хранения двоичных данных, в том числе изображений и звуковых последовательностей.

CREATE DATABASE

Эта команда создает новую базу данных:

CREATE DATABASE db_name;

Здесь db_name является именем создаваемой базы данных. Для того чтобы создать новую базу данных forum, наберите в строке-приглашении клиента MySQL mysql> эту команду и укажите название базы данных:

mysql> CREATE DATABASE forum;

Примечание

Каждый запрос MySQL завершается точкой с запятой.

При успешном выполнении команды MySQL выдаст строку, в которой сообщается, что этот запрос выполнен успешно и показано время, затраченное на выполнение запроса:

Query OK, 1 row affected (0.02 sec)

Далее в тексте строку MySQL с результатом выполнения команды мы будем приводить непосредственно в соответствующем листинге.

Для того, чтобы убедится, что база данных forum успешно создана, можно выполнить команду SHOW DATABASES, которая покажет, какие базы данных существуют на вашем компьютере:

mysql> SHOW DATABASES;

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

Замечание

Команда SHOW DATABASES является внутренней командой MySQL, отсутствующей в стандарте SQL и неподдерживаемой другими базами данных.

Замечание

Изначально, в МуSQL присутствует только две базы данных: test и mysql. В последней хранится системный каталог, описывающий внутреннюю структуру СУБД MySQL.

USE

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

USE db_name;

Здесь db_name - название выбираемой базы данных. Выберем созданную базу forum:

mysql> CREATE DATABASE forum;
Database changed;

CREATE TABLE

Команда CREATE TABLE создает новую таблицу в выбранной базе данных и которая в простейшем случае имеет следующий синтаксис:

CREATE TABLE table_name [(create_definition, ...)]

Здесь table_name - имя создаваемой таблицы.

Создадим первую таблицу базы данных forum, которая называется authors и содержит различные данные об зарегистрированных посетителях форума: ник (name), пароль (passw), e-mail (email), Web-адрес сайта посетителя (url), номер ICQ (iсq), сведения об посетителе (about), строку содержащую путь к файлу фотографии посетителя (photo), время добавления запроса (time), последнее время посещения форума (last_time), статус посетителя - является ли он модератором, администратором или обычным посетителем (statususer). Кроме перечисленных полей в таблице имеется поле id_author, являющийся первичным ключом таблицы. SQL-запрос, создающий эту таблицу приведен в листинге:

mysql> CREATE TABLE authors (
  id_author int(6) NOT NULL auto_increment,
  name text,
  passw text,
  email text,
  url text,
  iсq text,
  about text,
  photo text,
  time datetime default NULL,
  last_time datetime default NULL,
  themes int(10) default NULL,
  statususer int(2) default NULL,
  PRIMARY KEY (id_author)
) TYPE=MyISAM;

Выполнив SQL-команду SHOW TABLES, можно убедиться, что таблица authors успешно создана

Давайте теперь аналогичным образом создадим другие таблицы.

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

Примечание

Для удобства на форуме может быть создано несколько различных разделов. К примеру, на форуме по языкам программирования для того, чтобы не смешивать темы, относящиеся к различным языкам, имеет смысл создать следующие разделы: С++, PHP, Java и т. д.

В таблице forums присутствуют следующие поля: первичный ключ (id_forum), название раздела (name), правила форума (rule), краткое описание форума (logo), порядковый номер (pos), флаг, принимающий значение 1, если форум скрытый и 0, если общедоступный (hide).

Вот SQL-запрос, создающий таблицу forums

mysql> CREATE TABLE forums (
  id_forum int(6) NOT NULL auto_increment,
  name text,
  rule text,
  logo text,
  pos int(6) default NULL,
  hide int(1) default NULL,
  PRIMARY KEY  (id_forum)
) TYPE=MyISAM;

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

mysql> CREATE TABLE themes (
  id_theme int(11) NOT NULL auto_increment,
  name text,
  author text,
  id_author int(6) default NULL,
  hide int(1) default NULL,
  time datetime default NULL,
  id_forum int(2) default NULL,
  PRIMARY KEY (id_theme)
) TYPE=MyISAM;

В таблице themes присутствуют следующие поля: первичный ключ (id_theme), название темы (name), автор темы (author), внешний ключ к таблице авторов (id_author), флаг, принимающий значение 1, если тема отмечена скрытой и 0, если отображается (hide) - это поле необходимо для модерирования, время добавления темы (time), внешний ключ к таблице форумов (id_forum), для того чтобы определить к какому разделу форума относится данная тема.

В таблице themes нормализация проведена частично, она содержит два внешних ключа: id_author и id_forum для таблиц посетителей и списка форумов, в тоже время в ней дублируется имя автора author, присутствующее также в таблице посетителей authors под именем name. Этот случай является примером денормализации предназначенной для того, чтобы не запрашивать каждый раз таблицу авторов при выводе списка тем и их авторов, чтобы обеспечить приемлемую скорость работы форума.

Создадим последнюю таблицу posts, в которой хранятся сообщения:

mysql> CREATE TABLE posts (
  id_post int(11) NOT NULL auto_increment,
  name text,
  url text,
  file text,
  author text,
  id_author int(6) default NULL,
  hide int(1) default NULL,
  time datetime default NULL,
  parent_post int(11) default NULL,
  id_theme int(11) default NULL,
  PRIMARY KEY  (id_post)
) TYPE=MyISAM;

В таблице posts присутствуют следующие поля: первичный ключ (id_post), тело сообщения (name), необязательная ссылка на ресурс, которую автор сообщения может ввести при добавлении сообщения (url), путь к файлу прикрепляемому к сообщению (file), имя автора (author), внешний ключ к таблице авторов (id_author), флаг, принимающий значение 1, если сообщение отмечено как скрытое и 0, если он отображается (hide) - это поле необходимо для модерирования, время добавления сообщения (time), сообщение ответом на которое является данное сообщение (parent_post), если это первое сообщение в теме - это поле равно 0, внешний ключ к тем (id_theme), для того чтобы определить к какой теме относится сообщение.

Убедимся, что все таблицы успешно созданы, выполнив команду SHOW TABLES.

DESCRIBE

Команда DESCRIBE показывает структуру созданных таблиц и имеет следующий синтаксис:

DESCRIBE tаble_name

Здесь tаble_name - имя таблицы структура которой запрашивается.

Замечание

Команда DESCRIBE не входит в стандарт SQL и является внутренней командой СУБД MySQL.

Давайте посмотрим, к примеру, структуру таблицы forums, выполнив следующий SQL-запрос:

mysql> DESCRIBE forums;

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

ALTER TABLE

Команда ALTER TABLE позволяет изменить структуру таблицы. Эта команда позволяет добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу. Команда имеет следующий синтаксис:

ALTER TABLE table_name alter_spec

Параметр alter_spec имеет значения, представленные в таблице

Синтаксис | Описание команды
ADD create_definition [FIRST|AFTER column_name] | Добавление нового столбца create_definition. create_definition представляет собой название нового столбца и его тип. Конструкция FIRST добавляет новый столбец перед столбцом column_name. Конструкция AFTER добавляет новый столбец после столбца column_name. Если место добавления не указано, по умолчанию столбец добавляется в конец таблицы.
ADD INDEX [index_name] (index_col_name,...) | Добавление индекса index_name для столбца index_col_name. Если имя индекса index_name не указывается, ему присваивается имя совпадающее с именем столбца index_col_name.
ADD PRIMARY KEY (index_col_name,...) | Делает столбец index_col_name или группу столбцов первичным ключом таблицы.
CHANGE old_col_name new_col_name type | Изменение столбца с именем old_col_name на столбец с именем new_col_name и типом type.
DROP col_name | Удаление столбца с именем col_name.
DROP PRIMARY KEY | Удаление первичного ключа таблицы.
DROP INDEX index_name | Удаление индекса index_name.

Добавим в таблицу forums новый столбец test, разместив его после столбца name.

mysql> ALTER TABLE forums ADD test int(10) AFTER name;

Выполнив команду DESCRIBE forums, можно увидеть, что столбец test успешно добавлен после столбца name

Давайте переименуем созданный столбец test в текстовый столбец new_test

mysql> ALTER TABLE forums CHANGE test new_test text;

Как видно из рисунка, столбец успешно переименован:

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

mysql> ALTER TABLE forums CHANGE new_test new_test int(5) not null;

Результат выполнения этого запроса приведен на рисунке:

Теперь удалим столбец new_test:

mysql> ALTER TABLE forums DROP new_test;

Как видно из рисунка, после удаления этого столбца таблица forums приобрела исходную структуру:

DROP TABLE

Команда DROP TABLE предназначена для удаления одной или нескольких таблиц:

DROP TABLE table_name [ ,table_name,...]

К примеру, для удаления таблицы forums нужно выполнить следующий SQL-запрос:

mysql> DROP TABLE forums;

DROP DATABASE

Команда DROP DATABASE удаляет базу данных со всеми таблицами входящими в её состав:

DROP DATABASE database_name

Удалим, например, базу данных forum:

mysql> DROP DATABASE forum;

INSERT INTO…VALUES

Команда INSERT…VALUES вставляет новые записи в существующую таблицу. Синтаксис команды:

INSERT INTO table_name VALUES (values,…)

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

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

mysql> INSERT INTO authors VALUES (1, 'Maks', '123', ' maks@mail.ru ',
' www.softtime.ru ', '', 'программист', '', '', '', 0, 0);
mysql> INSERT INTO authors VALUES (2, 'Igor', '123', 'igor@mail.ru',
'http://www.softtime.ru', '', 'Программист', '', '', '', 407, 0);
mysql> INSERT INTO authors VALUES (3, 'Sergey', '212', 'sergey@mail.ru',
'http://www.softtime.ru', '', 'Дизайнер', '', '', '', 408, 0);

DELETE

DELETE FROM table_name [WHERE definition]

Команда DELETE удаляет из таблицы table_name записи, удовлетворяющие заданным в definition условиям, и возвращает число удаленных записей.

Вот как можно удалить все записи из таблицы authors:

mysql> DELETE FROM authors;

Важной частью запросов DELETE, UPDATE и SELECT является оператор WHERE, который позволяет задать условия для выбора записей, на которые будут действовать эти команды. Следующий запрос удаляет из таблицы посетителя, первичный ключ для которого равен 1:

mysql> DELETE FROM authors WHERE id_author = 1;

Условия отбора могут быть значительно сложнее, так в листинге 13.16 удаляются все авторы с паролем '123' и первичный ключ которых превышает 10:

mysql> DELETE FROM authors WHERE passw = '123' AND id_author > 10;

Оператор AND является логическим "и". В запросах можно так же применять логическое или "или".

SELECT

Команда SELECT предназначена для извлечения строк данных из одной или нескольких таблиц и имеет в общем случае следующий синтаксис:

SELECT column,...
[FROM table WHERE definition]
[ORDER BY col_name [ASC | DESC], ...]
[LIMIT [offset], rows]

Здесь column - имя выбираемого столбца. Можно указать несколько столбцов через запятую. Если необходимо выбрать все столбцы можно просто указать знак звёздочки *. Ключевое слово FROM указывает таблицу table из которой извлекаются записи. Ключевое слово WHERE определяет, так же как и в операторе DELETE определяет условия отбора строк. Ключевое слово ORDER BY сортирует строки запросов по столбцу col_name в прямом (ASC) или обратном порядке (DESC). Ключевое слово LIMIT сообщает MySQL об выводе только rows запросов начиная с позиции offset.

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

mysql> INSERT INTO forums VALUES (1, 'Форум1', '', '', 1, 0);
mysql> INSERT INTO forums VALUES (2, 'Форум2', '', '', 2, 0);
mysql> INSERT INTO forums VALUES (3, 'Форум3', '', '', 3, 0);
mysql> INSERT INTO forums VALUES (4, 'Форум4', '', '', 4, 0);
mysql> INSERT INTO forums VALUES (5, 'Форум5', '', '', 5, 0);

Для того чтобы посмотреть всю таблицу forums выполняется следующий запрос:

mysql> SELECT * FROM forums;

Выбираем все столбцы из таблицы forums без ограничений. Результат показан на рисунке:

Можно выбрать не все столбцы таблицы, а лишь часть, для этого необходимо явно задать список выбираемых столбцов:

mysql> SELECT id_forum, name FROM forums;

В этом случае MySQL выведет лишь два столбца с первичным ключом id_forum и названием форума name

Оператор LIMIT используется для ограничения количества строк, возвращенных командой SELECT. К примеру:

mysql> SELECT * FROM forums LIMIT 3;

В результате этого запроса будет выведено только первые 3 записи из 5

Оператор LIMIT может также принимать два числовых аргумента, которые должны быть целыми числами. В этом случае последний аргумент задает максимальное количество возвращаемых строк, а первый сообщает MySQL начиная с какой по счёту строки производить отсчёт

mysql> SELECT * FROM forums LIMIT 1,3;

В этом случае будут возвращены строки 2, 3 и 4

Оператор WHERE применяется в команде SELECT точно так же, как и в команде DELETE. Выберем из таблицы только те записи, у которых значение id_forum больше 2:

mysql> SELECT * FROM forums WHERE id_forum > 2;

Результат показан на слудующем рисунке:

Порядок сортировки выводимых записей можно задавать при помощи оператора ORDER BY:

mysql> SELECT * FROM forums WHERE id_forum > 2 ORDER BY pos;

В этом запросе выводятся все записи со значением поля id_forum не меньше двух, которые при этом сортируются по значению поля pos. Результат такого запроса показан на рисунке:

UPDATE

UPDATE table
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE definition]
    [LIMIT rows]

Команда UPDATE обновляет столбцы таблицы table в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE, если оно присутствует, задается, какие строки подлежат обновлению. В остальных случаях обновляются все строки. Ключевое слово LIMIT позволяет ограничить число обновляемых строк.

В следующим листинге разделу форума с первичным ключом 2 устанавливается новое название (PHP) и устанавливается атрибут hide равным 1, делая форум невидимым.

UPDATE forums SET name='PHP', hide=1 WHERE id_forum=2;

SHOW

С этой командой мы уже встречались ранее, когда выполняли запросы вида show databases и show tables для получения списка баз данных и таблиц в выбранной базе данных. Рассмотрим еще несколько вариантов использования этой команды.

Вывести список всех столбцов выбранной таблицы можно при помощи следующего запроса:

mysql> SHOW FIELDS FROM authors;

Результат приведен на следующем рисунке:

Можно также отобразить информацию обо всех индексах конкретной таблицы:

mysql> SHOW INDEX FROM authors;

Выполнив команду SHOW PROCESSLIST можно увидеть список всех выполняющихся в системе запросов:

Предыдущая


Учебник PHP. Самоучитель.

УЧЕБНИК PHP
Об учебнике
Обновление

Оглавление
  1. Основы PHP

    PHP программы

    Комментарии

    Переменные PHP

    Константы

    Типы данных в РНР. Преобразование типов

    Операторы

  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует

Основы PHP
Следующая

PHP программы

Программы PHP могут выполняться двумя способами: как сценарное приложение Web-сервером и как консольные программы. Поскольку, нашей задачей является программирование web-приложений, мы преимущественно будем рассматривать первый способ.

Дело в том, что на PHP, как правило, используется сугубо для программирования приложений, связанных с Интернетом. Однако, PHP можно еще использовать в качестве интерпретатора командной строки, в основном в *nix-системах. Последнее возможно при помощи CORBA и COM интерфейсов, а также при помощи расширения PHP-GTK. При таком использовании PHP возможно решение следующих задач:
  • создание приложений интерактивной командной строки;
  • создание кросс-платформенных GUI приложений при помощи библиотеки PHP-GTK;
  • автоматизация некоторых задач под Windows и Linux

Рассмотрим процесс выполнения php-сценария при обращении броузера к серверу. Итак, вначале броузер запрашивает страницу с расширением .php, после чего web-сервер пропускает программу через машину PHP и выдаёт результат в виде html-кода. Причем, если взять стандартную страницу HTML, изменить расширение на .php и пропустить её через машину PHP, последняя просто перешлёт её пользователю без изменений. Чтобы включить в этот файл команды PHP, необходимо заключить команды PHP в специальные теги, которых различают 4 вида (они эквивалентны и можно использовать любые):

  1. Инструкция обработки XML:
    <?php
    ...
?>
  2. Инструкция обработки SGML:
    <?
    ...
?>
  3. Инструкция обработки сценариев HTML:
    <script language = "php">
    ...
</script>
  4. Инструкция в стиле ASP:
    <%
    ...
%>

Мы будем придерживаться стиля XML или SGML.

Вообще говоря, внутри какого-либо блока кода можно выйти из PHP, при условии, что дальше мы войдем в него снова и закончим код (Подробнее об этом смотрите в гл.2.). Т.е., возможна следующая конструкция:

<?
   if(5<3){
   echo("<p>Hello, world!<p>");
?>
   <p>Hello!</p>
   // эта строка не интерпретируется как код PHP
   // и выводится только если  блок кода выполняется
<?
      echo("<p>Hello, world!<p>");
   }
?>

Команда echo в PHP применяется для вывода фактически всего, что встречается на web-страницах (текст, разметку HTML, числа). Смысл ее действия, мы думаем, понятен из приведенного примера.

Следующая