php2
-
Upload
chiquita-kent -
Category
Documents
-
view
32 -
download
3
description
Transcript of php2
![Page 1: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/1.jpg)
php2
![Page 2: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/2.jpg)
Задачи ГК
• Сохранять добавленное сообщение.
• Производить проверку добавляемого сообщения перед сохранением.
• Выводить все сообщения на экран.
![Page 3: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/3.jpg)
Модули
• config.php - здесь будут храниться общие настройки гостевой книги.
• base.txt - файл, где будут храниться все сообщения, наша своеобразная база данных.
• guest.php - здесь будет содержаться непосредственно наш скрипт.
![Page 4: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/4.jpg)
guest.php
• <HTML> • <HEAD>• <TITLE>Гостевая книга</TITLE> • <meta http-equiv="Content-Type"
content="text/html; charset=windows-1251"> • </HEAD> • <BODY>• <? require("config.php");
![Page 5: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/5.jpg)
• function show_form()• {• ?>• <form method="post" action="">• Имя<br>• <input type="text" name="name" maxlength="22">• <br>• E-mail<br>• <input type="text" name="email" maxlength="21"> • <br>• Сообщение<br>• <textarea cols="70" rows="20" name="mess"></textarea><br>• <input type="submit" value="Послать"> • <input type="reset" value="Очистить">• </form>• <?• }
![Page 6: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/6.jpg)
config.php
• <?$base = "base.txt";
![Page 7: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/7.jpg)
guest.php
• function save_mess()• {• global $name, $email, $mess, $base;
• $date = date("d.m.y - H:i:s");
• $text = $name."^^".$email."^^".$date."^^".$mess."\n";
• $fp = fopen($base,"a");• fputs($fp, $text);• fclose($fp);• }
![Page 8: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/8.jpg)
config.php
• $MessOnScreen = 10;
• Ограничение по кол-ву сообщений
![Page 9: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/9.jpg)
guest.php • function show_mess()• {• global $base, $MessOnScreen;
• $file = file($base);• $file = array_reverse($file);•• echo "<table>";• • if(sizeof($file) < $MessOnScreen) $MessOnScreen = sizeof($file);• • for ($i = 0; $i < $MessOnScreen; $i++)• {• $mess = explode("^^",$file[$i]);•• ?>
![Page 10: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/10.jpg)
• <tr>• <td>• <p>Написал: • <? echo "<a href='mailto:".$mess[1]."'>".$mess[0]."</a>";• echo "<br>";• echo $mess[2]; ?>• </td>• <td>• <p><?=$mess[3];?></td>• </tr>• <?• }• echo "</table></td>";• }
![Page 11: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/11.jpg)
• Функцией file() получаем массив, где в каждом элементе содержится строка с одним "блоком" - именем писавшего, адресом и сообщением.
• Изменяем порядок элементов на обратный, так что самая последняя запись становится у нас первым элементом массива.
• Сравниваем количество элементов в $file (количество сообщений) с указанным в $MessOnScreen лимитом, и если оно меньше этого значения, то $MessOnScreen устанавливаем в число элементов $file.
![Page 12: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/12.jpg)
• выполняется цикл вывода сообщений. С каждым проходом цикла значение переменной цикла увеличивается на единицу. Таким образом самые свежие сообщения (те, что были приписаны позже всех и находятся внизу файла-базы) выведутся первыми, а более старые - последними.
![Page 13: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/13.jpg)
• переменной $mess присваиваем массив с элементами:0-ой элемент - имя1-ый элемент - адрес электронной почты2-ой элемент - время добавления сообщения3-й элемент - само сообщение
![Page 14: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/14.jpg)
вывод
• запись <?=$mess[2];?>
• эквивалентна <? echo $mess[2];?>
![Page 15: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/15.jpg)
• function check_mess()• {• global $name, $email, $mess;
• $mess=trim($mess);• $email=trim($email);• $name=trim($name);
• $name = htmlspecialchars($name);• $email = htmlspecialchars($email);• $mess = htmlspecialchars($mess);•• $mess = str_replace("\n","<br>",$mess);
![Page 16: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/16.jpg)
• trim() отрезает все пустые символы (пробелы, переводы строк, символы табуляции) в начале и в конце строк.
• str_replace заменяет с помощью функции все символы перевода строки на тег <br>.
• htmlspecialchars() обрабатывает все специальные символы HTML, то есть символ < переходит в < и так далее
![Page 17: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/17.jpg)
• function output_err($num)• {• global $err;• ?>• <center><h1>Oшибка!</h1></center>• <p><?=$err[$num];?>•• <?• exit();• }
![Page 18: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/18.jpg)
• В файле config.php в массиве $err будут перечислены сообщения для вывода при соответствующей ошибке. Обратите внимание, что мы при помощи функции exit() прекращается работа скрипта после вывода сообщения об ошибке
![Page 19: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/19.jpg)
• if (empty($name)) output_err(2);• if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-
z]{2,3}/i", $email))• {• output_err(1);• }•• if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",
$name)) output_err(2);• }
![Page 20: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/20.jpg)
• проверить, чтобы e-mail был вида [email protected],
• проверить имя: оно должно содержать только буквы латинского и русского алфавита и знак подчеркивания (_).
• при несоблюдении этих условий задействуется функция output_err() с аргументом, представляющим собой индекс массива $err для соответствующей ошибки.
![Page 21: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/21.jpg)
config.php
• $err[1] = "Неверно введен e-mail";$err[2] = "Неверно введено имя";
![Page 22: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/22.jpg)
guest.php
• function check_for_length()• {• global $mess, $email, $name, $MessLength;
• if (strlen($mess)>$MessLength) output_err(3);• $email=substr($email, 0, 21);• $name=substr($name, 0, 22);• }
![Page 23: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/23.jpg)
• сверяется длина сообщения с указанной в переменной $MessLength с помощью функции strlen(), которая возвращает количество символов в строке
• используется функцию output_err() в случае превышения длины сообщения над лимитом
![Page 24: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/24.jpg)
config.php
• $MessLength = 1000;$err[3] = "Недопустимая длина сообщения";
![Page 25: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/25.jpg)
guest.php
• function check_mess_for_flud()• {• global $mess,$base;
• $file=file($base);• $file=implode("",$file);• $mess=preg_quote($mess);• if (eregi($mess, $file)) output_err(4);• $mess = stripslashes($mess);• }
![Page 26: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/26.jpg)
• получается массив строк файла-базы с помощью функции file()
• массив объединяется в одну переменную• "квотируется" сообщение пользователя • смотрим, встречается ли этот текст в базе или нет• если встречался, выводится ошибку• возвращается текст в переменной $mess в
первоначальное состояние, то есть убирает все обратные слеши \ перед специльными символами, которые были добавлены функцией preg_quote
![Page 27: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/27.jpg)
config.php
• $err[4] = "Такое сообщение уже существует";
![Page 28: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/28.jpg)
guest.php
• function del_mess_from_file()• {• global $base, $MessInFile;
• $file = file($base);• $k = 0;• if($MessInFile<sizeof($file))• {•• for($i=sizeof($file)-$MessInFile; $i<sizeof($file); $i++)• {• $ResFile[$k]=$file[$i];• $k++;• }•
![Page 29: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/29.jpg)
• $fp=fopen($base,"w");• for($i=0; $i<sizeof($ResFile); $i++)• {• fputs($fp, $ResFile[$i]);• }• fclose($fp);• }• }
![Page 30: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/30.jpg)
config.php
• $MessInFile = 20;
![Page 31: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/31.jpg)
• function check_mess()• {• global $name, $email, $mess;
• $mess=trim($mess);• $email=trim($email);• $name=trim($name);
• $name=htmlspecialchars($name);• $email=htmlspecialchars($email);• $mess=htmlspecialchars($mess);•• $mess = str_replace("\n","<br>",$mess);••
![Page 32: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/32.jpg)
• check_for_length(); //добавили
• if (empty($name)) output_err(2);• if
(!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) output_err(1);
• if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$name)) output_err(2);
• check_mess_for_flud(); //добавили• del_mess_from_file(); //добавили• }
![Page 33: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/33.jpg)
• if ($mess) { check_mess(); save_mess();}show_mess();show_form();?></BODY></HTML>
![Page 34: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/34.jpg)
• В PHP предусмотрено два способа передачи ID сессии (сокращенно SID):
• Через метод GET.Тогда посетитель будет видеть в своем броузере адресную строку следующего типа:http://server.com/main.php?PHPSESSID=bdd95bcd4e1e2ef5ec57fc83a69bba86
• Через Cookie.Здесь, соответственно, посетитель не будет видеть признаков существования сессии, SID передается через Cookie.
![Page 35: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/35.jpg)
• Любая сессия открывается с помощью функции session_start(), создающей специальный служебный файл с именем, соответствующим ID сессии, в который впоследствии будут записаны все данные, связанные с текущей сессией. Место размещения этих файлов зависит от настроек PHP. Так что если вы используете в своих скриптах сессии, не забывайте иногда подчищать директорию с этими временными файлами, так как там со временем может накопиться солидное количество ненужных файлов.
![Page 36: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/36.jpg)
• запись данных в сессию функция session_register(). Она сохраняет в файл текущей сессии значения указанных переменных
![Page 37: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/37.jpg)
• session_start();session_register('name', 'birth');$name = "Вася Пупкин";$birth = "4 марта";
![Page 38: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/38.jpg)
• Обратной функции session_register() является функция session_unregister(), которая удаляет данные из текущей сессии. Эта функция используется довольно редко, но иногда бывает очень полезной. Например, в том случае, если вы регистрируете в сессию большое количество переменных, чтобы не перезагружать файл текущей сессии, можно удалить оттуда уже ненужные значения.
![Page 39: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/39.jpg)
Дополнительные функции работы с сессиями
• session_id
• session_name
• session_destroy
![Page 40: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/40.jpg)
• session_start();echo session_name();session_name("MySession");echo session_name();
![Page 41: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/41.jpg)
Механизм отправки HTTP заголовков в PHP
• header("HTTP заголовок", необязательный параметр replace);
• должна быть вызвана в самом начале документа
• Опциональный параметр replace может принимать значения типа bool (true или false) и указывает на то, должен ли быть замещен предыдущий заголовок подобного типа, либо добавить данный заголовок к уже существующему
![Page 42: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/42.jpg)
• Опциональный параметр replace может принимать значения типа bool (true или false) и указывает на то, должен ли быть замещен предыдущий заголовок подобного типа, либо добавить данный заголовок к уже существующему.
• функция headers_sent(), которая в качестве результата возвращает true в случае успешной отправки заголовка и false в обратном случае.
![Page 43: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/43.jpg)
Cache-control.
• "Cache-control: " значение• Заголовок управления кешированием страниц. Вообще, данная
функция является одной из самых распространенных в использовании заголовков.
• no-cashe - Запрет кеширования. Используется в часто обновляемых страницах и страницах с динамическим содержанием. Его дейсвтие подобно META тегу "Pragma: no-cache".
• public - Разрешение кеширования страницы как локальным клиентом, так и прокси-сервером.
• private - Разрешение кеширования только локальным клиентом. • max-age - Разрешение использования кешированного
документа в течение заданного времени в секундах. • header("Cache-control: private, max-age = 3600") /* Кеширование
локальными клиентами и использование в течение 1 часа */
![Page 44: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/44.jpg)
Expires
• "Expires: " HTTP-date• Устанавливает дату и время, после которого
документ считается устаревшим. Дата должна указываться в следующем формате (на английском языке):
• День недели (сокр.) число (2 цифры) Месяц (сокр.) год часы:минуты:секунды GMT
• Fri, 09 Jan 2002 12:00:00 GMT• Текущее время в этом формате возвращает
функция gmdate() в следующем виде:• echo gmdate("D, d M Y H:i:s")."GMT";
![Page 45: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/45.jpg)
Last-Modified
• "Last-Modified: " HTTP-date• Указывает дату последнего изменения документа.
Дата должна задаваться в том же формате, что и в случае с заголовком Expires. Данный заголовок можно не использовать для динамических страниц, так как многие серверы (например, Apache) для таких страниц сами выставляют дату модификации.
• Возможно сделать страницу всегда обновленной:• header("Last-Modified: ".gmdate("D, d M Y H:i:s")."
GMT");
![Page 46: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/46.jpg)
Location• "Location :" абсолютный URL• Полезный заголовок, который перенаправляет броузер на
указанный адрес. Его действие сравнимо с META тегом Refresh:• <META HTTP-EQUIV="Refresh" CONTENT="0; URL=someURL"> • Например, этот заголовок может быть использован так:• if ($login != $admin_login) header("Location:
http://www.server.com/login.php");else header("Location: http://www.server.com/admin.php?login=$login");
if (!headers_sent()) exit("Произошла ошибка! Пройдите <a href='http://www.server.com/login.php'>авторизацию</a> заново");
![Page 47: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/47.jpg)
Классы в PHP
• Класс служит шаблоном для объекта. Он создается следующим образом:
• class Myclass {// определение класса}
![Page 48: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/48.jpg)
• class Array_class {var $array = array();
• // Определение свойстваfunction getUniqSum() {
• // Получает сумму уникальных элементов • return array_sum(array_unique($this->array)); } • function getSortedMerge() {• /* Возвращает отсортированный массив из
ключей и элементов массива */ • $result = array_merge(array_keys($this->array),
array_values($this->array)); sort($result); return $result; }}
![Page 49: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/49.jpg)
• class Advanced_array extends Array_class {
• function advanced_array($size) {
• /* заполняет массив подряд идущими числами, чередуя их знаки */
• $z = 1; for ($i = 0; $i < $size; $i++) {
• $this->array[$i] = $i *$z; $z = - $z; }
• }
![Page 50: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/50.jpg)
• function getSizeofMerge() {
• /* возвращает число неповторяющихся элементов массива, полученного getSortedMerge() */
• $merge = $this->getSortedMerge();
• return sizeof(array_unique($merge)); } }
![Page 51: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/51.jpg)
• $my = new Array_class;$my->array = array(1, 2, 6, 1);echo $my->getUniqSum();$my = new Advanced_array(4);echo $my->getSizeofMerge();
![Page 52: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/52.jpg)
• создаем новый экземпляр класса Array_class
• определяем его свойство array
• выводим сумму элементов без учета повторяющихся
• создаем экземпляр класса Advanced_array, который наследует все свойства и методы Array_class
![Page 53: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/53.jpg)
Основы MySQL
![Page 54: php2](https://reader035.fdocument.pub/reader035/viewer/2022062314/568135e6550346895d9d5b2e/html5/thumbnails/54.jpg)