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

Сегодня я хочу опять чуть-чуть отклониться от "курса партии" и поговорить о конструкциях. Но уже не SQL, а самого PHP. Это поможет вам легче читать листинги программ, а я смогу писать более лаконично последующие функции, не боясь, что вы меня не поймете.

Не пугайтесь, это совсем не значит, что я собираюсь дальше писать все сложно и туманно. Нет, ничего подобного. Просто хочу, чтобы у вас появилось понимание того, что PHP -- не Бейсик, где можно писать только так, как можно писать. И никак иначе. Здорово сказал, сам-то понял, что написал, Курепин?! Понял, понял...

Знакомьтесь -- точка.

Точку "." вы уже знаете, она объединяет строки. Плюс "+" -- складывает цифры, а точка объединяет строки.
$a1="100";
$a2="200"
Что будет, если сложить $a1 и $a2 ? А это как сложить...
$a1+$a2=300
$a1.$a2="100200"
...и никогда об этом не забывайте.

А вот как еще можно записать сложение.

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

$this->string_about_letters = $this->string_about_letters."несколько букв..."; $this->string_about_letters = $this->string_about_letters." еще несколько букв..."; $this->string_about_letters = $this->string_about_letters." и еще несколько букв..."; $this->string_about_letters = $this->string_about_letters." снова несколько букв...";
Несколько длинновато, не так ли? Мешает повторение длинной переменной $this->string_about_letters . Поэтому, запись сделаем иначе:
$this->string_about_letters .= "несколько букв..."; $this->string_about_letters .= " еще несколько букв..."; $this->string_about_letters .= " и еще несколько букв..."; $this->string_about_letters .= " снова несколько букв...";
Удобнее, не так ли?

Тоже самое, касается и математического сложения:
$abc+=1;
Прибавить 1 к содержимому переменной $abc .

А как еще можно прибавить единицу? Обычно, по С-шному:

$abc++; или ++$abc;

Два этих выражение обычно используются в циклических конструкциях. И не сами по себе, а в каком-то более сложном выражении.
Отличие же этих двух выражений состоит в том, что в первом случае значение переменной учитывается в выражении, а затем уже производится прибавление единицы, а во втором все наоборот -- сначала происходит увеличение значения переменной, а затем уже получившееся значение используется в выражении. На примере станет понятно:
$a=1;
echo $a++;
echo ++$a;
Первое echo распечатает нам "1", а второе распечатает?.. а вот не правильно! Не 2 оно распечатает, а "3". Почему? Догадайтесь сами.

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

Речь идет, конечно же, о получении данных посредством select -а.

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

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

Вот, можно было бы оформить процедуру так (во многих учебниках вы и найдете нечто похожее):

$this->sql_query="select * from film where f_date between "2000-01-01 00:00:00" and "2000-12-31 23:59:59 order by f_id""; $this->sql_execute(); $str=""; $row_count=mysql_num_rows($this->sql_res); for($i=0;$isql_res); $str=$str."\n"; } $str=$str."
".$film["f_id"]." ".$film["f_name"]."
";
Поясняю.

Мы делаем запрос в базу (кстати, обратите внимание на новое для нас условие в запросе: between date and date , такая форма часто используется для указания диапазона дат).

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

Затем мы открываем цикл с количеством повторений, равным количеству полученных строк из запроса.

В теле цикла мы вынимаем из нашего запроса очередную строку в переменную-массив $film . Функция mysql_fetch_array раскладывает данные в ассоциативный массив , используя в качестве ключей имена полей из таблицы.


    Ассоциативный массив -- это тоже самое, что и обычный (нумерованный) массив, только в качестве имен для ячеек используются не цифры, а цепочки символов. И обращаться к ячейкам такого массива следует соответствующе: $abc["first"], $abc["mama"]...
Далее мы приплюсовываем к нашей текстовой переменной очередную строку таблицы, используя полученные из базы данные. Для обращения к данным, как вы видите, используются названия полей таблицы. Это свойство функции mysql_fetch_array, как я уже сказал.

    Обратите особое внимание: обращаться к ячейкам ассоциативных массивов в текстовых строках нельзя! Надо обязательно разрывать строку и "вклеивать" значения при помощи точек(.), как показано.
Цикл повторяется нужное количество раз, после чего мы замыкаем $str последним html-тэгом. Готово.

