Добро пожаловать!
Здесь вы можете найти ответ на интересующий вас вопрос в отрасли сайтостроения, познакомится ближе с web технологиями и web стандартами.

PHP и MySQL

Глава 1.Основы PHP

1.1. PHP программы

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

Рассмотрим процесс выполнения 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.). Т.е., возможна следующая конструкция:

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

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

1.2. Комментарии

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

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

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

<?php
  
echo( "<p>Hello</p>" ); // нормальный комментарий

  // а вот этот комментарий отобразиться броузером
?>
<!-- 
Комментарий HTML. Будет виден в исходном
коде HTML, но не в браузере
-->

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

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

1.3. Переменные

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

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

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

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

После того, как запрос клиента проанализирован веб-сервером и передан РНР машине, последняя устанавливает ряд переменных, которые содержат данные, относящиеся к запросу и доступны все время его выполнения. Сначала РНР берет переменные окружения Вашей системы и создает переменные с теми же именами и значениями в окружении сценария РНР для того чтобы сценариям, расположенным на сервере были доступны особенности системы клиента. Эти переменные помещаются в ассоциативный массив $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"/>
</form>

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

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

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

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

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

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

1.4. Константы

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

define( CONSTANT, value )

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

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

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

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

<?php
  define
CONSTANT"Hello" );
  if( 
defined"CONSTANT" ) ) // Обратите внимание на наличие кавычек
  
{
    echo 
CONSTANT;
  }
?>

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

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

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

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

<?php
  $var1 
"5";
  
$var2 5;
  echo( 
gettype$var1 ) );
  echo 
"<br/>";
  echo ( 
gettype$var2 ) );
?>

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

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

<?php
  $var 
"5";
  echo( 
gettype$var ) );
  
settype$varinteger );
  echo 
"<br/>";
  echo( 
gettype$var ) );
?>

Выполнение этого фрагмента кода приведет к тому, что РНР вернет integer.

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

$var = (int)$var;

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

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

1.6. Операторы

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

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

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

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

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

Пример:

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

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

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

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 )
    echo 
"<p>Условие: true (один из флагов истин)</p>"
  else
    echo 
"<p>Условие: false (оба флага ложны)</p>"
?>

Опять получаем:

Условие: 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>";
  }
?>