
- •В.С. Романчик
- •Глава 2. Использование php.
- •Глава 3.
- •Введение
- •Возможности php.
- •Инструменты для разработки
- •Как php работает
- •Глава 1. Язык php Типы данных
- •Массивы и инициализация массивов
- •Объектно-ориентированное программирование в php Основные понятия ооп
- •Классы и Объекты
- •Конструкторы и деструкторы
- •Наследование классов и интерфейсов
- •Магические методы
- •Обработка ошибок
- •Ошибки php и директива error_reporting
- •Чтение и запись бинарных файлов
- •Работа с каталогами в рнр
- •MySql – сервер: бд1; бд2; бд3; бд4;
- •Язык запросов sql
- •Операция соединения.
- •Команды sql для создания баз данных и таблиц
- •Выборка данных из таблиц бд
- •Работа с MySql (сохранение данных в базе данных).
- •Работа с MySql занесение и получение данных из базы данных
- •Некоторые улучшения в организации работы с данными
- •Передача данных от клиента к серверу и от сервера клиенту
- •Клиентские методы http get, post, head
- •Обработка html-форм и передача переменных в скрипт.
- •Передача значений переменных по методу get
- •Ниже рассмотрен еще один пример передачи данных из клиентской формы на сервер по методу get
- •Передача данных на сервер по методу post
- •Php и обработка различных форм
- •Примеры обработки форм
- •Работа с e-mail
- •Отправка почты на php (Функция mail)
- •Cookies-наборы: сохраненное состояние
- •Сессии (Сеансы) Переменные сеанса
- •Отмена регистрации сеансовых переменных
- •Работа с сеансовыми переменными
- •Постоянные данные, использующие сеансы и cookie-наборы
- •Вывод графических данных с помощью рнр Основной способ создания изображений
- •Получение информации об изображении
- •Функции рисования прямых и кривых линий
- •Заливка изображений
- •Работа с палитрой изображения
- •Удаление и изменение цветов палитры
- •Создание прозрачности в изображениях
- •Рисование с помощью кистей
- •Использование специальных стилей для заливки
- •Использование шрифтов и вывод строк
- •Манипулирование и копирование изображений
- •Создаём графический информер на php
- •Слияние изображений с помощью gd
- •Включения удаленных файлов
- •Различные приложения и полезные скрипты на php
- •Пример. Определение типа и версии браузера
- •Генератор паролей на php
- •Время выполнения скрипта
- •Календарь
- •Загрузка файла от клиента на сервер
- •Работа с ftp на уровне php
- •Сбор статистики на php
- •Проверка ввода емайл
- •Чтение почты через Web-интерфейс
- •Разработка собственных листов рассылки
- •Рассылаем письма
- •Добавляем адреса в список рассылки
- •Редактирование адресов
- •Автоответчик
- •Почтовые функции в рнр
- •Задания для выполнения
- •Приложение 1. Протокол передачи гипертекстов http
- •Клиентские методы и заголовкиHttp
- •Указатель ссылки ("Referer")
- •Медиа-типы
- •Кодирование
- •Безопасность и авторизация
- •Кэширование содержимого http на стороне клиента
- •Http идентификация с php
- •Сжатие данных в протоколе http
- •Модель ajax: между загруженной в браузер страницей и сервером появляется прослойка - уровень ajax, который обеспечивает следующую последовательность выполнения приложения.
- •Класс xmlHttpRequest
- •Методы класса xmlHttpRequest
- •Свойства класса xmlHttpRequest
- •Создание экземпляра объекта xmlHttpRequest
- •Использование dom
- •Проблема с кешированием
- •Информируйте пользователя
- •Нет принципов написания кода
- •Аутентификация средствами php
- •Отделение клиентская части программы от серверной части и шаблоны
- •Использование шаблонов в php
- •Шаблоны подстановки
- •Создаем свои шаблоны в php
- •Теги, атрибуты, значения
- •Структура документа
- •Разрыв строки
- •Предварительное форматирование
- •Комментарии
- •Физическая и логическая разметка документа
- •«Физические» теги:
- •«Логические» теги:
- •Специальные символы
- •Графика
- •Формы html
- •Метатеги
- •Способы включения каскадных таблиц стилей
- •Синтаксис
- •Группирование
- •Наследование
- •Множественные классы.
- •Селекторы идентификаторов (id-селекторы).
- •Комментарии
- •Свойства шрифтов.
- •Свойства текста.
- •Представление документа в виде специальных областей – блоков
- •Отступы, поля, позиционирование.
- •Границы элементов.
- •Визуальные эффекты
- •Свойства списков
- •Свойства таблиц
- •Псевдоклассы
- •Псевдостили текста
- •Псевдоэлементы
- •Различные свойства
- •Css. Примеры
- •Типы данных
- •Ассоциированные массивы
- •Операторы
- •Подпрограммы
- •Приложение 11. Популярные веб-приложения и фреймворки
- •Фреймворки
Отправка почты на php (Функция mail)
Сохраните класс отправки почты под именем mail_class.php. Скрипт проверки можете сохранить под любым именем, например sendmail.php.
Внимание! В тексте скрипта предварительно подставьте реальный почтовый адрес. Запустите на выполнение проверочный скрипт sendmail.php. Если все сработало правильно, то вам придет письмо на тот адрес, что вы указали в проверочном скрипте.
Хотя в некоторых случаях подобное письмо может не дойти до адресата. Например, оно может быть заблокировано антиспамовыми фильтрами.
Класс отправки сообщения (mail_class.php)
<?php
class Mail
{
// создаем переменные, в которых хранится содержимое заголовков
var $to = '';
var $from = '';
var $reply_to = '';
var $cc = '';
var $bcc = '';
var $subject = '';
var $msg = '';
var $validate_email = true;
// проверяет допустимость почтовых адресов
var $rigorous_email_check = true;
// проверяет допустимость доменных имен по записям DNS
var $allow_empty_subject = false;
// допустимость пустого поля subject
var $allow_empty_msg = false;
// допустимость пустого поля msg
var $headers = array();
/* массив $headers содержит все поля заголовка, кроме to и subject*/
function check_fields()
/* метод, проверяющий, переданы ли все значения заголовков
и проверку допустимости почтовых адресов */
{
if(empty($this -> to))
{
return false;
}
if(!$this -> allow_empty_subject && empty($this -> subject))
{
return false;
}
if(!$this -> allow_empty_msg && empty($this -> msg))
{
return false;
}
/* если есть дополнительные заголовки, помещаем их в массив $headers*/
if(!empty($this -> from))
{
$this->headers[] = "From: $this -> from";
}
if(!empty($this -> reply_to))
{
$this -> headers[] = "Reply_to: $this -> reply_to";
}
// проверяем допустимость почтового адреса
if ($this -> validate_email)
{
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $this -> to))
{
return false;
}
return true;
}
}
function send()
/* метод отправки сообщения */
{
if(!$this -> check_fields()) return true;
if (mail($this -> to, htmlspecialchars( stripslashes(trim($this -> subject))),
htmlspecialchars(stripslashes(trim($this -> msg)))))
{
return true;
}else{
return false;
}
}
}
?>
Проверочный скрипт (senmail.php)
<?php
include("./mail_class.php");
$mail = new Mail();
$mail -> to = "kuznetsov@domen.ru";
//сюда подставляется реальный адрес
$mail -> subject = "test";
$mail -> msg = "testing...";
$mail -> msg = "testing...";
$mail -> rigorous_email_check = 0;
if($mail->send()){
echo("Success");
}else{
echo("error");
}
echo("<br>");
echo($mail -> msg);
?>
Cookies-наборы: сохраненное состояние
РНР не имеет средств для запоминания предыдущих запросов клиента к серверу. Если необходимо создать Web-сайт, запоминающий посетителей или использующий их данные для создания персонального содержимого страницы из РНР-сценариев, решение может быть в использовании cookies. Cookies-это механизм хранения данных о предыдущем посещении сайта на компьютере клиента. При первом посещении сайта сервер передает браузеру клиента для сохранения в файле идентифицирующий клиента cookie-набор. При следующем посещении данного сайта, браузер перешлет этот cookie-файл обратно серверу, чтобы последний мог использовать этот набор для персонализации клиента. Например, при первом посещении сайта, использующего cookie, клиенту предлагается заполнить регистрационную форму, содержащую его имя и возможные интересы. Эта информация затем посылается серверу, который упаковывает ее в набор cookie и возвращается браузеру клиента, который сохраняет ее для последующего использования. Когда вы в следующий раз посетите этот же сайт, браузер передаст вместе с запросом cookie-набор, и вместо обычного приветствия сможете увидеть приветственную страницу со своим именем и перечнем услуг для вас. Cookie хранятся в системном каталоге Cookies в текстовых файлах формата username@host.txt.
Когда программа, выполняемая на Web-сервере, намеревается установить cookie-набор, происходит следующая последовательность событий:
Сервер посылает клиенту заголовок Set-cookie, содержащий данные о клиенте, которые он хочет сохранить вместе с именем cookie-набора.
НТТР/1.0 200 ОК
[Здесь опять идут заголовки]
Set-Cookie: user_id=265;domain=bsu.by ;
Expires=Mon, 20-Sep-2010 16:54:56 GMT;Path=/
Клиент сохраняет эту информацию вместе с информацией об URL или домене, от которого она получена в cookie-наборе. Технически теперь он существует в контексте пользовательского браузера как маленький текстовый файл, содержащий значения для сайта. При последующих запросах этого URL или домена, браузер автоматически вспомнит: " у меня есть cookie-набор для этого сайта. Я должен отправить его" и отправит эту информацию в виде:
GET /index.php HTTP/1.0
[Злесь идут заголовки]
Cookie: user_id=265
Существует ряд ограничений, направленных на на предупреждение неправильного использования cookie-наборов. В HTTP cookie-наборы являются маленькими сегментами текста размерностью не более 4 Кбайт (4096 байт). Клиентскому браузеру можно запретить принимать cookie. Сookie-наборы также могут иметь ограничение на работу только с определенной частью Web-сайта. Это значит, что можно установить cookie-набор для каталога bsu.by/my, который будет работать только в этом каталоге и его подкаталогах. Сookie-наборы имеют время жизни или могут быть сделаны неактуальными в любое время после их установки. В этом случае cookie-набор автоматически удаляется клиентским браузером. Рассмотрим примеры заголовков:
Существует несколько методов использования cookie-наборов в PHP-сценариях. Например, через запрос-ответ HTTP. Синтаксис HTTP-заголовка Set-Cookie:
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOM_NAME; secure
Параметр NAME представляет собой имя cookie-набора, VALUE — URL-кодированное значение. Параметр DATE (если он указан) задает дату и аремя, когда cookie-набор потеряет актуальность. Формат параметра DATE: <Day>, DD-MMM-YYYY НН:MM:SS GMT. Параметр, secure нужно указывать, если cookie-набор посылается через защищенное HTTP-соединение.
Параметры PATH и DOM_NAME представляют путь и домен, для которых предназначен этот cookie-набор. Параметр PATH может быть опущен. Cookie-наборы затем посылаются только тем доменам, которые соответствуют домену cookie-набора. Указывать полное доменное имя не обязательно. В качестве значения по умолчанию будет использовано полное имя домена, с которого был отправлен cookie-набор. В качестве значения параметра DOMAIN_NAME используется не просто og.org, а .og.org (с ведущей точкой). Это еще одна гарантия от злоупотребления cookie-наборами. Параметр DOM_NAME должен иметь как минимум две точки в имени домена, а в некоторых случаях — и три. Это позволяет предотвратить передачу cookie-наборов с именем домена, такого как .com. Существует несколько доменов верхнего уровня, для которых в имени домена достаточно двух уровней: . СОМ, . EDU, .NET, .ORG, .GOV, .MIL, .BIZ, .SHOP, . INFO. Все другие домены требуют минимум трех точек в параметре DOM_NAME.
При работе с cookie-наборами значение cookie-набора можно изменить, послав дополнительный заголовок Set-Cookie с новым значением. Для удаления cookie-набора достаточно изменить текущее значение времени набора так, чтобы он потерял актуальность в прошлом. Рассмотрим пример допустимого заголовка Set-Cookie
Set-Cookie: mycookie=myvalue; expires=Tuesday, 03-Dec-2009 13:01:59 GMT; path=/; domain=.cog.org;
Здесь был установлен cookie-набор mycookie со значением myvalue для всех файлов в домене cog.org. Этот cookie-набор установлен с граничной датой актуальности декабря 2009 года (03-Dec-2009) и временем 13:01:59 GMT.
Посмотрим, как реализовать cookie-наборы в веб.
Первый метод установки cookie-наборов — использование HTML-дескрипторов. В частности, HTML-дескриптор <МЕТА> можно использовать для имитации HTTP-заголовков внутри HTML-страницы, применяя атрибуты HTTP-EQUIV и CONTENT. Например, чтобы установить такой cookie-набор, как предыдущий, можно использовать HTML-дескриптор <МЕТА>
<HEAD>
<!— HTML-код //—>
<МЕТА HTTP-EQUIV="Set-Cookie" CONTENT="mycookie=myvalue;
path=/; domain=.bsu.by">
</HEAD>
<!— остаток HTML-документа //-->
Дескриптор <META> хорош не только для установки cookie-наборов. Например, с помощью НТТР-загоповка Refresh можно перенаправить браузер на новую страницу:
<МЕТА HTTP-EQUIV="Refresh" CONTENT="0; url=http://www.bsu.by">
Вторым методом установки cookie-набора в PHP-коде является создание заголовка Set-Cookie с помощью PHP-функции header(). Установка cookie-набора с использованием функции header ()
<?php
header("Set-Cookie:mycookie=myvalue;path=/;domain=.cog.org");
?>
Поскольку эта функция используется для отправки HTTP-заголовков, она должна быть выполнена до пересылки содержимого с помощью операторов echo или print.
Третий и наиболее известный метод установки cookie-наборов — использование PHP-функции setcookie () и переменной $_COOKIE.
Функция setcookie () имеет следующий синтаксис:
setcookie($name [,$value [, $expire [, $path [, $domain (, $secure]]]]]);
Здесь $name - имя cookie. Этот идентификатор хранится в глобальной переменной $_COOKIE и доступен в последующих сценариях. Значение $value хранится на компьютере пользователя. Переменная $expire содержит время, когда истекает значение cookie или становится недоступным. Это время можно задать с помощью функции time(). Файлы cookie, без заданного значения времени истечения, завершают свое существование при закрытии браузера. path -указывает пути доступа на сервере, для которых cookie действителен или доступен. Косая черта "/" говорит, что cookie доступен во всех папках. Domain - домен, в котором доступен cookie. Если домен не определен, по умолчанию используется хост, на котором создан cookie. Значения domain должны содержать в строке как минимум две точки ".", чтобы быть допустимыми. $secure=1 указывает, что cookie передается через защищенное соединение HTTPS, значение 0 обозначает стандартную передачу HTTP. Любые необязательные параметры могут быть установлены в NULL.
Так как и для заголовков header() перед фунцией setcookie () не должно быть никакого вывода, даже пустая строка перед открывающим дескриптором <?php > вызовет ошибку. Рассмотрим пример:
<?php //cooke0.php
$userid = $_COOKIE['userid'];
setcookie($userid, 12);
print_r($_COOKIE);
?>
Вывод:
Array ( [First] => [vc] => 24 )
<?php //cooke1.php
$username=$_POST['userid'];
if(isset($_COOKIE[$username]))
{ $userid = $_COOKIE[$username];
echo "id1=",$userid,"<br>"; }
else {
$userid=$username;
setcookie($userid, "value", mktime(0,0,0,1,22,2011),"/");
$userid = $_COOKIE[$username];
echo "id2=",$userid,"<br>"; }
//echo "id=",$userid,"<br>";
print_r($_COOKIE);
?>
Вывод:
id1=value Array ( [First] => [vc] => 24 [value] => [Mycooke] => value )
Следует помнить, что cookie-наборы должны предшествовать началу документа, пересылаемого по HTTP. Если нельзя установить cookie-набор перед отправкой части документа, используйте функкцию буферизации ob_start(), которая позволит устанавливать cookie-набор после вывода содержимого. Поскольку вывод буферизуется, cookie-набор по-прежнему предшествует реальному выводу.
<?php
ob_start();
echo "Hello\n";//вывод в буфер
setcookie("cookiename", "cookiedata");
ob_end_flush();//Вывод буфера
?>
Рассмотрим еще один пример
<? //php431
/*Игра: отгадай число от 1 до 50.*/
$manlix['result']="<center>";
if(!isset($_COOKIE['random']))
{$random=rand(1,50);
setcookie("random",$random,time()+60*60*24*365);
setcookie("att",0,time()+60*60*24*365);
}
else{$random=$_COOKIE['random'];
$att=$_COOKIE['att'];}
$manlix['result'].="<b>Угадайте число от 1 до 50</b><hr>";
if(!empty($_GET['num']))
{if($_GET['num']==$random){
$manlix['result'].="<font color=red><b>Вы угадали число '<font color=green><b>".$random."</b></font>' с <font color=blue>".$att."</font> попытки</font> </b></font><hr>";
$random=rand(1,50);
setcookie("random",$random,time()+60*60*24*365);
setcookie("att",0,time()+60*60*24*365);}
else{if($_GET['num']>$random)
$manlix['result'].="Загаданное число меньше<hr>";
else $manlix['result'].="Загаданное число больше<hr>";
setcookie("att",$_COOKIE['att']+1,time()+60*60*24*365);}
}
for($i=1;$i<51;$i++)
$manlix['result'].="<a href=?num=".$i.">".$i."</a> ";
echo $manlix['result']."</center>";
?>
<?php
setcookie("mycookie","value",NULL, "/", ".bsu.by");
?>
Для удаления cookie-набора можно задать параметр $value равным NULL.
<?php
setcookie("mycookie", NULL, NULL, "/", ".bsu.by");
?>
После того как cookie-набор установлен на клиенте, он остается неактивным до момента, когда браузер запросит у Web-сервера другой документ. Для доступа к значению cookie-набора, полученного от браузера, РНР использует суперглобальный массив $_COOKIE, который хранит значения cookie-наборов. Каждый ключ в этом суперглобальном массиве представляет отдельный cookie-набор (имя ключа — это имя переменной cookie-набора).
Обращение к функции setcookie() было быть помещено до любого вывода, включая теги и символы разделители. Если setcookie() выполняется успешно, то возвращается TRUE, однако это еще не означает, что пользователь принял cookie. Проверка поддержки cookie-наборов из РНР рассматривается в следующем примере
<?php
if(!isset(_GET[‘testcookie'])) {
setcookie("testcookie", "test_value");
header("Location: $_SERVER["PHP_SELF"])?testcookie=l");
exit; }
else {
if(isset($_COOKIE['testcookie'])) {
setcookie("testcookie");
echo "Прием cookie-наборов включен"; }
else {
echo "cookie-наборы не поддерживаются!";
}
}
?>
В первой половине оператора if делается попытка создать cookie-набор и затем перенаправить браузер на другую страницу с помощью дополнительного параметра GET. После повторного выполнения сценария с дополнительным параметром проверяется существование cookie-набора. В случае, если клиент не поддерживает cookie-наборы, тестовый cookie-набор уничтожается вызовом функции setcookie () без параметров.
Следующий пример демонстрирует, как cookie используется для сохранения имени пользователя. Вначале требуется ввести имя пользователя, чтобы получить доступ к сайту. Затем cookie, содержащий имя пользователя, сохраняется на компьютере пользователя. Доступ в будущем возможен при извлечении cookie с компьютера пользователя.
<?php // Пример. Файл setcookie.php
if ($_REQUEST[auth] == "no")
{
$msg = "Вы не являетесь пользователем. Зарегистрируйтесь.";
}
// Если пользователь щелкает на кнопке Login, создается cookie,
// содержащий его имя пользователя и IP-адрес
if ($_POST[submit] == "Login")
{
$cookie_name = "user";
$cookie_value = $_POST[uname];
$cookie_expire = time() + 14400;
setcookie($cookie_name,$cookie_value,$cookie_expire,"/");
$formDisplay = "no";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHMTL 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Страница Web </title>
<style type="text/css">
body {font:10pt arial;color:white}
div#form {background-color:gray;border:solid 1px black;padding:10px}
input {border:solid 2px black}
</style>
<?php
if ($formDisplay == "no")
{
?>
<meta http-equiv='refresh' content='0; url=siteaccess.php?auth=yes'/>
<?php
}
?>
</head>
<body>
<div id="form">
<h4 style="color:red">New User? Create User Name</h4>
<form action="setcookie.php" method="post">
<p>User Name:
<br/>
<input type="text" name="uname" size="7"/>
</p>
<input type="submit" value="Login" name="submit"/>
</form>
<h4 style="color:red">Existing User?
<a style="color:white" href="siteaccess.php?auth=yes">Enter Site</a></h4>
</div>
<br/>
<br/>
<?php
echo "<span style='color:red'>" . $msg . "</span>";
?>
</body>
</html>
siteaccess.php
<?php
// Если пользователь щелкает на кнопке Login,
//создается cookie,содержащий его имя пользователя и IP-адрес
if ($_REQUEST[auth] == "yes" && $_REQUEST[user])
{
echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом.
Теперь на вашем диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";
}
else
{
header("Location:setcookie.php?auth=no");
}
?>