Но не слишком ли это все громоздко? По-моему, очень даже. Предлагаю записать это все иначе: все тоже самое, но короче.

В PHP доступны все основные математические операции. В качестве операндов можно использовать как целые, так и вещественные числа.

В таблице приведен список арифметических операторов :
Оператор Знак Описание
Сложение + Сложение двух значений
Вычитание - Вычитание одного значения из другого
Умножение * Перемножение двух значений
Деление / Деление одного значения на другое
Получение остатка от деления % Деление одного значения на другое и возвращение остатка (деление по модулю)
Инкремент ++ Сокращенная запись увеличения числа на единицу
Декремент -- Сокращенная запись уменьшения числа на единицу
Унарное отрицание - Превращение положительного числа в отрицательное или отрицательного в положительное

Операторы вычитания, умножения, деления, деления по модулю и сложения

Операторы вычитания, умножения, деления, деления по модулю и сложения используется точно так же, как и в математике. Здесь стоит уделить внимание операторам деления и деления по модулю.

Оператор деления (" / ") возвращает число с плавающей точкой, кроме случая, когда оба значения являются целыми числами (или строками, которые преобразуются в целые числа), которые делятся нацело - в этом случае возвращается целое значение.

result2 = $result2
"; echo "result3 = $result3
result4 = $result4"; ?>

При делении по модулю операнды преобразуются в целые числа (c удалением дробной части) до начала операции. Результат операции остатка от деления % будет иметь тот же знак, что и делимое:

Унарное отрицание

Оператор унарного отрицания обозначается знаком " - ", он изменяет значение своего единственного операнда на противоположное:

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

Инкремент

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

Префиксная форма инкремента

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

Постфиксная форма инкремента

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

Декремент

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

Операции с переменными PHP (операторы)

Для осуществления существуют различные группы.

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

Арифметические операции в PHP

Помните школьные основы арифметики? Описанные ниже операторы работают так же.

Операция деления ("/") всегда возвращает вещественный тип, даже если оба значения были целочисленными (или строками, которые преобразуются в целые числа). В противном случае результат будет дробным.

Операция вычисления остатка от деления "% " работает только с целыми числами, так что применение ее к дробным может привести к нежелательному результату.

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

Операции инкремента и декремента

PHP, аналогично C, поддерживает префиксные и постфиксные операторы инкремента и декремента.

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

Как и в языке Си, эти операторы увеличивают или уменьшают значение переменной, а в выражении возвращают значение переменной $a до изменения. Например:

$a=10;
$b=$a++;
echo "a=$a, b=$b"; // Выводит a=11, b=10

Как видите, сначала переменной $b присвоилось значение переменной $a , а уж затем последняя была инкрементирована. Впрочем, выражение, значение которого присваивается переменной $b , может быть и сложнее - в любом случае, инкремент $a произойдет только после его вычисления.

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

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

$a=10;
$b=--$a;
echo "a=$a, b=$b"; // Выводит a=9, b=9

Операции инкремента и декремента на практике применяются очень часто. Например, они встречаются практически в любом цикле for .

echo "

Постфиксный инкремент

" ;
$a = 5 ;
echo "Должно быть 5: " . $a ++ . "
\n" ;

\n" ;

Echo "

Префиксный инкремент

" ;
$a = 5 ;
echo "Должно быть 6: " . ++ $a . "
\n" ;
echo "Должно быть 6: " . $a . "
\n" ;

Echo "

Постфиксный декремент

" ;
$a = 5 ;
echo "Должно быть 5: " . $a -- . "
\n" ;

\n" ;

Echo "

Префиксный декремент

" ;
$a = 5 ;
echo "Должно быть 4: " . -- $a . "
\n" ;
echo "Должно быть 4: " . $a . "
\n" ;
?>

Строковые операции

В PHP есть два оператора для работы со строками. Первый - оператор конкатенации ("."), который возвращает объединение левого и правого аргумента. Второй - оператор присвоения с конкатенацией, который присоединяет правый аргумент к левому. Приведем конкретный пример:

$a = "Hello " ;
$b = $a . "World!" ; // $b содержит строку "Hello World!"

$a = "Hello " ;
$a .= "World!" ; // $a содержит строку "Hello World!"
?>

Побитовые операции

