|  Раздел 1. Основы языка программирования PHP
 Как было отмечено ранее, PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста») — скриптовый язык программирования общего назначения, интенсивно применяющийся для разработки WEB-приложений, в том числе взаимодействующих с СУБД.
 
 В отличие, в частности, от сценариев JavaScript и VBScript, выполняемых на стороне «клиента», PHP сценарии выполняются на стороне «сервера» и позволяют работать с различными СУБД, например MS SQL Server, Oracle, серверной файловой системой, почтовыми сервисами и др.
 
 Обратите внимание. Для работы с PHP (ASP, JSP и др.) (в отличие от JavaScript) нужен установленный и специально настроенный WEB-сервер, например, Internet Information Server (IIS). К примеру, если у Вас установлена операционная система Windows XP/Vista и т.п., то Вы можете скачать дистрибутив PHP c сайта: www.php.net (например, для пятой версии: http://ru.php.net/get/php-5.2.12-Win32.zip/from/a/mirror).
 
 Обратите внимание. PHP является свободно распространяемым продуктом, класса Open Source (открытого исходного кода).
 
 Отметим, что файл, использующий PHP-сценарии, должен, как правило, иметь расширение «*.php».
 
 
  1.1 Введение в PHP
 Следующий код
 
 
 Дает
 
 Hello, World!
 
 Имена переменных обозначаются знаком $. То же самое "Hello, World!" можно получить следующим образом:
 
 $message = "Hello, World!";
 
 echo($message);
 
 ?>
 Конкатенация (присоединение) строк осуществляется с помощью . (точки); обычные арифметические операции определяются так, как Вы того и ожидаете:
 
 $greeting = "Hello ";
 
 $num = 3 + 2;
 
 $num++;
 
 echo ("$greeting.$num.”people!“);
 
 ?>
 даст Hello 6 people!
 Обратите внимание. Синтаксис PHP очень похож на C.
 
 Cтрока, заключенная в двойные кавычки, означает, что встречающиеся в этой строке переменные будут заменены их значениями, в то время как если строка заключена в одинарные кавычки, такая замена не производится. Так
 
 $name = 'Susannah';
 
 $greeting_1 = "Hello, $name!";
 
 $greeting_2 = 'Hello, $name!';
 
 echo "$greeting_1\n";
 
 echo "$greeting_2\n";
 
 ?>
 даст
 
 Hello, Susannah!
 
 Hello, $name!
 Обратите внимание на то, что \n в строке означает переход к новой строке, совсем как в Perl или в C. Однако это работает только в тех строках, которые взяты в двойные кавычки.
 
 PHP обеспечивает доступ к переменным окружения как к регулярным переменным. Например, при нажатии на кнопку формы инициируется передача данных формы методом GET или POST
 
 Такой сценарий:
 
 
 $action = $_REQUEST[‘sbt']; // Можно также использовать $_POST[‘sbt'];
 
 echo($action);
 
 ?>
 
 Даст результат:
 
 Вход
 
 после нажатия на кнопку «Вход»
 
 
 
 
 
  
 
 Очевидное достоинство PHP в том, что Вам не надо заботиться о получении, раскодировании и любой другой обработке данных из формы, как например при написании CGI программы на языке C/C++. За нас все делает PHP. Очень легко и красиво он автоматически заполняет несколько встроенных массивов:
 
 $_SERVER ($HTTP_SERVER_VARS) - для серверных переменных;
 
 $_ENV ($HTTP_ENV_VARS) - для переменных среды, в которой работает PHP;
 
 $_COOKIE ($HTTP_COOKIE_VARS) - для переменных передающихся посредством cookies;
 
 $_GET ($HTTP_GET_VARS) - для параметров формы, переданных посредством метода GET;
 
 $_POST ($HTTP_POST_VARS) - для параметров формы, переданных методом POST;
 
 $_FILES ($HTTP_POST_FILES) - для закачиваемых посредством метода POST файлов;
 
 $_REQUEST - массив содержащий внутри себя массивы $_GET, $_POST и $_COOKIE;
 
 $_SESSION ($HTTP_SESSION_VARS) - для хранения параметров сессии.
 
 Используя $_REQUEST, Вы получаете доступ к данным формы. Можете сохранить эти данные в Базе Данных и т.д.
 
  1.2 Установка интерпретатора PHP
 Шаг 1. Распакуйте дистрибутив в папку C:\PHP
 
 Шаг 2. Настройте Internet Information Server на своем локальном компьютере, так чтобы выполнялась обработка файлов с расширением *.php. Для этого нужно зайти в Панель управления Windows, далее – Администрирование, далее - Диспетчер служб IIS. Затем нужно добавить обработку php-сценариев фильтром ISAPI для всех узлов по умолчанию с помощью вкладки «Фильтры ISAPI» (рис. 1)
 
  
 Рис. 1. Добавление фильтра ISAPI для обработки PHP-сценариев.
 Отметим, что Internet Server Application Programming Interface (ISAPI) — это API (Application Programming Interface - набор готовых классов, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах.) для Internet Information Services, коллекции сетевых служб Microsoft Windows. Соответственно, фильтры ISAPI представляют собой динамические библиотеки DLL, напрямую взаимодействующие с IIS.
 
 Далее, нужно добавить «Сопоставление сценария PHP с исполняемым файлом ISAPI-фильтра (php5isapi.dll). Это можно сделать в разделе «Сопоставление обработчиков» системы администрирования IIS (рис. 2).
 
  
  Рис. 2. Настройка «Сопоставления обработчиков» IIS для PHP.
 Обратите внимание. Для различных версий ОС Windows, интерфейс Диспетчера служб IIS также будет различным. К примеру, в для Windows XP добавление фильтра ISAPI для PHP имеет вид рис. 3.
 
 
  Рис. 3. Добавление фильтра ISAPI для обработки PHP-сценариев в для IIS 6.0 ОС Windows XP.
 Шаг 3. Скопируйте php5ts.dll из дистрибутива в папку C:\Windows\system32
 Шаг 4. Убедитесь, что PHP работает под управлением Вашего IIS. Для этого создайте файл test.php в папке IIS (C:\Inetpub\wwwroot) c таким кодом:
 
 phpinfo();
 
 ?>
 
 
 Должен быть получен вот такой результат
 
  
  
 
 Рис. 4. Оценка корректности установки и конфигурирования PHP.
 Обратите внимание на параметр Loaded Configuration File. К примеру, в нашем случае он имеет следующее значение: «C:\Program Files\PHP\php.ini». Это означает, что кофигурационный файл, с помощью которого Вы можете переопределять параметры PHP модуля, находится в папке «C:\Program Files\PHP), и загружен успешно.
 Шаг5. Сконфигурируйте файл php.ini под Ваши задачи.
 
  Рис. 5. Конфигурирование PHP под собственные задачи.
 
 
  1.3 Полезные конструкции на PHP
 include("login.php"); //Вставка файла login.php в текущий файл
 
 
 //Здесь произвольный HTML код
 
 //Данный блок кода будет выполнятся, только если переменная $action примет значение «Вход», т.е. если Пользователь нажмет на кнопку «Вход
 
 ……………………………………
 
 
 //Функция isset позволяет проверить установлено ли значение переменной $action
 if(!isset($action))
 
 $action="";
 
 Простейший способ установить cookie на PHP таков:
 
 setcookie('name', 'bret');
 Затем, для каждой последующей страницы на Вашем сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт) переменная $name будет иметь значение 'bret' и его можно легко прочитать средствами PHP. Этот тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.
 
 С помощью cookie можно создать, в частности, «Корзину покупок» для Интернет-магазина или запомнить «профиль» пользователя. Если Вы хотите, чтобы значение cookie запоминалось браузером после того, как пользователь закончит сессию, Вы должны передать функции setcookie() третий параметр - дату истечения срока действия cookie. Поскольку PHP сформировался в основном в среде Unix, Вы должны представить время истечения срока действия cookie как число секунд, прошедших с 1 января 1970 г.
 
 Например, если Вы хотите, чтобы срок действия cookie истек 1 января 2000 г., Вы записываете:
 
 
 $y2k = mktime(0,0,0,1,1,2000);
 
 setcookie('name', 'bret', $y2k); ?>
 Удаление cookie
 
 
 Обратите внимание. В силу того, как организована обработка cookies в протоколе HTTP, необходимо установить значения всех cookie до вывода какого-либо текста. Если сделать наоборот, PHP выдаст Вам предупреждение и значение cookie не будет послано. Вот так правильно:
 
 setcookie('name', 'jeff');
 
 echo "Hello Everyone!";
 
 ?>
 Создать массив можно также путем вызова функции array():
 
 $fruit = array();
 
 $favorites = array();
 
 или так
 
 $fruit = array('banana','papaya'); //Создается массив из 2-х элементов 'banana‘ и 'papaya'
 Индексы массивов (как обычных, так и ассоциативных) задаются в квадратных скобках ([ и ]):
 
 $fruit[0] = 'banana';
 
 $fruit[1] = 'papaya';
 
 $favorites['animal'] = 'turtle';
 
 $favorites['monster'] = 'cookie';
 
 
  1.4 Управляющие структуры PHPВы можете использовать операторы цикла, такие как for и while. В результате выполнения оператора:
 
 for ($i = 4; $i < 8; $i++) {
 
 print "I have eaten $i bagels today.\n";
 
 }
 
 Получим:
 
 I have eaten 4 bagels today.
 
 I have eaten 5 bagels today.
 
 I have eaten 6 bagels today.
 
 I have eaten 7 bagels today.
 
 Тот же самый результат даст
 
 $i = 4;
 
 while ($i < 8) {
 
 print "I have eaten $i bagels today.\n";
 
 $i++; }
 Вы можете также использовать конструкции с if и elseif:
 
 if ($user_count > 200) {
 
 print "Сайт сейчас перегружен!";
 
 }
 
 elseif ($user_count > 100) {
 
 print "Сайт активно используется!";
 
 else {
 
 print "Сайт свободен - подключились только $user_count пользователей.";
 
 }
 Вы можете использовать конструкции с switch, do...while.
 
 switch($kv1) // Оцениваем значение переменной $kv1
 
 {
 
 case 1:
 
 { $ms1="01";
 
 break;}
 
 case 2:
 
 { $ms1="04";
 
 break;}
 
 }
 
  1.5 Работа с файловой системойПример обработки файла CSV (с данными разделямыми точкой с запятой).
 
 $fp = file("baza/data.txt"); //Открываем файл data.txt
 
 $pat =";"; // Определяем разделитель данных в файле “;”
 for($i = 0; $i < count($fp); $i++){
 
 $arr = split($pat, $fp[$i]); // Формируем массив значений $arr из данных файла
 
 }
 Различные функции по работе с файлами:
 
 fread($f, $numberbytes) - читает из файла $f $numberbytes символов и возвращает строку этих символов.
 
 fwrite($f, $st); - записывает в файл $f содержимое строки $st. .
 
 fgets($f, $dlina); - считывает из файла одну строку, заканчивающеюся символом новой строки \n.
 
 fputs($f, $st); - аналогична функции fwrite().
 
 Конструкция or die().
 
 Проанализировать результат функции fopen() и если он не равен false, вывести работу сценария позволяет конструкция or die ($err_message). Синтаксис данной конструкции следующий:
 
 ($f=fopen("/homa/user/file.txt","r")) or die ("error");
 
 
  1.6 Базы данных и PHPПример 1. Создание соединения и выбор СУБД для MySQL
 
 /* Некоторые переменные */
 $hostname = "localhost";
 $username = "myusername";
 $password = "mypassword";
 $dbName = "products";
 /* создать соединение */
 MYSQL_CONNECT($hostname,$username,$password) OR DIE("Не могу создать соединение ");
 mysql_select_db("$dbName");
 
 /* Осуществляем определенные операции с СУБД */
 
 /* Закрыть соединение */
 MYSQL_CLOSE();
 
 ?>
 Обратите внимание. Для работы с MySQL из PHP нет необходимости в каких либо дополнительных модулях. MySQL «родная» СУБД для PHP.
 Пример 2. Создание соединения и выбор базы данных для MS SQL Server.
 
 /* Некоторые переменные */
 $hostname = "localhost";
 $username = "myusername";
 $password = "mypassword";
 $dbName = "products";
 
 /* создать соединение */
 $link = MSSQL_CONNECT($hostname,$username,$password) or die ("Не могу создать соединение ");
 Mssql_select_db ("$dbName“, $link);
 
 /* Осуществляем определенные операции с СУБД */
 
 /* Закрыть соединение */
 MSSQL_CLOSE();
 
 ?>
 
 Обратите внимание. Для работы с MS SQL Server из PHP (и другими СУБД кроме MySQL), необходимо подключить специальный модуль, соответствующий данной СУБД. Данная операция осуществляется в файле php.ini, посредством удаления знака «;» в соответсвующей строке файла, т.е.
 
 Фрагмент файла php.ini:
 
 [PHP_MSSQL] (extension=php_mssql.dll)
 Обратите внимание, что если Вы используется в качестве сервера хорошо известную платформу MS SQL Server Express Edition, то строка соединения с базой данных «TEST» (в режиме аутоинтификации SQL Server, т.е. по логину «sa») будет иметь следующий вид:
 
 
 $link = mssql_connect (".\SQLEXPRESS","sa","") or die ("Could not connect");
 
 Mssql_select_db("TEST", $link);
 
 ?>
 Обратите внимание на имя сервера СУБД ".\SQLEXPRESS".
 
 Пример 3. Создание новой таблицы в MS SQL с помощью PHP
 
 
 $link = mssql_connect (“127.0.0.1”,"sa","") or die ("Could not connect");
 
 Mssql_select_db("GRAF", $link);
 $strSQL = "CREATE TABLE scenar( // Таблица со значением результатов прогноза
 
 data1 datetime,
 
 nomer_sc INTEGER,
 
 E decimal (20,2),
 
 O decimal (20,2),
 
 GT decimal (20,2),
 
 TR decimal (20,2),
 
 P decimal (20,2),
 
 Y decimal (20,2),
 
 M decimal (20,2),
 
 N decimal (20,2),
 
 X decimal (20,2),
 
 CO decimal (20,2)
 
 )";
 
 $roma10 = mssql_query($strSQL);
 
 if($roma10 ==1)
 
 echo("Таблица scenar создана успешно
 ");
 
 ?>
 Пример 4. Заполнение таблицы в MS SQL с помощью PHP данными из файла
 
 
 $link = mssql_connect (“127.0.0.1”,"sa","") or die ("Could not connect");
 
 Mssql_select_db("GRAF", $link);
 
 $fp = file("baza/data2.txt"); // В файле data2.txt находятся исходные данные
 $strSQL = "delete from scenar";
 
 $roma = mssql_query($strSQL); // Удаляем предыдущие данные
 for($i = 0; $i < count($fp); $i++){
 
 $pat =";";
 
 $arr = split($pat, $fp[$i]); // Разбиваем текущую строку файла на массив значений по “;”
 
 $strSQL ="SET DATEFORMAT dmy"; //День-месяц-год
 
 $roma = mssql_query($strSQL);
 
 $strSQL = "insert into scenar(data1, nomer_sc, E, O, GT, TR, P, Y, M, N, X, CO)
 
 values('$arr[0]',$arr[1] , $arr[2], $arr[3], $arr[4],$arr[5] , $arr[6], $arr[7], $arr[8],$arr[9] , $arr[10], $arr[11])";
 
 $roma = mssql_query($strSQL); //Выполняем команду вставки записей
 
 }
 
 ?>
 Фрагмент файла data2.txt
 
 01.07.2001;1;29.33;25.89;175.98;82.124;102.2;2193.884;12.7;1088.143;28.3;926.828;
 
 01.07.2001;2;29.33;25.89;205.31;46.928;102.2;2229.08;12.6;1132.138;26.6;941.493;
 
 01.07.2001;3;29.33;25.89;190.645;64.526;102.2;2193.45;12.6;1097.1;27.5;927.7;
 
 01.07.2001;4;29.33;25.89;284.501;87.99;102.2;2190.951;12.7;1173.2;28.6;941.493;
 
 01.10.2001;1;31;15;305;105;102.83;2543.18;13.45;1378.74;29.44;1091.46
 Обратите внимание. Если файл с данными большой (например, имеет тысячи записей и более), то лучше использовать массовую загрузку данных в MS SQL Server командой BULK INSERT. Это будет намного быстрее.
 Пример 5. Выполнение запроса к базе по заданному критерию
 
 
 $link = mssql_connect (“127.0.0.1”,"sa","") or die ("Could not connect");
 
 Mssql_select_db("GRAF", $link);
 
 $strSQL1 = "select * from scenar where nomer_sc=1 AND data1 >= ‘2008-01-01’";
 
 $zapr1=mssql_query($strSQL1);
 
 $idx=1;
 
 while($r1 = mssql_fetch_array($zapr1))
 
 {
 
 $E_1[$idx] = $r1["E"]; // Считываем значения переменных из Базы в массивы переменных
 
 $O_1[$idx] = $r1["O"];
 
 $GT_1[$idx] = $r1["GT"];
 
 $TR_1[$idx] = $r1["TR"];
 
 $P_1[$idx] = $r1["P"];
 
 $Y_1[$idx] = $r1["Y"];
 
 $M_1[$idx] = $r1["M"];
 
 $N_1[$idx] = $r1["N"];
 
 $X_1[$idx] = $r1["X"];
 
 $CO_1[$idx] = $r1["CO"];
 
 $idx++;
 
 }
 
 // Осуществляем различные манипуляции с массивами переменных $E_1[$idx] и др.
 
 ?>
 
 Отметим, что PHP поддерживает ряд функций спефифичных для MySQL, в частности, следующие:
 
 mysql_affected_rows -- Возвращает число затронутых прошлой операцией рядов.
 
 mysql_change_user --  Изменяет пользователя для указанного соединения.
 
 mysql_client_encoding -- Возвращает кодировку соединения
 
 mysql_close -- Закрывает соединение с сервером MySQL.
 
 mysql_connect -- Открывает соединение с сервером MySQL.
 
 mysql_create_db -- Создаёт базу данных MySQL.
 
 mysql_data_seek -- Перемещает внутренний указатель в результате запроса.
 
 mysql_db_name -- Возвращает название базы данных.
 
 mysql_db_query -- Переключается к указанной базе данных и посылает запрос.
 
 mysql_drop_db -- Уничтожает базу данных MySQL.
 
 mysql_errno --  Возвращает численный код ошибки выполнения последней операции с MySQL.
 
 mysql_error --  Возвращает строку ошибки последней операции с MySQL.
 
 mysql_escape_string --  Экранирует SQL спецсимволы для mysql_query.
 
 mysql_fetch_array --  Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба.
 
 mysql_fetch_assoc --  Обрабатывает ряд результата запроса и возвращает ассоциативный массив.
 
 mysql_fetch_field --  Возвращает информацию о колонке из результата запроса в виде объекта.
 
 mysql_fetch_lengths --  Возвращает длину каждого поля в результате.
 
 mysql_fetch_object -- Обрабатывает ряд результата запроса и возвращает объект.
 
 mysql_fetch_row -- Обрабатывает ряд результата запроса и возвращает неассоциативный массив.
 
 mysql_field_flags --  Возвращает флаги указанного поля результата запроса.
 
 mysql_field_len --  Возвращает длину указанного поля.
 
 mysql_field_name --  Возвращает название указанной колонки результата запроса.
 
 mysql_field_seek --  Устанавливает внутренний указатель поля на переданное смещение.
 
 mysql_field_table --  Возвращает название таблицы, которой принадлежит указанное поле.
 
 mysql_field_type --  Возвращает тип указанного поля результата запроса.
 
 mysql_free_result -- Освобождает память от результата запроса
 
 mysql_get_client_info -- Возвращает данные о MySQL-клиенте
 
 mysql_get_host_info -- Возвращает информацию о соединении с MySQL
 
 mysql_get_proto_info -- Возвращает информацию о протоколе MySQL
 
 mysql_get_server_info -- Возвращает информацию о сервере MySQL
 
 mysql_info --  Возвращает информацию о последнем запросе
 
 mysql_insert_id --  Возвращает ID, сгенерированный при последнем INSERT-запросе.
 
 mysql_list_dbs --  Возвращает список баз данных, доступных на сервере.
 
 mysql_list_fields -- Возвращает список колонок таблицы.
 
 mysql_list_processes -- Возвращает список процессов MySQL.
 
 mysql_list_tables -- Возвращает список таблиц базы данных MySQL.
 
 mysql_num_fields -- Возвращает количество полей результата запроса.
 
 mysql_num_rows -- Возвращает количество рядов результата запроса.
 
 mysql_pconnect --  Устанавливает постоянное соединение с сервером MySQL.
 
 mysql_ping -- Проверяет соединение с сервером и пересоединяется при необходимости.
 
 mysql_query -- Посылает запрос MySQL.
 
 mysql_real_escape_string --  Экранирует специальные символы в строках для использования в выражениях SQL.
 
 mysql_result -- Возвращает данные результата запроса.
 
 mysql_select_db -- Выбирает базу данных MySQL.
 
 mysql_stat -- Возвращает текущий статус сервера.
 
 mysql_tablename -- Возвращает имя таблицы, содержащей указанное поле.
 
 mysql_thread_id -- Возвращает ID текущего потока.
 
 mysql_unbuffered_query --  Посылает MySQL SQL-запрос без авто-обработки результата и её буферизации.
 
 О
 
  тметим, что для PHP существуют программы “билдеры” для ускорения процесса разработки WEB-страниц, взаимодействующих с СУБД, например, PHP Report Maker.
 
 
 |