Раздел 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.
|