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

1. Передача параметров из формы

2. Типы переменных

3. Округление и деление по модулю

4. Файлы и массивы

5. Передача параметров в функцию

6. Передача в функцию двумерного массива

7. Вызываемая функция хранится в отдельном файле

8. Регулярные выражения

9.Пример использования регулярных выражений в сценарии

10. Прожорливость регулярных выражений

11. Работа с базой данных Mysql

12. Чтение системного массива  $_SERVER[ ]

13. Погрешности вычислений и сравнение действительных чисел

14. Базы данных. СУБД MySQL

15. Рисование с помощью библиотеки GD2

16. Функция readfile()

17. Чтение и разбор файла в формате XML

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

HTML-код первой страницы:

<HTML>
<FORM ACTION="display.php" METHOD="POST">
Имя.... <INPUT TYPE="text" name="name"><BR>
Возраст <INPUT TYPE="text" name="age"><P>
<INPUT TYPE="submit" VALUE="ВВОД">
</FORM>
</HTML>

Вторая страница формируется с помощью PHP-скрипта

<HTML>
<HEAD><TITLE>В РНР ИЗ ФОРМЫ F_POST.html</title></head>
<BODY><H3>П Р И В Е Т С Т В И Е</h3>
<?php //Вызов из F:\Webservers\home\Kam.ru\WWW\F_POST.html
$name=$_POST["name"];
$age=$_POST["age"];
if($age>50)
{echo "Привет! $name. Вы - старейшина!<p>";}
elseif($age>30)
{echo "Привет! $name, you are very old!<p>";}
else
{echo "Привет! $name.";}
echo '<P>Вы работаете с версией PHP : ' . phpversion();
?>
<p></p><a href=F_POST.html>Возврат</a>

</body>
</html>

Просмотр примера 1 в браузере

2. Типы переменных

<?php
/*Примеры, доказывающие, что тип переменной определяется контекстом
так же как и в Perl*/
$a=2; $b="5";
$c=$a.$b;
$d=$a+$b;
$e=$b%$a; //деление по модулю 2
print "<BR>c=$c d=$d e=$e";
$f=12.77;
$e=$f%$b; //деление по модулю 5
echo "<BR>e=$e деление по модулю 5";
$e=$f%4.9; //деление 12 по модулю 4
$ed=$f/4.9;
echo "<BR>деление 12 по модулю 4 - 12.77%4.9=$e <BR>Обычное деление 12.77/4.9=$ed";
//$e=floatval($b); // не работает, работают (int)$x , (float)$x и (string)$x
echo "<BR>";
$var = '122.74343The';
$float_value_of_var = (float)$var;
$n=(int)$var;
$n_str="var_".$n." хотя к \$n применялось int";
print "(float)(122.74343The)=$float_value_of_var \$n=(int)(122.74343The)=$n <BR>"; // prints 122.34343
$x=7; $y=(float)$x;
$d=$a.$y;

$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
print "<BR>$n_str<BR>d=$d foo=$foo"; //d=27 foo=15

if ($a==$b) print "<BR>$a равно $b";
elseif ($a>$b)
{print "<BR>$a больше $b";}//если - один оператор, то фиг. скобки можно не ставить
//точка с запятой обязательны
else print "<BR>$a меньше $b";
?>

Просмотр результатов выполнения примера 2

3. Округление и деление по модулю.

<?php
$a=2.34;
$b=7.54;
$e=floor($b); //отбросить дробную часть $e=7
$r=round($b); //арифм округл $r=8
$ce=ceil($b); //ближайшее большее или равное целое
$i=5;
$ci=ceil($i);
echo "b=$b floor(b)=$e round(b)=$r ceil(b)=$ce ci=$ci<BR>";
$c=$b%$a; //деление по модулю
echo "7.54%2.34=$c <br>";
$x=53;
$y=7;
$z=$x%$y;
echo "53%7=$z <br>";
$d=$b/$a;
$e=floor($d);
$r=round($d);
$ce=ceil($d);
echo "d=$d floor(d)=$e round(d)=$r ceil(d)=$ce";
$a="2.35end";
$b=floor($a);
echo "floor($a)=$b<BR>";

?>

Просмотр результатов примера 3

4. Файлы и массивы. В текстовом файле Sotrudniki.txt содержится таблица, состоящая из пяти колонок, разделяемых знаком табуляции. Файл читается построчно. Каждая считанная строка сбрасывается в текстовый файл sort2.txt и выводится в браузер .
Файл sort2.txt отличается от исходного добавлением колонки с номерами строк.
В браузер данные из считываемого файла выводятся в виде двух отформатированных таблиц:

Перед форматированием строка расщепляется на пять элементов и помещается в одномерный массив $r.
Для формирования таблицы программистов используется двумерный массив $G_SPb