Эти операции предназначены для работы (установки/снятия/проверки) групп битов в целой переменной. Биты целого числа - это не что иное, как отдельные разряды того же самого числа, записанного в двоичной системе счисления. Например, в двоичной системе число 12 будет выглядеть как 1100, а 2 - как 10, так что выражение 12|2 вернет нам число 14 (1110 в двоичной записи). Если переменная не целая, то она вна-
чале округляется, а уж затем к ней применяются перечисленные ниже операторы.

Для представления одного числа используются 32 бита:

  • 0000 0000 0000 0000 0000 0000 0000 0000 - это ноль;
  • 0000 0000 0000 0000 0000 0000 0000 0001 - это 1;
  • 0000 0000 0000 0000 0000 0000 0000 0010 - это 2;
  • 0000 0000 0000 0000 0000 0000 0000 0011 - это 3;
  • 0000 0000 0000 0000 0000 0000 0000 0100 - это 4;
  • 0000 0000 0000 0000 0000 0000 0000 0101 - это 5;
  • 0000 0000 0000 0000 0000 0000 0000 1111 - это 15;

Побитовые операторы:

Пример Название Результат
$a & $b Побитовое "и" Устанавливаются только те биты, которые установлены и в $a, и в $b.
$a | $b Побитовое "или" Устанавливаются те биты, которые установлены либо в $a, либо в $b.
$a ^ $b Исключающее или Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b
~ $a Отрицание Устанавливаются те биты, которые в $a не установлены, и наоборот.
$a << $b Сдвиг влево Все биты переменной $a сдвигаються на $b позиций влево (каждая позиция подразумевает "умножение на 2")
$a >> $b Сдвиг вправо Все биты переменной $a сдвигаються на $b позиций вправо (каждая позиция подразумевает "деление на 2")

Операции сравнения

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

Это в своем роде уникальные операции, потому что независимо от типов своих аргументов они всегда возвращают одно из двух: false или true . Операции сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true , а если нет - false .

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

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

Операторы сравнения:

Пример Название Результат
$a == $b Равно TRUE если $a равно $b.
$a === $b Тождественно равно TRUE если $a равно $b и имеет тот же тип. (Добавлено в PHP 4)
$a != $b Не равно TRUE если $a не равно $b.
$a <> $b Не равно TRUE если $a не равно $b.
$a !== $b Тождественно не равно TRUE если $a не равно $b или в случае, если они разных типов (Добавлено в PHP 4)
$a < $b Меньше TRUE если $a строго меньше $b.
$a > $b Больше TRUE если $a строго больше $b.
$a <= $b Меньше или равно TRUE если $a is меньше или равно $b.
$a >= $b Больше или равно TRUE если $a больше или равно $b.

Логические операции

Логические операторы предназначены исключительно для работы с логическими выражениями и также возвращают false или true .

Приведем таблицу логических операторов PHP:

Следует заметить, что вычисление логических выражений, содержащих такие операторы, идет всегда слева направо, при этом, если результат уже очевиден (например, false&&что-то всегда дает false ), то вычисления обрываются, даже если в выражении присутствуют вызовы функций. Например, в операторе $logic = 0&&(time()>100); стандартная функция time() никогда не будет вызвана.

Будьте осторожны с логическими операциями - не забывайте про удваивание символа. Обратите внимание, что, например, | и || - два совершенно разных оператора, один из которых может потенциально возвращать любое число, а второй - только false и true .

Операторы инкремента (++) и декремента (--) не работают с логическими переменными.

Операторы эквивалентности

В PHP, начиная с PHP4 есть оператор тождественного сравнения - тройной знак равенства === ,
или оператор проверки на. PHP довольно терпимо относится к тому, что строки неявно преобразуются в числа, и наоборот.
Например, следующий код выведет, что значения переменных равны:

$a=10;
$b="10";

И это несмотря на то, что переменная $a представляет собой число, а $b - строку. Пеперь рассмотрим несколько другой пример:

$a=0; // ноль
$b=""; // пустая строка
if($a==$b) echo "a и b равны"; // Выводит "a и b равны"

Хотя $a и $b явно не равны даже в обычном понимании этого слова, скрипт заявит, что они совпадают. Почему так происходит? Дело в том, что если один из операндов логического оператора может трактоваться как число, то оба операнда трактуются как числа. При этом пустая строка превращается в 0 , который затем и сравнивается с нулем. Неудивительно, что оператор echo срабатывает.
Проблему решает оператор эквивалентности === (тройное равенство). Он не только сравнивает два выражения, но также их типы. Перепишем наш пример с использованием этого оператора.