Текст скрипта:

<?php
$alfa=$_SERVER['DOCUMENT_ROOT'];
/* DOCUMENT_ROOT = /home/kam.ru/www - корневой каталог для данного сайта.
$alfa\\..\ = /home/kam.ru/ , т.е. происходит подъём по дереву
каталогов на один уровень вверх
В файле sotrudniki.txt хранится таблица из пяти столбцов,
разделяемых знаками табуляции
'r' - файл открывается для чтения
*/
@ $fil=fopen("$alfa\\..\\sotrudniki.txt",'r');
if(!$fil)
{ echo "Файл 'sotrudniki.txt' не открылся";
exit;
}
/* По умолчанию файл ищется в том же каталоге, что и выполняемый скрипт.
Читаемый Вами скрипт находится в каталоге ../home/kam.ru/www/PrimPHP/
'w' - файл открывается для записи. Старые записи уничтожаются.
Если файла нет, то создаётся новый.
*/
$filW=fopen("sort2.txt",'w');
$i=1; $n=0;
print "<H3>Основные сотрудники</h3>";
print "<TABLE border=1 callspacing=2 cellpadding=3>";
while(!feof($fil))
{ $a=fgets($fil,999); //чтение одной строки файла
$r=preg_split ("/\t/", $a); //Расщепление записи на столбцы.
if($r[1]=="программист") // $r - массив из пяти элементов
{ $G_SPb[$n][0]=$r[0]; // \t - знак табуляции
$G_SPb[$n][1]=$r[2];
$G_SPb[$n][2]=$r[3];
$G_SPb[$n][3]=$r[4];
$n++;
}
else
{ print "<TR>";
  foreach($r as $x) print "<TD>".$x;
}
fwrite($filW,$i++."\t".$a); // Вывод в текстовый файл. К каждой строке
// добавляется её номер (переменная $i)
}
print "</TABLE>";
print "<H3>Программисты</h3>";
print "<TABLE border=1 callspacing=2 cellpadding=3>";
for($i=0; $i<$n; $i++)
{ print "<TR>";
  for($j=0; $j<4; $j++){ print "<TD>".$G_SPb[$i][$j];}
}
print "</TABLE>";
fclose($fil);
fclose($filW);
?>
 

Просмотр в браузере примера работы с файлами и массивами

5. Передача параметров в функцию

<?php
/*Физическая передача копии параметра в область памяти
функции*/
function foo ($var)
{
$var++;
return $var;
}

$a=5;
$b=foo ($a);
echo "a=$a, b=$b";
/*Передача ссылки на фактический параметр, т.е.
указание функции адреса параметра в памяти*/

function fooR (&$var)
{
$var++;
return $var;
}
$a=5;
$b=fooR ($a);
echo "<BR>a=$a, b=$b";
fooR ($a);
echo "<BR>a=$a";
function foo3 (&$var)
{$c=55;
$var=$c;
}
foo3(&$a);
echo "<BR>foo3 a=$a";
$b =&$a;
//$b - синоним $a, т.е. значения $a и $b хранятся в одной и той же ячейке памяти
echo "<p>a=$a, b=$b";
$a++;
echo "<p>a=$a, b=$b";
$b=8;
echo "<p>a=$a, b=$b";
unset ($a); //удаление идентификатора $a
echo "<p>a=$a, b=$b";
//Переменная, объявленная как 'static', не стирается после выполнения функции
function Test ()
{
static $a = 0;
echo "<p>a=$a";
$a++;
return $a;
}
Test ();
$f=Test ();
print "<BR>a=$f Current PHP version: ". phpversion();
//Переменная, объявленная в функции как глобальная,
//видна и в вызывающей программе
$x=5;
function glob_()
{ global $x;
$x++;
}
glob_();
print "<BR>x=$x";

Просмотр результатов примера 5

6. Передача в функцию двумерного массива. Функция служит для печати двумерного массива. Рассматриваются два варианта:

  1. массив передаётся в качестве параметра;
  2. в функции массив объявляется глобальным.

<?php
$A= array(
array(1,2,3),
array(11,12,13),
array(111,122,133),
);
p($A);
function p($A)
{
for($i=0;$i<3;$i++)
{ for($j=0;$j<3;$j++)
{ print $A[$i][$j]."&nbsp;&nbsp;&nbsp;";}
print "<P>";
}
}
print "<H2>Пример объявления в функции двумерного массива глобальной переменной</H2>";
pGlob();
function pGlob()
{ global $A;
for($i=0;$i<3;$i++)
{ for($j=0;$j<3;$j++)
{ print $A[$i][$j]."&nbsp;&nbsp;&nbsp;";}
print "<P>";
}
}
?>

Просмотр примера 6 в браузере

7. Вызываемая функция хранится в отдельном файле. Функция печати двумерного массива может потребоваться в разных задачах. Поэтому целесообразно вынести её в отдельный файл и подсоединять к вызывающим программам с помощью оператора require. Рассматриваются 2 варианта цикла:

    1. цикл for($i=... в функции p(имя массива,количество строк, количество столбцов), хранящейся в  отдельном файле;
    2.цикл
foreach  в функции peach(имя массива), хранящейся в одном файле с вызывающей программой.

Страница со скриптом (программой), вызывающим функцию, хранящуюся в отдельном файле

<html>
<head>
<title>Массив с require</title>
</head>
<body>
<H2>Пример подсоединения функции печати двумерного массива с помощью require</H2>
<?php
$A= array(
        array(1,2,3,4),
        array(11,12,13,14),
        array(111,122,133,144),
        );
print "<H2>Вариант 1. Цикл <I>for(\$i= ...</i></h2>";
require ('print2Mas.inc');
p($A,3,4);

print "<H2>Вариант 2. Цикл <I>foreach</i></h2>";
peach($A);
function peach($B)
{ echo "<TABLE cellspacing=1 border=1 align='center'>";
  foreach($B as $C)
  {   echo "<TR>";
      foreach($C as $x)
      {  echo "<TD>$x";
      }
    }
  echo "</table>";
}
?>
</body>
</html>

 

Функция печати (файл print2Mas.inc):

<?php
//ФУНКЦИЯ ПЕЧАТИ ДВУМЕРНОГО МАССИВА
function p($A,$I,$J)
{ echo "<TABLE cellspacing=1 border=1 align='center'>";
for($i=0;$i<$I;$i++)
{ echo "<TR>";
for($j=0;$j<$J;$j++)
{ echo "<TD>".$A[$i][$j];}
}
echo "</table>";
}
?>

Просмотр примера 7 с использованием require

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

<?php
print "<P>********* Р Е Г У Л Я Р Н Ы Е    В Ы Р А Ж Е Н И Я *************";
print "<P>********** С Т И Л Ь    POSIX **************";
//Замена в строке подстроки
$a="Город Ленинград основан в 1703 году";
$b=ereg_replace('Ленинград','Санкт-Петербург',$a);
echo "<BR>",$b;
/*Напечатается:
Город Санкт-Петербург основан в 1703 году

Простой поиск в строке подстроки
Найти в строке $с подстроку PHP без учёта регистра
*/
$c="aaphpbbb PHP nnnn PhpmmmpHp";
if(eregi("php",$c,$regs))
{print "<BR>В строке <B>$c </b>найдено слово <FONT color=red>$regs[0]</font> без учёта регистра ";}

//Напечатается: В строке aaphpbbb PHP nnnn PhpmmmpHp найдено слово php без учёта регистра

/*
Найти в строке $с подстроку PHP, написанную прописными буквами
*/
if(ereg('PHP',$c,$re)) print "<BR>Найдено слово <B>$re[0]</B>, написанное большими (прописными) буквами ";

//Напечатается: Найдено слово PHP, написанное большими (прописными) буквами

Print "<P>********** С Т И Л Ь PERL ************";
/*
Найти в строке $с подстроку PHP без учёта регистра
*/
if(preg_match("/php/i",$c)) print "<BR>Есть PHP<BR>";
else print "<BR>Нет PHP<BR>";
/*
В строке $c="aaphpbbb PHP nnnn PhpmmmpHp" ищется подстрока, содержащая
три слова PHP с любым сочетанием больших и маленьких (другими словами, прописных и строчных)
букв, т.е, php, PHP, Php. Cлова PHP могут разделяться любым количеством любых символов.

*/
preg_match ("/(php).*?(php).*?(php)/i", $c, $regs);
print "<BR>\$regs[0]=$regs[0] <BR>\$regs[1]=$regs[1] <BR>\$regs[2]=$regs[2] <BR>\$regs[3]=$regs[3] <BR>";

/*Напечатается:
$regs[0]=phpbbb PHP nnnn Php
$regs[1]=php
$regs[2]=PHP
$regs[3]=Php
*/

/*Флаг PREG_OFFSET_CAPTURE определяет смещение найденных данных,соответствующих подшаблонам,
заключённым в круглые скобки. Массив $regs становится двумерным. Первый элемент строки
- найденная подстрока, второй - её смещение относительно начала исходной строки.
*/
preg_match ("/(php).*?(php).*?(php)/i", $c, $regs,PREG_OFFSET_CAPTURE);
print "<BR>$c";

print "<BR>Цикл foreach<BR>";
$i=0;
foreach($regs as $r2)
{print "\$regs[$i][0]=".$r2[0]." offset=\$regs[$i][1]=". $r2[1]."<BR>";
$i++;
}

/*Напечатается:
aaphpbbb PHP nnnn PhpmmmpHp
Цикл foreach
$regs[0][0]=phpbbb PHP nnnn Php offset=$regs[0][1]=2
$regs[1][0]=php offset=$regs[1][1]=2
$regs[2][0]=PHP offset=$regs[2][1]=9
$regs[3][0]=Php offset=$regs[3][1]=19
*/

preg_match("/(http:\/\/)([^\/]+).*(h.*)/i",
"адрес http://www.php.net/index.html", $matches);
print " 0=".$matches[0]."<BR> 1=".$matches[1]."<BR> 2=".$matches[2]."<BR> 3=".$matches[3]."<BR>";
/* Напечатается:
0=http://www.php.net/index.html
1=http://
2=www.php.net
3=html
*/

//*** Поиск подстроки заданного формата, но с неизвестным содержанием
$a="Итоги торгов 25.04.2007 на ММВБ";
if(preg_match("/(\d\d)\.(\d\d)\.(\d{4})/",$a,$rez))
print "<BR>$rez[1]/$rez[2]/$rez[3]";
/* Напечатается:
25/04/2007
*/
// Регулярные выражения позволяют обнаруживать ошибки.
//В следующем примере обнаруживается неправильный номер месяца:
$a="Итоги торгов 25.14.2007 на ММВБ";
if(preg_match("/(0[1-9]|[12]\d|3[01])\.(1[012]|0[1-9])\.(\d{4}|\d{2})/",$a,$rez))
print "<BR>$rez[1]/$rez[2]/$rez[3]";
else print "<BR>Ошибка в дате";
/* Напечатается:
Ошибка в дате
*/
Метасимволы ^ и $
Нужно определить, начинается ли строка на http и кончается на loc
Поиск всей строки
$a='http://kafi5.loc/Kam.loc';
if (preg_match("/^http.*loc$/",$a,$r)) print "≤BR>адрес верный $r[0]";

Поиск одного символа или его отсутствия на заданном месте
$f='Навиков Новиков Новичков';
preg_match("/Нович?ков/",$f,$rez);
print "<BR>Фамилия $rez[0]";
//Напечатается
Новиков

Поиск с конца строки
preg_match("/Нович?ков$/",$f,$rez);
print "<BR>Фамилия $rez[0]";
//Напечатается
Новичков

Поиск всех совпадений с шаблоном в строке
preg_match_all("/Нович?ков/",$f,$rez); $i=0;
foreach($rez as $x)
{    print "<BR>$i. ";
    foreach($x as $y)
    { print "$y ";}
    $i++;

}
//Напечатается
0. Новиков Новичков

Поиск в строке всех совпадений с шаблоном и подшаблонами
$g='Начало весны - 01.03, середина - 15.04, конец весны - 31.05';
preg_match_all("/(\d\d)\.(\d\d)/",$g,$rez);
$i=0;
foreach($rez as $x)
{    print "<BR>$i. ";
    foreach($x as $y)
    { print "$y ";}
    $i++;
}
/* Напечатается
0. 01.03 15.04 31.05 0.
1. 01 15 31
2. 03 04 05

*/ //************** Замена ***************
$a="Город Ленинград основан в 1703 году";
$b=preg_replace("/Ленинград/","Санкт-Петербург",$a);
echo "<BR>",$b;
/* Напечатается:
Город Санкт-Петербург основан в 1703 году
*/
//заменить запятую на точку
$b='2,75; 13,6; 23,1';
$b1=preg_replace("/,/",'.',$b,5,$k_vo);
print "<BR>b1=$b1 k-во=$k_vo";
//Напечатается:
b1=2.75; 13.6; 23.1 k-во=3

//Заменить ; на знак табуляции
$b2=preg_replace("/;/",chr(9),$b1,5,$k_vo);
print "<BR>b1=$b2 k-во=$k_vo";
//Напечатается:
b1=2.75 13.6 23.1 k-во=2

$r=preg_split("/\t/",$b2);
print '<BR>r='.$r[1];
//Напечатается:
r=13.6

//******Удаление пробелов
$prob=" Город ";
echo "<BR>Длина=",strlen($prob);
echo "<BR>Н".$prob."K";
/*Браузер вместо любого количества следующих подряд пробелов печатает только один пробел,
поэтому напечатается следующее:
Длина=13
Н Город K
*/
//******Удаление начальных пробелов
$prob=preg_replace("/^ +/","",$prob);
echo "<BR>Длина=",strlen($prob);
echo "<BR>Н".$prob."K";
/* Напечатается:
Длина=8
НГород K
*/

//******Удаление конечных пробелов
$prob=preg_replace("/ +$/","",$prob);
echo "<BR>Длина=",strlen($prob);
echo "<BR>Н".$prob."K";
/* Напечатается:
Длина=5
НГородK
*/

/**************
********** Р А С Щ Е П Л Е Н И Е СТРОКИ ************
*/
$a="Размеры 10;20;8";
$i=0;
$razm=preg_split ("/[ ;]/", $a);
foreach($razm as $x) print "<BR>\$razm[".$i++."]=".$x;
/* Напечатается:
$razm[0]=Размеры
$razm[1]=10
$razm[2]=20
$razm[3]=8
*/ ?>

Просмотр результата выполнения примеров регулярных выражений в браузере

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

Просмотр файла SotrudReg.txt, используемого в сценарии

<html>
<head> <title></title></head>
<body>
<?php
$alfa=$_SERVER['DOCUMENT_ROOT'];
//echo "$alfa/sotrudReg.txt<P>";
@ $fil=fopen("$alfa/sotrudReg.txt",'r');
if(!$fil)
{ echo "Файл 'sotrudReg.txt' не открылся";
exit;
}
//Пропускаем строку с названием таблицы
fgets($fil,999);
//Читаем строку с датой
$st=fgets($fil,999);
//Выделяем дату
if(preg_match("/(\d\d)\.(\d\d)\.(\d{4})/",$st,$rez))
print "<BR>$rez[1]/$rez[2]/$rez[3]<BR>";
else print "Не найдена дата<BR>";
while(!feof($fil) )
{   $st=fgets($fil,999);
    if(preg_match("/Ольга|Оля/i",$st))
    print $st."<BR>";
}
?>
</body></html>

Просмотр результатов выполнения примера 9

10. Прожорливость регулярных выражений
В примере рассматривается прожорливость регулярных выражений и поиск нескольких подстрок, удовлетворяющих шаблону

<html>
<head> <title></title></head>
<body>
<H3 align=center>Прожорливость регулярных выражений</h3>
I. Исходное выражение:
<br><B>a xxx c xx c xxxxxxx c xxx c d</B>
<P>1. Найти один или больше символов <B>X</B>, расположенных подряд<BR>
<?php
$x="a xxx c xx c xxxxxxx c xxx c d";
preg_match("/x+/",$x,$rez);
print "$rez[0]<BR>";
print "2. Найти ровно один символ <B>x</B><BR>";
preg_match("/x+?/",$x,$rez);
print "$rez[0]<BR>";
print "2. Найти последовательность символов с символом <B>C</B> на конце<BR>";
preg_match("/.*c/",$x,$rez);
print "$rez[0]<BR>";
print "3. Найти первую последовательность символов с символом <B>C</B> на конце<BR>";
preg_match("/.*?c/",$x,$rez);
print "$rez[0]<BR>";
print "4. Найти все соответствия образцу (функция preg_match_all() с модификатором U)<BR>";
preg_match_all("/.*c/U",$x,$rez);
print "a)".$rez[0][0]."<BR>b)".$rez[0][1]."<BR>c)".$rez[0][2]."<BR>d)".$rez[0][3]."<BR>";
//print count($rez[0])."<BR>";
print "
II. Найти все даты в строке<BR>";
//В конце строки обязательно поставить не-цифру, иначе будут выбираться только две первые цифры года
$d="<B>один 21.10.2001 далее 2) 4-3-04 3) 7/11/2000 4) 09-05-1998.</B>";
print $d."<p>";
preg_match_all("/(\d|[0,1,2]\d|3[0,1])[.\/-](\d|[0,1]\d)[.\/-](\d{2,4})\D/U",$d,$da,PREG_SET_ORDER);
for($i=0;$i<count($da);$i++)
# $da[$i][0] - содержит подстроку, совпадающую со всем шаблоном
# $da[$i][$k], $k=1, 2, 3; - содержит подстроку, совпадающую c k-м подшаблоном
print $da[$i][0]."
&nbsp;&nbsp;Дата, \"собранная\" из подшаблонов ".$da[$i][1].".".$da[$i][2].".".$da[$i][3]."<BR>";
?>
</body></html>

Просмотр примера 10

11. Работа с базой данных Mysql. Кодировка скрипта - Windows-1251

<HTML>
<HEAD><TITLE>PHP - mysql</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
</head>
<BODY>
<?php
// Connecting, selecting database
$link = mysql_connect('localhost', 'root', '')
or die('Could not connect: ' . mysql_error());
mysql_query("set character_set_client='cp1251'");
mysql_query("set character_set_results='cp1251'");
mysql_query("set collation_connection='cp1251_general_ci'");
//mysql_query("set NAMES 'cp1251'");
/*
character_set_client —     указывает, в какой кодировке будут поступать данные от клиента;
character_set_connection — указывает, в какую кодировку следует преобразовать данные 
                           полученые от клиента перед выполнением запроса;
collation_connection —     указывает, каким образом сравнивать между собой строки в запросах;
character_set_results —    указывает серверу не необходимость перекодировать результаты запроса 
                        в определенную кодировку перед выдачей их клиенту.
Если запрос и данные в БД находятся в одинаковой кодировке, а перекодировка результата не требуется,
то вместо установки character_set_client, character_set_connection, character_set_results достаточно выполнить:

    mysql_query("SET NAMES 'cp1251'");

Для того чтобы посмотреть значения этих переменных установленные по умолчанию можно воспользоваться оператором SHOW VARIABLES:

    SHOW VARIABLES LIKE 'character_set%';
*/
mysql_select_db('alfa') or die('<br>Could not select database');

// Performing SQL query
$query = "SELECT * FROM `student` WHERE FIO LIKE 'А%' LIMIT 0 , 30 ";
echo $query."<BR>";
$result = mysql_query($query) or die('Query failed: ' . mysql_error($link));
//echo "<BR>После<BR>";
// Printing results in HTML
echo "<table>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";

// Free resultset
mysql_free_result($result);

// Closing connection
mysql_close($link);
?>
</body>
</html>

Просмотр результата примера 11

12. Чтение системного массива  $_SERVER

<html>
<head><title>Сист.массивы</title></head>
<body>
<h2 align=center>Системные массивы</h2>
Для хранения системных данных используется массив $_SERVER[]<br>
Массивы $_POST[], $_GET[] и заменяющий их оба $_REQUEST[] служат
для передачи данных из формы
<h3>Массив $_SERVER[]</h3>
<?php
foreach($_SERVER as $key=>$value)
print "$key=>$value<BR>";
?> </body>
</html>

Просмотр примера 12 в браузере

13. Погрешности вычислений и сравнение действительных чисел

Из-за погрешности вычислений с плавающей запятой две теоретически равные величины, но полученные в результате вычислений на ЭВМ, могут отличаться друг от друга. В примере приводятся ошибочные и правильные способы сравнения чисел с плавающей запятой. Рассмотрены случаи сравнения в операторе if и в цикле while. Пример состоит из двух страниц. Первая страница (HTML-документ) служит для ввода различных параметров цикла . Вторая содержит скрипт на языке PHP. Ниже приведена только вторая страница:
<html><body>
<h2>Погрешности вычислений и сравнение действительных чисел</h2>
<?php
$beg=$_GET['beg'];
$step=$_GET['step'];
$end=$_GET['end'];
// ПРИМЕР 13.1.Сравнение двух действительных чисел
$a=1.; $b=0.3+0.3+0.3+0.1; $c=$a-$b;
if($a==$b)print 'a=b<BR>';
else print 'a<>b<BR>';
//Результат a<>b
//Правильный результат получается при вычислении
//относительной погрешности
if(abs(($a-$b)/$a)<0.0001)print 'a=b<BR>';
else print 'a<>b';
//Результат a=b
print "c=$c<HR>";
//Результат c=1.11022302463E-016
/*ПРИМЕР 13.2. Проверка условия выхода из цикла
Когда переменная цикла $x становится равной $end, шаг ещё надо
выполнять. Из цикла нужно выходить не выполняя следующего шага,
т.е. при $x=$end+$step.
Так как $x вычисляется с погрешностью, то вместо равенства
условием выхода из цикла будет abs($x-$end+$step)>$step/2 (точнее,
величины хотя бы чуть-чуть меньшей, чем шаг цикла $step). Условие
    abs(($end+$step-$x)/$step) > 0.5
позволяет строить цикл с отрицательным шагом. Попробуйте выполнить
этот пример при
  $beg = 3
  $step = -0.2
  $end = 1
*/
 $x=$beg;
 while (abs(($end+$step-$x)/$step) > 0.5 )
 {  $r=$end-$x;
    $c=$x*$x;
    print "$x  $x<sup>2</sup>=$c    \$end-\$x=$r<BR>";
    $x+=$step;
 }
?>
</body>
</html>

Просмотр примера 13 в браузере

14. Базы данных. СУБД MySQL. Кодировка скрипта - utf-8.

Команды SQL, приведённые в пунктах 14.1 и 14.2, можно выполнять как в phpMyAdmin., так и в скиптах на PHP.

14.1. Команда SQL для создания таблицы Fak

CREATE TABLE IF NOT EXISTS `Fak`
( `Id` int(11) NOT NULL AUTO_INCREMENT,
`Bukva` varchar(16) COLLATE utf8_bin NOT NULL,
`Naim` varchar(70) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Naim` (`Naim`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=12 ;

14.2. Команда SQL для ввода данных в таблицу Fak

INSERT INTO `Fak` (`Id`, `Bukva`, `Naim`) VALUES
(1, 'А', 'ракетно-космической техники '),
(3, 'Е', 'Оружия и систем вооружения'), (4, 'К', 'энергетического машиностроения '),
(5, 'И', 'Информационных и управляющих систем'),
(6, 'Н', 'Мехатроники и управления'),
(7, 'Р', 'международной коммуникации и промышленной экономики ');

14.3. Скрипт для чтения и вывода в окно браузера всей таблицы Fak

<HTML><HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Fak</title>
</head>
<BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0>
<H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center">
ФАКУЛЬТЕТЫ<BR>форма для просмотра
</h2>
<?php
/***** Cоединение с СУБД MySQL. ******
*****Хост 'localhost', пользователь 'root', без пароля *****/
$link = mysql_connect('localhost', 'root', '')
or die('Нет соединения с СУБД MySQL: ' . mysql_error());

//***** Открытие базы данных 'abi2' *****
mysql_select_db('abi2')
or die('<br>Нет соединения с базой данных');

//***** Настройка кодировки текста *****
mysql_query('SET CHARACTER SET utf8',$link);
mysql_query("set NAMES utf8");

//SQL-запрос для чтение таблицы Fak
$query="SELECT * FROM Fak";

//****** Выполнение запроса. *****
//*** $result - ссылка на буфер с результатами запроса ****
$result=mysql_query($query); // or print('Ошивка при чтении таб. Fak: ' . mysql_error($link));

//Формирование HTML-таблицы
print '<TABLE align=center border=1>'
.'<TR><TH>№<BR> п.п.<TH>Обозна-<BR>чение<TH>Название';
//Чтение всех строк таблицы Fak в массив A
$i=0;

//****** Чтение в цикле результатов запроса ****** while($a=mysql_fetch_row($result)){$A[$i++]=$a;}

$i=0;
foreach($A as $st)
{ $i++; list($Id,$Bukva,$Naim)=$st;
print "<TR><TD align=center>$i<TD align=center>$Bukva<TD>$Naim";
}
?>
</table></html>

Просмотр примера 14.3 в браузере

15. Рисование с помощью библиотеки GD2

В примере создаваемый рисунок встраивается в HTML-докумен Рисунок представляет собой синий прямоугольник с красной и белой диагоналями и текстом на русском языке. Высота и ширина прямоугольника задаются пользователем. Процесс создания и вывода рисунка в HTML-документ делится на 3 этапа:

Трудности возикают при создании в рисунке надписей на русском языке. Для печати средствами GD2 нужно иметь файл с кирилическим шрифтом TrueType. Если такого шрифта не оказалось под рукой, то можно поверх контейнера <div> с рисунком поместить другой контейнер с текстом и прозрачным фоном. Такой приём используется в скрипте image_Text.php.

15.1. Скрипт image_Text.php

<HTML><HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Рисунки</title>
</head>
<BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0>
<H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center">
Использование библиотеки GD2 для построения изображений
</h2>
Этот скрипт вызывается из <I>image_Form2.html</i> и служит для вывода текста и
рисунка, генерируемого скриптом <I>image_Form.php</i>.<P>
Текст в рисунке выводится по-русски правильно, только если скрипт 
<i>image_Form.php </i>, генерирующий изображение, имеет кодировку UTF-8<BR>
Скрипт для построения рисунка запускается так: 
<I><IMG src='image_Form.php?H=$H&W=$W'></i>
<P>
<?php
//Данные об установленной библиотеке
//var_dump(gd_info());
//print "</P><DIV align=center>";
$H=$_GET['H'];$h1=$H+20;
$W=$_GET['W'];$w=$W+20;
//для печати на рисунке слова Текст используются 3 контейнера
//Общий контейнер для контейнеров с рисунком и текстом
print "<DIV style='position:relative;width:$h1;height:$w;margin:0 auto;'>"
//контейнер с жёлтым текстом и прозрачным фоном, расположенный поверх контейнера с рисунком (z-index:3)
."<DIV style='position:absolute;top:40px; left:20px;font-size:30pt;color:#FFFF00;background-color:transparent;z-index:3'>Текст</div>"
//Котейнер с рисунком, расположенный за контейнером с текстом (z-index:1)
."<DIV style='position:absolute;top:5px;text-align:center; z-index:1'>";
print "<IMG src='image_Form.php?H=$H&W=$W' align=absmiddle>";
?>
</div>
</body>
</html>

15.2. Скрипт image_Form.php

<?php
//Приём параметров из формы
$height=$_GET['H'];
$width=$_GET['W'];
//Данные об установленной библиотеке
//var_dump(gd_info());
//************* ФОРМИРОВАНИЕ РИСУНКА *********
// Создание полотна рисунка заданных ширины и длины
$im = imagecreatetruecolor($width,$height);
// Создание нескольких цветов
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$red = imagecolorallocate($im, 255, 0, 0);
$blue = imagecolorAllocate($im, 0, 0, 164);
//полотно закрашивается синим цветом
ImageFill($im,0,0,$blue);
//Проводятся белая и красная диагонали
ImageLine($im,0,0,$width,$height,$white);
ImageLine($im,0,$height,$width,0,$red);
// Выводимый в картику текст
//$text = "кодировка UTF-8 \n русская";
//$font = 'arial.ttf';
// Печать тени текста 12 - размер шрифта, 0 - угол поворота
// 121 - х-координата, 21 - y-координата
//imagettftext($im, 12, 0, 121, 21, $grey, $font, $text);
// Вывод текста
//imagettftext($im, 12, 0, 120, 20, $white, $font, $text);
//**** ОТПРАВКА ИЗОБРАЖЕНИЯ *********
//Передача заголовка Content-type
header ("Content-type: image/png");
//передача рисунка на браузер
imagepng($im);
//Сохранение рисунка в виде файла
//imagepng($im,'risunok.png');
imagedestroy($im);
?>

Просмотр примера 15 в браузере

16. Функция readfile()

Функция readfile(имя_файла) служит для передачи в браузер указанного файла. Пример состоит из трёх файлов (Рис 16.1)

Рис. 16.1. Переход к странице по условию

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

Скрипт parol.php

<?php
  $user=$_POST['usernam'];
  $p=$_POST['Par'];
  if($user=='kvn' && $p=='1234') $f = 'schet.html';
  else                           $f = 'parol.html';
  readfile($f);
?>
Просмотр примера 16 в браузере

17. Чтение и разбор файла в формате XML

В файле Xleb.xml описан рецепт приготовления простого хлеба

Текст файла Xleb.xml

<?xml version="1.0" encoding="UTF-8"?>
<recipe name="хлеб" preptime="5" cooktime="180">
  <title>Простой хлеб</title>
  <composition>
    <ingredient amount="3" unit="стакан">Мука</ingredient>
    <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
    <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
    <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  </composition>
  <instructions>
    <step>Смешать все ингредиенты и тщательно замесить.</step>
    <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
    <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->
    <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
  </instructions>
</recipe>

Необходимо напечатать рецепт в окне браузера. Преобразование рецепта из формата XML в формат HTML выполняется скриптом Xleb.php

Скрипт Xleb.php

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv=Content-Type content="text/html; charset=utf-8">
<?php
 //Чтение файла
 $f='Xleb.xml';
 @ $fil=fopen($f,'r');
if(!$fil)
{  echo "Файл '$f' не открылся";
   exit;
}
$str='';
 while(!feof($fil))
{ $a=fgets($fil,999);
//$b=preg_replace("/</","<",$a);
  $str.=rtrim($a);
 } 
 preg_match("/<title>(.*)<\/title>/U",$str,$rez);
 //Печать <title>Простой хлеб</title>
 print $rez[0]
      .'</head><BODY>';
 $zag=$rez[1];	 //Запоминание заголовка страницы
 preg_match("/<recipe(.*)?>/U",$str,$rez);
  $a=$rez[1];
 preg_match("/name=\"(.*)?\"/U",$a,$rez);
 print "<H2>Продукт - $rez[1]</h2>\n" //Продукт - хлеб
   ."<P>Вид продукта - $zag<BR>\n";   //Вид продукта - Простой хлеб
  preg_match("/preptime=\"(.*)?\"/U",$a,$rez); 
  print "Время подготовки - $rez[1] мин.<BR>\n";//Время подготовки - 5 мин.
   preg_match("/cooktime=\"(.*)?\"/U",$a,$rez); //
  print "Время выпечки - $rez[1] мин.</p>\n";   //Время выпечки - 180 мин.
  //Выделение таблицы
  preg_match("/<composition>(.*)?<\/composition>/U",$str,$rez);
  //Массив $Ingr содержит строки таблицы
 $Ingr=preg_split("/<\/ingredient>/",$rez[1]);
 print '<TABLE border=1>'
  .'<TR><TD>Продукт<TD>количество<TD>Ед.изм.';
  $n=count($Ingr)-1;
 for($i=0;$i<$n;$i++)
 { preg_match("/amount=\"(.*)?\" unit=\"(.*)?\">(.*)$/U",$Ingr[$i],$rez);
   print "<TR><TD>$rez[3]<TD>$rez[1]<TD>$rez[2]\n";
 }
 print "</table>";
 //выделение и печать инструкции по приготовлению
 preg_match("/<instructions>(.*)?<\/instructions>/U",$str,$rez);
 $b=preg_replace("/<step>/","",$rez[1]);
 $b1=preg_replace("/\/step/","BR",$b);
 print "$b1\n";
 ?>
</body>
</html>
Просмотр примера 17 в браузере