Автор: admin

  • Задание к уроку 8 Php. Основные функции php

    Задание:

    1. С помощью функции очистки тегов, вывести очищенную строку от всех тегов и с исключением тега <p>:
    $text = '
    <p>Параграф.</p>
    <!-- Комментарий -->
    Здесь текст';

    2. С помощью функции очистки лишних пробелов в начале и в конце строки обработать и вывести следующую строку:

    $trim = " Очистка строки от лишних пробелов ";

    3. Обработать и вывести строку с помощью функции экранизации addslashes(), так же определить длину данной строки и вывести число:

    $str = "Is your name O'reilly?";

    4. Разбить строку, получив ее из глобального массива $_SERVER[‘DOCUMENT_ROOT‘],

    используя разделитель «/» и вывести результат с помощью функции var_dump();

    После чего вывести позицию первого вхождения символа «/».

    5. Вывести полученные подстроки из строки: $str = "abcdef";

    с позициями: -1; -3; -3,1;

     

    [spoiler title=»Решение»]

    <?
      $text = '
      <p>Параграф.</p>
      <!-- Комментарий -->
      Здесь текст';
    
      echo strip_tags($text);
      echo "\n\n-------\n";
      // не удалять <p>
      echo strip_tags($text, '<p>');
    ?>
    <hr>
    <?
    $trim = "      Очистка строки от лишних пробелов         ";
    echo trim($trim);
    ?><br><?
    $str = "Is your name O'reilly?";
    // выводит: Is your name O\'reilly?
    echo addslashes($str);
    echo '<br>Длина строки равна :'.strlen($str);
    ?>
    <br>
    <?
    $explode = explode('/', $_SERVER['DOCUMENT_ROOT']);
    var_dump($explode);
    echo "<br>Символ / встречается на позиции ".strpos($_SERVER['DOCUMENT_ROOT'], "/")."<br><br>";
    
    $str = "abcdef";
    echo "Cтрока: ".$str."<br>";
    $rest = substr($str, -1);    // возвращает "f"
    echo "pos=-1. Полученная строка: ".$rest."<br>";
    $rest = substr($str, -2);    // возвращает "ef"
    echo "pos=-3. Полученная строка: ".$rest."<br>";
    $rest = substr($str, -3, 1); // возвращает "d"
    echo "pos=-3,1. Полученная строка: ".$rest."<br>";
    ?>

    [/spoiler]

  • Задание к уроку 7 Php. .htaccess и $_SERVER

    Задание:

    В файле .htaccess установить кодировку по умолчанию на UTF-8 и написать правила перенаправления на  страницы ошибок:

    401.html,  403.html,  404.html,  500.html

    [spoiler title=»401.html»]

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>401 Нет авторизации</title>
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
    </head>
    <style>
     .notfound-401 {text-align: center;position: relative;top: 100px;}
     .notfound-401 span {font-size: 1000%;display: block;line-height: 1;}
     .notfound-401 i.fa {font-size: 1000%;}
     .notfound-401 p {font-size: 300%; margin: 0; padding: 0;}
    </style>
    <body>
    <div class="notfound-401">
     <i class="fa fa-paper-plane-o"></i>
     <span>401</span>
     <p>Нет авторизации.</p>
    
    </div>
    </body>
    </html>

    [/spoiler]

    [spoiler title=»403.html»]

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>403 Запрещено!</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
    </head>
    <style>
      .notfound-403 {text-align: center;position: relative;top: 100px;}
      .notfound-403 span {font-size: 1000%;display: block;line-height: 1;}
      .notfound-403 i.fa {font-size: 1000%;}
      .notfound-403 p {font-size: 300%; margin: 0; padding: 0;}
    </style>
    <body>
    <div class="notfound-403">
      <i class="fa fa-paper-plane-o"></i>
      <span>403</span>
      <p>Запрещено!.</p>
    
    </div>
    </body>
    </html>

    [/spoiler]

    [spoiler title=»404.html»]

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>404 Страница не найдена</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
    </head>
    <style>
      .notfound-404 {text-align: center;position: relative;top: 100px;}
      .notfound-404 span {font-size: 1000%;display: block;line-height: 1;}
      .notfound-404 i.fa {font-size: 1000%;}
      .notfound-404 p {font-size: 300%; margin: 0; padding: 0;}
    </style>
    <body>
    <div class="notfound-404">
      <i class="fa fa-paper-plane-o"></i>
      <span>404</span>
      <p>Страница не найдена.</p>
    
    </div>
    </body>
    </html>

    [/spoiler]

    [spoiler title=»500.html»]

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>500 Ошибка сервера</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
    </head>
    <style>
      .notfound-500 {text-align: center;position: relative;top: 100px;}
      .notfound-500 span {font-size: 1000%;display: block;line-height: 1;}
      .notfound-500 i.fa {font-size: 1000%;}
      .notfound-500 p {font-size: 300%; margin: 0; padding: 0;}
    </style>
    <body>
    <div class="notfound-500">
      <i class="fa fa-paper-plane-o"></i>
      <span>500</span>
      <p>Ошибка сервера.</p>
    
    </div>
    </body>
    </html>

    [/spoiler]

    С помощью глобального массива $_SERVER вывести Имя хоста, IP сервера, Дирректория, Браузер.

    [spoiler title=»Решение»]

    AddDefaultCharset UTF-8
    
    ErrorDocument 401 /401.html
    ErrorDocument 403 /403.html
    ErrorDocument 404 /404.html
    ErrorDocument 500 /500.html
     <?
     echo "<br>Имя хоста: "
     .$_SERVER['SERVER_NAME'].
     "<br>IP Сервера: "
     .$_SERVER['SERVER_ADDR'].
     "<br>Дирректория: "
     .$_SERVER['DOCUMENT_ROOT'].
     "<br>Ваш браузер: "
     .$_SERVER['HTTP_USER_AGENT']."<br>";
     ?>

    [/spoiler]

     

     

     

  • Задание к уроку 6 php. Сессии и Куки

    Задание:

    Регистрация на сайте файл reg.php

    if($_POST['submit']=="Регистрация"){
      
    if($_POST['pass']==$_POST['pass2']){
      $pass=md5($_POST['pass']);
    }
    else{
      $msg="Введенные пароли не совпадают";
    }	
    if($pass!=0){	
    $res=mysql_query("SELECT * from `users` where `email`='{$_POST['email']}'");
    $data=mysql_fetch_assoc($res);
    if($data['id']){
      $msg="Пользователь с таким email уже зарегистрирован";
      }
    else{
      $insert=mysql_query("insert into `users` (`name`,`email`,`pass`) values ('{$_POST['name']}', '{$_POST['email']}','{$pass}')");
    }
    if ($insert=='TRUE'){
      $select=mysql_query("SELECT * from `users` where `email`='{$_POST['email']}'");
      $data1=mysql_fetch_array($select);
      $auth=md5($_POST['email']).md5($data1['id']);
      /*Отправка email*/
      $to=$_POST['email'];
      $subject="Подтверждение регистрации";
      $body="Для завершения регистрации пройдите по <a href='".$_SERVER['DOCUMENT_ROOT']."/11/aktiv.php?email=".$email."&auth=".$auth."'>ссылке </a>";
      require "sendmail.php";
      /********/
      $email=$_POST['email'];
      echo "/aktiv.php?email=".$email."&auth=".$auth;
      $msg="Для завершения регистрации проверьте почту!";
    }
    }
    }
    ?>
    
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
    <div id="content">
        <div class="center">
          <div class="row">
    <?echo $msg;?>
    <h1>Регистрация</h1>
      <form method="post">
        <p><input required type="text" name="name" placeholder="Имя"></p>
        <p><input required type="email" name="email" placeholder="email"></p>
        <p><input required type="password" name="pass" placeholder="пароль"></p>
        <p><input type="password" name="pass2" placeholder="повторите пароль"></p>
        <p><input type="submit" name="submit" value="Регистрация"></p>
      </form>
      <p><a  href="login.php">Войти</a></p>
    </div>
    </div></div>

    Подтверждение регистрации activ.php

    $res=mysql_query("SELECT * from `users` where `email`='{$_GET['email']}'");
    $data=mysql_fetch_array($res);
    if($data['id']){
      $auth=md5($_GET['email']).md5($data['id']);
      echo $auth . "<br>";
      if($auth==$_GET['auth']){
      $upd=mysql_query("update `users` set `auth`='1' where`email`='{$_GET['email']}'");	
      if($upd='TRUE'){
      echo 'Поздравляем, регистрация прошла успешно!';
      }
      }	
      else {echo 'Возникла ошибка, попробуйте зарегистрироваться заново!';}
    }

     

    2. По нажатию кнопки Добавить — создать сессию и куки с вашим именем, и по нажатию кнопки Удалить — удалить сессию и куки с вашим именем.

    Данные получить из формы.

    <?
    session_start();
    if(isset($_POST['submit_add'])) {
      /*
        создать сессию и куки с вашим именем
      */
    } elseif(isset($_POST['submit_del'])) {
      /*
        удалить сессию и куки с вашим именем
      */
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Сессии и Куки</title>
    </head>
    <body>
      <form action="index.php" method="post">
        <input type="text" name="name" placeholder="Напишите сюда ваше имя"><br>
        <input type="submit" value="Добавить" name="submit_add">
        <input type="submit" value="Удалить" name="submit_del">
      </form>
    </body>
    </html>

    [spoiler title=»Решение»]

    <?
    session_start();
    if(isset($_POST['submit_add'])) {
     // обрабатываем полученную строку, очищаем ее от лишних пробелов и удаляем теги если имеются
     $name = strip_tags(trim($_POST['name']));
     if(!isset($_COOKIE['name'])) {
     setcookie('name', $name);
     echo "Куки успешно сохранены, Хорошая работа " . $name . "<br>";
     } else {
     echo 'Здравствуй ' . $_COOKIE['name'] . ' Куки уже были сохранены, необходимо их удалить. <br>';
     }
     if(!isset($_SESSION['name'])) {
     $_SESSION['name'] = $name;
     echo "Сессия успешно создана, Хорошая работа " . $_SESSION['name'] . "<br>";
     } else {
     echo 'Здравствуй ' . $_SESSION['name'] . ' Сессия уже была создана, необходимо ее удалить. <br>';
     }
    } elseif(isset($_POST['submit_del'])) {
     if(isset($_SESSION['name']) or isset($_COOKIE['name'])) {$name = $_SESSION['name'] or $_COOKIE['name'];}
     setcookie('name', '');
     unset($_SESSION['name']);
     echo "Все данные были успешно удалены...<br>Хорошая работа $name";
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>Сессии и Куки</title>
    </head>
    <body>
     <form action="index.php" method="post">
     <input type="text" name="name" placeholder="Напишите сюда ваше имя"><br>
     <input type="submit" value="Добавить" name="submit_add">
     <input type="submit" value="Удалить" name="submit_del">
     </form>
    </body>
    </html>

    [/spoiler]

  • HTML Урок 3. Ссылки и таблицы

    3 урок:

    • Ссылки
    • Относительный адрес
    • Абсолютный адрес
    • Открытие ссылки в новом окне браузера
    • Создание якоря (метки)
    • Ссылка на почтовый ящик
    • Ссылка картинка
    • тег NAV
    • тег SPAN
    • Таблицы в HTML

    Ссылки HTML

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

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

    Синтаксис

    Для создания ссылок в HTML-документах используется элемент <a>, его содержимое выступает в качестве метки, с помощью которой и будет производится переход. Для того, чтобы из элемента <a> сделать активную гиперссылку, нужно добавить к нему атрибут href.

    Атрибут href в качестве своего значения содержит адрес (относительный или абсолютный), на который будет вести ссылка. При щелчке на ссылку браузер получает и отображает документ, адрес которого указан в атрибуте href.

    <html>
      <body>
     
        <p><a href="page.html">Ссылка</a></p>
        <p><a href="httр://www.manuscript.kz">Ссылка</a> на страничку в и-нете.</p>
     
      </body>
    </html>

    Результат данного примера в окне браузера:

    примеры ссылок

    Относительный адрес

    Относительный адрес означает, что указание пути на нужный файл или страницу вашего сайта начинается относительно страницы, на которой расположена ссылка, либо относительно корневого каталога сайта. Рассмотрим компоненты (части), из которых может состоять относительный путь:

    Части пути Описание Примеры значений
    имя_файла Если в качестве значения атрибута указать только имя файла это значит, что нужный файл находится в той же папке, где и страница со ссылкой. «page.html»
    каталог/ Если файл, к которому нужно указать путь, расположен в дочернем каталоге относительно файла с ссылкой, это означает, что нам надо спуститься на один уровень вниз (в дочернюю папку текущего каталога), в этом случае путь начинается с указания имени дочернего каталога, после его имени указывается прямой слэш «/», он служит для разделения частей пути, после него указывается имя нужного нам файла.

    Примечание: опуститься можно ровно на столько папок вниз, сколько вы их создали. К примеру, если вы создали папку на 10 уровней ниже корневой, то можете указать путь, который приведет вас вниз на 10 папок. Однако, если у вас так много уровней, это, скорее всего, означает, что организация вашего сайта излишне неудобно составлена.

    «каталог/page.html»

    «каталог1/каталог2/page.html»

    ../ Если нужно указать, что файл, на который вы ссылаетесь, находится в родительской папке, используйте символы .. (две точки), они означают подняться на один уровень вверх (в родительскую папку текущего каталога). Далее мы указываем прямой слэш «/», чтобы разделить части пути, и пишем имя нашего файла.

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

    «../page.html»

    «../../page.html»

    «../../../кат1/кат2/page.html» — поднимаемся из текущей папки на три каталога выше и уже из него спускаемся на два уровня ниже к требуемому файлу

    / Относительный путь не обязательно всегда должен начинаться относительно текущего расположения страницы со ссылкой, он также может начинаться относительно корневого каталога сайта. К примеру, если нужный файл находится в корневом каталоге, путь может начинаться с символа «/», после которого надо всего лишь указать имя нужного файла, который расположен в корневом каталоге.

    Примечание: когда символ «/» указывается первым, это означает начало пути от корневого каталога.

    «/page.html»

    «/кат1/кат2/car.png»

    Абсолютный адрес

    Абсолютный адрес обычно применяется для указания пути к файлу, который расположен на другом сетевом ресурсе. Он представляет из себя полный URL-адрес к файлу или странице. Первым делом в адресе указывается используемый протокол, после которого идет название домена (имя сайта). Например: http://www.пример.ру — так выглядит абсолютный путь к конкретному веб-сайту. http:// — это протокол передачи данных, а www.пример.ру — имя сайта (домен).

    Абсолютный адрес можно использовать и на собственном сайте. Однако внутри сайта рекомендуется использовать в качестве значения ссылок относительный путь.

    Теперь давайте рассмотрим, что такое URL-адрес. Каждая веб-страница в сети Интернет имеет свой собственный уникальный адрес, вот он как раз и называется URL. Аббревиатура URLрасшифровывается как Uniform Resource Locator (унифицированный адрес ресурса), проще говоря URL — это определитель местонахождения ресурса. Этот способ записи адреса стандартизирован в сети Интернет.

    Пара примеров URL адресов:

    "httр://www.manuscript.kz/"
     
    "httр://www.manuscript.kz/html/u1.php"

    Открытие ссылки в новом окне браузера

    Для того чтобы страница, на которую ведет ссылка, открывалась в новом окне, нужно будет сообщить браузеру имя окна, в котором нужно открыть страницу. Если вы не указываете браузеру использовать какое-то определенное окно, то он откроет страницу в текущем окне.

    Для указания браузеру, что при открытие страницы нужно использовать другое окно, вместо текущего, добавьте в элемент <a> атрибут target. Его значение сообщает браузеру о целевом окне для страницы. Если в качестве значения атрибута target вы используете _blank, то браузер для каждой новой страницы всегда будет открывать новое окно.

    Попробуйте сами:

    <html>
      <body>
     
        <p><a href="mypage.html" target="_blank">Другая страница</a>.
          Если вы установите для атрибута target значение _blank,
          то ссылка откроется в новом окне.
        </p>
     
      </body>
    </html>

    В таблице приведены все доступные значения для атрибута target.

    Значение Описание
    _blank Открывает документ в новом окне.
    _self Открывает документ в том же окне, где была нажата ссылка (значение по умолчанию).
    _parent Открывает документ в родительском окне.
    _top Открывает документ на весь экран.
    имя_фрейма Открывает документ в указанном фрейме.

    Создание якоря (метки)

    До сих пор всегда, когда вы создавали ссылки, то, переходя по ним на другую страницу, она загружалась, и браузер отображал ее с самого верха, но что, если вам нужно при переходе сразу видеть определенный раздел страницы вместо шапки сайта, в этом случае нужно просто воспользоваться якорем.

    Для начала вам нужно определиться с местом, это может быть любой текст на странице, но чаще всего применяется короткий фрагмент текста заголовка. Затем нужно заключить этот текст внутрь элемента <a>, добавить к нему глобальный атрибут id, выбрать идентификационное имя для этого фрагмента и это имя записать в качестве значения в атрибут id:

    <h2><a id="end">Заключение</a>.</h2>

    Итак, наш якорь готов, теперь осталось сослаться на него, для этого просто добавьте символ «#» в конец вашей ссылки, за которым укажите идентификационное имя вашего якоря:

    1
    <a href="other.html#end">Заключение</a>

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

    Примечание: если якорь находится на одной странице с ведущей на него ссылкой, то имя документа в атрибуте href можно опустить, написав только идентификатор.

    Ссылка на почтовый ящик

    В создании ссылки на электронную почту нет ничего сложного, нужно просто в значении атрибута href ввести ключевое слово mailto, поставить после него двоеточие и написать адрес электронной почты, на который хотите сослаться:

    Попробуйте сами:

    <html>
      <body>
     
        <p>
          Это ссылка на почту:
          <a href="mailto:someone@someone.ru">моя почта</a>
        </p>
     
      </body>
    </html>

    Такая ссылка ничем не будет отличаться от остальных ссылок вашего документа. Только вместо другой страницы при нажатии на такую ссылку откроется установленная у вас по умолчанию программа почты.

    Ссылка картинка

    Вы наверное не раз замечали, что на многих сайтах в качестве ссылок используются различные изображения, которые по принципу работы ничем не отличаются от текстовых ссылок. Для того чтобы заменить обычную текстовую ссылку на изображение, нужно внутрь элемента <a> поместитьтег <img>, который указывает путь к изображению.

    Попробуйте сами:

    <html>
      <body>
     
        <p>Посетите наш сайт, кликнув по картинке:
          <a href="httр://www.manuscript.kz">
            <img src="logo.png" alt="ссылка" width="100" height="78">
          </a>
        </p>
     
      </body>
    </html>

    Тег <NAV>

    Тег <nav> задает навигацию по сайту. Если на странице несколько блоков ссылок, то в <nav> обычно помещают приоритетные ссылки. Также допустимо использовать несколько тегов <nav> в документе. Запрещается вкладывать <nav> внутрь <address>.

    Синтаксис

    <nav>ссылки</nav>

    Тег SPAN

    Описание

    Тег <span> предназначен для определения строчных элементов документа. В отличие от блочных элементов, таких как <table><p> или <div>, с помощью тега <span> можно выделить часть информации внутри других тегов и установить для нее свой стиль. Например, внутри абзаца (тега <p>) можно изменить цвет и размер первой буквы, если добавить начальный и конечный тег <span> и определить для него стиль текста. Чтобы не описывать каждый раз стиль внутри тега, можно выделить стиль во внешнюю таблицу стилей, а для тега добавить атрибут class или id с именем селектора.

    Синтаксис

    <span>...</span>

    Закрывающий тег обязателен.

    Атрибуты

    Для этого тега доступны универсальные атрибуты и события.

    Пример

    <!DOCTYPE HTML>
    <html> 
        <head>  
          <meta charset="utf-8">  
        <title>Тег SPAN</title>  
        <style>    
            body {      
              font-family: Arial, sans-serif; /* Рубленый шрифт */     }    
          .letter {      
              color: red; /* Красный цвет символов */      
            font-size: 200%; /* Размер шрифта в процентах */      
            font-family: serif; /* Шрифт с засечками */      
            position: relative; /* Относительное позиционирование */      
            top: 5px; /* Сдвиг сверху */     }  
        </style>  
      </head> 
      <body>   
          <p><span class="letter">Р</span>азумные люди приспосабливаются к окружающему миру.   Неразумные люди приспосабливают мир к себе. Вот почему прогресс определяется   действиями неразумных людей.</p>   
        <p>Бернард Шоу</p>  
      </body>
    </html>

    HTML таблицы

    Таблица — набор данных, распределенных по строкам и ячейкам. В большинстве ячеек размещаются табличные данные, остальные содержат заголовки для строк и столбцов, описывающие содержимое.

    Синтаксис

    Для создания таблицы в HTML-документе используется тег <table>, он представляет собой контейнер, в котором находится все содержимое таблицы.

    Создание таблицы всегда начинается со строк, которые определяются с помощью тега <tr>, каждая строка, в свою очередь, состоит из ячеек. Тег <tr> может содержать в себе только теги для создания ячеек.

    В HTML существует два разных тега для создания ячеек, первым из них является <td>, он создает обычные ячейки с данными. Второй вид — это тег <th>, он позволяет определять ячейки, которые содержат заголовки для столбцов или строк, содержимое таких ячеек отображается жирным начертанием и выравнивается по центру. Теги <td> и <th> могут включать в себя любые HTML-элементы, которые доступны для использования в теле документа.

    Примечание: количество столбцов в вашей таблице будет равно количеству ячеек с данными в каждой строке.

    <html>
      <body>
     
        <table border="1">
          <tr><th>Первый заголовок</th><th>Второй заголовок</th></tr>
          <tr><td>строка 1, ячейка 1</td><td>строка 1, ячейка 2</td></tr>
          <tr><td>строка 2, ячейка 1</td><td>строка 2, ячейка 2</td></tr>
        </table>
     
      </body>
    </html>

    Результат

    tabl11

    Рамка таблицы

    Тег <table> может иметь необязательный атрибут border, управляющий границами таблицы. По умолчанию браузеры не отображают рамку вокруг таблицы и ячеек, но присутствие атрибута border, указывает браузеру, что у таблицы должна быть рамка.

    По стандарту HTML5 значением атрибута border может быть либо 1, либо пустая строка (обозначается как пара двойных кавычек «»). Не важно, какое значение атрибута вы зададите, если он присутствует, то рамка будет отображаться.

    <html>
      <body>
     
        <h4>Таблица с нормальной рамкой:</h4>
        <table border="1">
          <tr><td>Первая</td><td>строка</td></tr>
          <tr><td>Вторая</td><td>строка</td></tr>
        </table>
        <h4>Таблица без рамки:</h4>
        <table>
          <tr><td>Первая</td><td>строка</td></tr>
          <tr><td>Вторая</td><td>строка</td></tr>
        </table>
     
      </body>
    </html>

    Результат

    tabl

    Если вам не нравится вид рамки у таблицы, заданный по умолчанию, т.е. двойные рамки, вы можете воспользоваться атрибутом style, прописав в нем свойство «border-collapse: collapse;», это придаст обычный вид рамке для таблицы.

    <html>
      <body>
     
        <table border="1" style="border-collapse: collapse;">
          <tr><td>ячейка 1</td><td>ячейка 2</td></tr>
          <tr><td>ячейка 3</td><td>ячейка 4</td></tr>
        </table>
     
      </body>
    </html>

    Результат

    tabl13

    Заголовок

    У всех таблиц обычно бывает заголовок, описывающий ее содержимое. Для создания заголовка таблицы используется тег <caption>, обычно он размещается сразу после открывающего тега <table>, но также он может располагаться практически в любом месте внутри таблицы между элементами строк.

    <html>
      <body>
     
        <table border="1">
          <caption>Моя первая таблица</caption>
          <tr><td>строка 1, ячейка 1</td><td>строка 1, ячейка 2</td></tr>
          <tr><td>строка 2, ячейка 1</td><td>строка 2, ячейка 2</td></tr>
        </table>
     
      </body>
    </html>

    tabl14

    Тег заголовка может содержать в себе любые элементы, которые можно использовать в теле HTML-документа. По умолчанию содержимое тега <caption> отображается над таблицей и выравнивается по ее центру. Расположение заголовка можно изменить применив к нему CSS свойство caption-side.

    Объединение столбцов или строк

    Смежные ячейки в таблице могут объединяться с целью размещения большего объема данных. Например, в таблице из четырех строк и четырех столбцов все ячейки в первой строке можно объединить и поместить в этой строке красивый заголовок. Возможно также объединение нескольких строк или столбцов.

    Для объединения смежных ячеек в строке таблицы используется атрибут colspan, в значении задается число ячеек в строке, которое вы хотите объединить.

    Для объединения смежных ячеек в столбце таблицы используется атрибут rowspan, в значении задается число ячеек столбца, которое вы хотите объединить.

    <html>
      <body>
     
        <h4>Объединим две ячейки в строке таблицы:</h4>
        <table border="1">
          <tr>
            <th>Имя</th><th colspan="2">Телефон</th>
          </tr>
          <tr>
            <td>Петя Иванов</td><td>123 45 67</td><td>234 56 78</td>
          </tr>
        </table>
         
        <h4>Объединим две ячейки в столбце таблицы:</h4>
        <table border="1">
          <tr>
            <th>Имя</th><td>Петя Иванов</td>
          </tr>
          <tr>
            <th rowspan="2">Телефон</th><td>123 45 67</td>
          </tr>
          <tr><td>234 56 78</td></tr>
        </table>
     
      </body>
    </html>

    tabl_obied

    Вложенные элементы внутри таблицы

    Как мы уже писали раньше, ячейки таблицы могут включать в себя любые HTML-элементы, даже элемент <table>, то есть существует возможность создания вложенных таблиц.

    <html>
      <body>
     
        <table border="1">
          <tr>
            <td><p>Абзац.</p><p>Другой абзац.</p></td>
            <td>В этой ячейке разместим таблицу:
              <table border="1">
                <tr><td>А</td><td>Б</td></tr>
                <tr><td>В</td><td>Г</td></tr>
              </table>
            </td>
          </tr>
          <tr>
              <td><a href="httр://www.puzzleweb.ru"> Ссылка </a></td><td>ПРИВЕТ!</td>
          </tr>
        </table>
     
      </body>
    </html>

    tabl15

    Теги таблицы

    Тег Описание
    <table> Создает таблицу.
    <th> Создает заголовочную ячейку в таблице.
    <tr> Создает строку в таблице.
    <td> Создает ячейку таблицы.
    <caption> Определяет заголовок для таблицы.
    <colgroup> Определяет одну или несколько колонок в таблице для форматирования.
    <col> Используется в таблице, определяет свойства для каждой колонки внутри элемента colgroup.
    <thead> Группирует заголовочные ячейки таблицы.
    <tbody> Группирует основное содержимое в таблице.
    <tfoot> Определяет нижнюю часть таблицы.

    Заключение:

    1. Тег <a> является одним из важных элементов HTML и предназначен для создания ссылок. В зависимости от присутствия атрибутов name или hrefтег <a> устанавливает ссылку или якорь. Якорем называется закладка внутри страницы, которую можно указать в качестве цели ссылки. При использовании ссылки, которая указывает на якорь, происходит переход к закладке внутри веб-страницы.Для создания ссылки необходимо сообщить браузеру, что является ссылкой, а также указать адрес документа, на который следует сделать ссылку. В качестве значения атрибута href используется адрес документа (URL, Universal Resource Locator, универсальный указатель ресурсов), на который происходит переход. Адрес ссылки может быть абсолютным и относительным. Абсолютные адреса работают везде и всюду независимо от имени сайта или веб-страницы, где прописана ссылка. Относительные ссылки, как следует из их названия, построены относительно текущего документа или корня сайта.

      Синтаксис

      <a href="URL">...</a><a name="идентификатор">...</a>

      Атрибуты

       TitleДобавляет всплывающую подсказку к тексту ссылки.

      Href Задает адрес документа, на который следует перейти.

    2. Тег <nav> задает навигацию по сайту. Если на странице несколько блоков ссылок, то в <nav> обычно помещают приоритетные ссылки. Также допустимо использовать несколько тегов <nav> в документе. Запрещается вкладывать <nav> внутрь <address>.
      <nav>ссылки</nav>
    3.  С помощью тега <span> можно выделить часть информации внутри других тегов и установить для нее свой стиль. Например, внутри абзаца (тега <p>) можно изменить цвет и размер первой буквы, если добавить начальный и конечный тег <span> и определить для него стиль текста.
    4. Элемент <table> служит контейнером для элементов, определяющих содержимое таблицы. Любая таблица состоит из строк и ячеек, которые задаются с помощью тегов <tr> и <td>. Внутри <table> допустимо использовать следующие элементы:

      Теги таблицы

      Тег Описание
      <table> Создает таблицу.
      <th> Создает заголовочную ячейку в таблице.
      <tr> Создает строку в таблице.
      <td> Создает ячейку таблицы.
      <caption> Определяет заголовок для таблицы.
      <colgroup> Определяет одну или несколько колонок в таблице для форматирования.
      <col> Используется в таблице, определяет свойства для каждой колонки внутри элемента colgroup.
      <thead> Группирует заголовочные ячейки таблицы.
      <tbody> Группирует основное содержимое в таблице.
      <tfoot> Определяет нижнюю часть таблицы.

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

      Синтаксис

      <table border="1">
           <caption>Моя первая таблица</caption>
           <tr><td>строка 1, ячейка 1</td><td>строка 1, ячейка 2</td></tr>
           <tr><td>строка 2, ячейка 1</td><td>строка 2, ячейка 2</td></tr>
         </table>

    Для объединения смежных ячеек в строке таблицы используется атрибут colspan, в значении задается число ячеек в строке, которое вы хотите объединить.

    Для объединения смежных ячеек в столбце таблицы используется атрибут rowspan, в значении задается число ячеек столбца, которое вы хотите объединить.

    Онлайн сайты по генерации стилей.

    http://www.colorzilla.com/gradient-editor/

    http://enjoycss.com/

    http://css3generator.com/

    http://www.css3maker.com/

    http://www.csstablegenerator.com/

    http://tablestyler.com/

    http://html-generator.weebly.com/css-table-generator.html

    http://www.textfixer.com/tutorials/css-tables.php

    http://www.patterncooler.com/

    http://paletton.com/

    http://colorschemedesigner.com/csd-3.5/

    https://color.adobe.com/ru/

  • Задание к уроку 5 PHP. Загрузка файла и отправка email

    Задание:

    Написать обработчик загрузки изображения и отправить уведомление на почту.

    Загрузка файла.

    Подготовим наш документ:

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>Загрузка файла</title>
    </head>
    <body>
     <form action="upload.php" method="post" enctype="multipart/form-data">
     <input type="file" name="fileToUpload" id="fileToUpload">
     <input type="submit" value="Загрузить изображение" name="submit">
     </form>
    </body>
    </html>

    [spoiler title=»Решение»]

    Далее нужно написать скрипт обработки изображения и загрузки его на сервер:

    <?
    $type = explode('/', $_FILES['fileToUpload']['type'])[1];
    if($type == "jpeg" or $type == "png" or $type == "bmp" or $type == "gif") {
      $filename = 'my_first_uploaded_image.' . $type;
      $uploaddir = 'uploads/';
      $uploadfile = $uploaddir . $filename;
      if(!file_exists($uploaddir)) {
        mkdir($uploaddir);
      }
      if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) {
          echo "Файл корректен и был успешно загружен. <a href='index.php'>Вернуться.</a>\n";
      } else {
          echo "Во время загрузки произошла ошибка! <a href='index.php'>Попробуйте снова.</a>\n";
      }
    } else {
      echo "Неверный тип изображения, проверьте загружаемый файл и <a href='index.php'>попробуйте снова.</a>
      <br>Типы файлов которые могут быть загружены:<br> JPEG, JPG, PNG, BMP, GIF";
    }
    ?>

    Итак теперь по порядку:

    <form action="upload.php" method="post" enctype="multipart/form-data">

    Атрибуты формы следующие:

    Аттрибут Описание
    action=»upload.php» Устанавливает какой файл будет использоваться в качестве обработчика.
    method=»post» Устанавливает метод которым будет отправлена информация
    enctype=»multipart/form-data» Устанавливает тип отправляемого файла

    $type = explode('/', $_FILES['fileToUpload']['type'])[1];

    Функция explode($delimer, $string);

    Разбивает строку на массив.

    $delimer -> Разделитель, символ по которому будет разбита строка $string

    $_FILES[‘fileToUpload‘][‘type‘] -> Глобальный массив файлов, type определяет тип отправляемого изображения.

    if($type == "jpeg" or $type == "png" or $type == "bmp" or $type == "gif") {
    ... 
    } else { echo "Неверный тип изображения, проверьте загружаемый файл и <a href='index.php'>попробуйте снова.</a> <br>Типы файлов которые могут быть загружены:<br> JPEG, JPG, PNG, BMP, GIF"; }

    Условие проверки типа  загружаемого файла, в нашем случае изображения. если условие не выполняется выводим сообщение с ошибкой, иначе загружаем файл.

      $filename = 'my_first_uploaded_image.' . $type;
      $uploaddir = 'uploads/';
      $uploadfile = $uploaddir . $filename;

    $filename -> Название нашего изображения, устанавливает статическое.

    $uploaddir -> Директория куда будем сохранять изображение

    $uploadfile -> Полный путь для сохранения изображения

    if(!file_exists($uploaddir)) {
        mkdir($uploaddir);
      }

    Проверяем существует ли наша директория, если нет то создаем ее.

    if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) {
          echo "Файл корректен и был успешно загружен. <a href='index.php'>Вернуться.</a>\n";
      } else {
          echo "Во время загрузки произошла ошибка! <a href='index.php'>Попробуйте снова.</a>\n";
      }

    Заливаем изображение на сервер, и если все прошло успешно выводим соответствующее сообщение.

    С загрузкой изображения все.

    Идем дальше отправляем уведомление на почту о том что был загружен файл и его оригинальное название.

    ...
    if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) {
          echo "Файл корректен и был успешно загружен. <a href='index.php'>Вернуться.</a>\n";
          $message = 'Загружено новое изображение с названием: ' . $_FILES['fileToUpload']['name'];
          send_email('Твой раб', $message);
      } else { ...

    Добавляем 2 строчки в условие если загрузка прошла успешно:

          $message = 'Загружено новое изображение с названием: ' . $_FILES['fileToUpload']['name'];
          send_email('Твой раб', $message);

    и дописываем в конец нашего скрипта вот такую функцию:

    function send_email($name = 'Аноним', $message = 'Я дефолтное сообщение, кажется мой хозяйн забыл меня исправить :с') {
      $subject = 'Уведомление о загрузке изображения';
      $name = "=?UTF-8?B?".base64_encode($name)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
      $to = 'mail@my-site.ru';
      #$to = 'alex@goldstudio.kz';
      $headers = "From: $name\r\n";
      $headers .= "MIME-Version: 1.0" . "\r\n";
      $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
      //var_dump($to, $subject, $message);
      $message = wordwrap($message, 70);
      $send = mail($to, $subject, $message, $headers);
    }

    Она то и будет отвечать за отправку сообщения на почту.


    Собственно вот наш готовый скрипт:

    <?
    $type = explode('/', $_FILES['fileToUpload']['type'])[1];
    if($type == "jpeg" or $type == "png" or $type == "bmp" or $type == "gif") {
      $filename = 'my_first_uploaded_image.' . $type;
      $uploaddir = 'uploads/';
      $uploadfile = $uploaddir . $filename;
      if(!file_exists($uploaddir)) {
        mkdir($uploaddir);
      }
      if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $uploadfile)) {
          echo "Файл корректен и был успешно загружен. <a href='index.php'>Вернуться.</a>\n";
          $message = 'Загружено новое изображение с названием: ' . $_FILES['fileToUpload']['name'];
          send_email('Твой раб', $message);
      } else {
          echo "Во время загрузки произошла ошибка! <a href='index.php'>Попробуйте снова.</a>\n";
      }
    } else {
      echo "Неверный тип изображения, проверьте загружаемый файл и <a href='index.php'>попробуйте снова.</a>
      <br>Типы файлов которые могут быть загружены:<br> JPEG, JPG, PNG, BMP, GIF";
    }
    function send_email($name = 'Аноним', $message = 'Я дефолтное сообщение, кажется мой хозяйн забыл меня исправить :с') {
      $subject = 'Уведомление о загрузке изображения';
      $name = "=?UTF-8?B?".base64_encode($name)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
      $to = 'mail@my-site.ru';
      #$to = 'alex@goldstudio.kz';
      $headers = "From: $name\r\n";
      $headers .= "MIME-Version: 1.0" . "\r\n";
      $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n";
      //var_dump($to, $subject, $message);
      $message = wordwrap($message, 70);
      $send = mail($to, $subject, $message, $headers);
    }
    ?>
    

    Enjoy 🙂

    [/spoiler]

  • Php урок 9. Сжатие изображений

    PHP и GD library — работа с графикой

    В этой статье рассмотрены вопросы работы в PHP c графической библиотекой GD library — открытие, вывод на экран и сохранение изображений.

    Вступление

    Обработка изображений сейчас очень востребована в скриптах языка программирования PHP. Рассмотрим наиболее частые случаи работы с графическими файлами.

    Для начала убедитесь, что у вас установлена библиотека GD library — просто запустите скрипт с функцией phpinfo(); В результате выполнения скрипта будет выведена информация об этой библиотеке (содержится в блоке gd):

    Чтение изображений

    Нашими первыми функциями будут создание нового изображения или открытие уже существующего. Пока рассмотрим лишь открытие существующего изображения:

    // переменная, которая указывает на путь к нашему изображению
    $im = @imagecreatefromjpeg('test.jpg'); 
    if ($im === false) {   
     die ('Не удается открыть изображение');
    }
    echo 'Изображение успешно открыто';

    Как видите, функция imagecreatefromjpeg() используется просто для открытия изображения типа JPEG, но не вывода его на дисплей. Переменная $im содержит путь к изображению. Если указанного файла не существует, то выдается сообщение «Не удается открыть изображение».

    Если же вы хотите открыть изображение не JPEG, а, к примеру, GIF, то нужно вызвать другую функцию:

    // переменная, которая указывает на путь к нашему изображению
    $im = @imagecreategif('test_gif.gif'); 
    if ($im === false) {
        die ('Не удается открыть изображение');
    }
    echo 'Изображение успешно открыто';

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

    Но это преодолимо. Для решения подобной проблемы мы рассмотрим универсальную функцию, которая будет открывать графические файлы всех самых распространенных типов.

    Открытие файлов разных типов

    Наша универсальная функция может открывать разные типы графических файлов путем определения расширения файла:

    $image = open_image('test_jpg.jpg'); 
    if ($image === false) {
        die ('Не удается открыть изображение');
    }
    echo 'Изображение успешно открыто'; 
    function open_image ($file) {
        // Получаем информацию об расширении файла
        $extension = strrchr($file, '.');
        $extension = strtolower($extension);
        switch($extension) {
            case '.jpg':
            case '.jpeg':
                $im = @imagecreatefromjpeg($file);
                break;
            case '.gif':
                $im = @imagecreategif($file);
                break;
             // ... и так далее
             default:
                $im = false;
                break;
        }
        return $im;
    }

    Но даже это решение не решает всех проблем: а что делать, если у файла расширение задано неправильно? Ведь JPG картинке можно запросто дать расширение GIF (test_jpg.gif) или GIF картинку назвать ‘test_gif.txt’.

    Решение будет следующее — перебор возможных способов открытия файл функциейimagecreate(). Ведь типов графических файлов (наиболее распространенных) не так и много, что позволяет довольно быстро точно определить этот самый тип.

    Вот пример такого скрипта:

    $image = open_image('test_jpg.jpg'); 
    echo 'Изображение успешно открыто'; 
    function open_image ($file) {
        # JPEG:
        $im = @imagecreatefromjpeg($file);
        if ($im !== false) { return $im; }
        # GIF:
        $im = @imagecreategif($file);
        if ($im !== false) { return $im; }
        # PNG:
        $im = @imagecreatepng($file);
        if ($im !== false) { return $im; }
        # GD File:
        $im = @imagecreategd($file);
        if ($im !== false) { return $im; }
        # GD2 File:
        $im = @imagecreategd2($file);
        if ($im !== false) { return $im; }
        # WBMP:
        $im = @imagecreatewbmp($file);
        if ($im !== false) { return $im; }
        # XBM:
        $im = @imagecreatexbm($file);
        if ($im !== false) { return $im; }
        # XPM:
        $im = @imagecreatexpm($file);
        if ($im !== false) { return $im; }
        # Попытка открыть со строки:
        $im = @imagecreatestring(file_get_contents($file));
        if ($im !== false) { return $im; }
        return false;
    }

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

    Еще можно определить тип файла через функцию getimagesize() — она возвращает массив, который содержит информацию о файле — [width, height, imageType] (ширина, высота, тип файла) — более подробно об этой функции — getimagesize.

    Теперь, когда мы знаем как правильно открыть изображение, рассмотрим функции его обработки.

    Вывод на экран и сохранение изображения

    После того, как вы откроете изображение и произведете с ним манипуляции, естественно есть желание посмотреть результаты работы. Для этого существуют специальные функции, такие как imagegif() и imagejpeg().

    Вот пример их использования:

    // Открываем изображение
    $image = open_image('test_jpg.jpg');
    // Некоторые манипуляции с изображением (изменение размера, цвета и т.п.) 
    // Вывод изображения на экран
    imagejpeg($image); 
    function open_image ($file) {
        // полный листинг функции приведен выше
    }

    Если вы выполните этот скрипт по указанной выше ссылке, то результат вас удивит: вместо изображения вы можете увидеть лишь набор непонятных символов — это будет в браузере Opera и Mozilla Firefox, браузеры на движке IE (cам Internet Explorer, Avant и Maxton) умеют корректно определять тип открываемого файла.

    Происходит это по той простой причине, что мы не отправили в браузер корректного поля заголовка Content-Type header. Ведь по умолчанию стоит тип ‘text/html‘, вот поэтому браузеры неправильно определили тип файла — вместо изображения вывели на экран текстовый файл. Что из этого получилось, вы уже видели.

    Для решения этой проблемы необходимо задать формат данных явно с помощью поля заголовка Content-Type:

    // Открываем изображение
    $image = open_image('test_jpg.jpg'); 
    // Некоторые манипуляции с изображением (изменение размера, цвета и т.п.) 
    // Отправляем поле заголовкаheader ('Content-Type: image/jpeg'); 
    // Выводим изображение на экранimagejpeg($image); 
    function open_image ($file) {
        // полный листинг функции приведен выше
    }

    Если вы теперь запустите этот скрипт, то увидите, что изображение отображается корректно во всех браузерах. Также есть возможность сохранить картинку на жесткий диск. Еще можно явно задать имя сохраняемой картинки — для этого используется второй аргумент в функции imagejpeg().

    Вот как это выглядит:

    // Открываем изображение
    $image = open_image('test_jpg.jpg');
    if ($image === false) {
     die ('Не удается открыть изображение'); 
    } 
    // Некоторые манипуляции с изображением (изменение размера, цвета и т.п.) 
    // Сохранение изображения в той же папке, что и файл test_jpg.jpg
    imagejpeg($image, 'my_image.jpg'); 
    function open_image ($file) {
        // полный листинг функции приведен выше
    }

    В результате выполнения скрипта в вашей папке появится файл my_image.jpg. Поскольку в данном случае мы не выводим изображение на дисплей, то и отправлять явно поле заголовка не обязательно.

    Вот еще несколько практических примеров использования библиотеки GD library

    Рисование полигонов

    С помощью функции imagepolygon() можно создавать полигон (многоугольник).

    Описание функции

    bool imagepolygon (resource image, array points, int num_points, int color)

    imagepolygon() создаёт многоугольник на изображении.

    image — указывает на изображение, на котором будет нарисован многоугольник

    points — это PHP-массив, содержащий вершины полигона, т.е. points[0] = x0, points[1] = y0, points[2] = x1, points[3] = y1, и т.д.

    num_points это общее количество вершин.

    color — цвет линий многоугольника, задается функцией imagecolorallocate()

    Также нам потребуется использовать функцию imagecreate () для создания изображения, задать координаты многоугольника в виде массива, количество координат и цвет линий многоугольника.

    Вот сам скрипт:

    // создаем холст (чистое изображение)
    $image = imagecreate(200, 110); 
    // цвет фона
    $bg = imagecolorallocate($image, 10, 129, 239); 
    // цвет линий
    $color = imagecolorallocate($image, 255, 255, 255); 
    // рисуем многоугольник (полигон)
    imagepolygon($image,array (0, 0,100, 90,180, 100,100,10 ),4,$color);
    // выводим изображение на экран
    header("Content-type: image/gif");
    imagegif($image);

    Поворот изображения

    Используя библиотеку GD Library с помощью функции imagerotate () можно вращать изображение на заданный угол.

    Описание функции

    resource imagerotate (resource src_im, float angle, int bgd_color)

    Осуществляет поворот изображение src_im на угол angle.

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

    // Изображение, которое мы будем переворачивать
    $image = 'ice_age.jpg'; 
    // На какое количество градусов
    // (положительные числа - против часовой, отрицательные - против нее)
    $degrees = 90; 
    // Указываем поле заголовка для типа файлов .jpg,
    // если используются другие типы заменяем на png или gif
    header('Content-type: image/jpeg'); 
    // Создаем холст (пустую картинку)
    $source = imagecreatefromjpeg($image); 
    // Поворачиваем изображение
    $rotate = imagerotate($source, $degrees, 0); 
    // Выводим повернутое изображение в браузер
    imagejpeg($rotate);

    Конвертирование изображения в серый цвет (полутоновое)

    Немного теории, чтобы были понятными алгоритмы преобразования изображения из цветного (RGB) в серое (YIQ):

    Цветовая модель – Способ распределения и задания цвета в конкретной программе или системе. Наиболее используемые в компьютерной графике и видео цветовые модели: RGB (красный, зелёный, синий), YUV (Y – сигнал, определяющий полутон или яркость, U и V – сигналы, определяющие цветность) и YIQ (цветовая модель, применяемая в видеосигналах NTSC).

    YIQ цветовая модель (YIQ color model)

    Каждый цвет в модели YIQ задается с помощью установки значений трех параметров: Y — интенсивности (luminance,) и двух цветностей I и Q, позволяющих совместно управлять созданием цвета с помощью зеленого, синего, желтого и пурпурного цветов.

    Так установка минимальных значений I и Q (0, 0) приводит к получению зеленого цвета, а установка их максимальных значений (255,255) дает пурпурный цвет. Каждая из компонент YIQ модели может изменяться в диапазоне от 0 до 255.

    Подготавливаем холст

    Первая часть скрипта выполняет функции подготовки изображения к конвертированию цвета:

    //Файл, который мы будет конвертировать
    $file = 'cat_1.jpg'; 
    // Поле заголовка
    header('Content-type: image/jpeg'); 
    // Размеры изображения
    list($width, $height) = getimagesize($file); 
    // Создаем изображение JPEG из файла
    $source = imagecreatefromjpeg($file); 
    // Создаем холст
    $bwimage= imagecreate($width, $height); 
    // Создаем 256-цветную палитру
    for ($c=0;$c<256;$c++){
      $palette[$c] = imagecolorallocate($bwimage,$c,$c,$c);
    } 
    //Функция yiq для преобразования в серый цвет
    function yiq($r,$g,$b){
      return (($r*0.299)+($g*0.587)+($b*0.114));
    }

    Генерация черно-белой картинки

    В коде присутствует два цикла for для обхода всего изображения по координатам Y и X.

    С помощью функции imagecolorat () возвращаем индекс цвета пикселя в цветовой палитре, который находится на изображении (переменная $source) в точке с координатамиxy (переменные $x$y).

    Далее идет вызов функции yiq() для преобразования цветов изображения в серые тона. В самом конце используется функция imagesetpixel() для рисования пикселя заданным цветом в точке с координатами xy на изображении image.

    // Считываем оригинальное изображение по пикселям
    for ($y=0;$y<$height;$y++){
      for ($x=0;$x<$width;$x++){
        $rgb = imagecolorat($source,$x,$y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF; 
        // Используем функцию yiq для изменения rgb-палитры
        // нашего цветного изображения, чтобы преобразовать его в серое
        $gs = yiq($r,$g,$b);
        imagesetpixel($bwimage,$x,$y,$palette[$gs]);
      }
    } 
    // Выводим в браузер преобразованное изображение
    imagejpeg($bwimage);

    И на последок  сжатие изображений

     

    <?
    function compress($path,$file)
    {
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    //error_reporting(0);
    ini_set('memory_limit', '512M');
    if($ext=='jpg' || $ext=='jpeg'|| $ext=='png')
    {
     $sfile=$path."s_".$file;
     $lfile=$path."l_".$file;
     $fullfile=$path.$file;
     if(!($im = imagecreatefromjpeg($fullfile)))
     $im = imagecreatefrompng($fullfile);
     if($im)
     {
     $iw = imagesx($im); $ih = imagesy($im);
     $k = 650 / $iw;
     if($k>1)$k=1;
     $sx = floor($iw * $k); $sy = floor($ih * $k);
     $im_m = imagecreatetruecolor($sx, $sy);
     imagealphablending( $im_m, false );
     imagesavealpha( $im_m, true );
     $transparent = imagecolorallocatealpha($im_m, 255, 255, 255,255);
    
     imagefilledrectangle($im_m, 0, 0, $sx, $sy, $transparent); 
     imagecopyresampled($im_m, $im, 0, 0, 0, 0, $sx, $sy, $iw, $ih);
     $r_l = imagejpeg($im_m,$lfile);
    
     $iw = imagesx($im); $ih = imagesy($im);
     $k = 100 / $iw;
     if($k>1)$k=1;
     $sx = floor($iw * $k); $sy = floor($ih * $k);
     $im_m = imagecreatetruecolor($sx, $sy);
     imagealphablending( $im_m, false );
     imagesavealpha( $im_m, true );
     $transparent = imagecolorallocatealpha($im_m, 255, 255, 255, 127);
     imagefilledrectangle($im_m, 0, 0, $sx, $sy, $transparent); 
     imagecopyresampled($im_m, $im, 0, 0, 0, 0, $sx, $sy, $iw, $ih);
     $r_s = imagejpeg($im_m,$sfile);
     }
    else
     {
     copy($fullfile, $lfile);
     copy($fullfile, $sfile);
     }
    }
    error_reporting(1);
    }
    ?>

    ссылка для закачки проекта. http://ikurs.kz/alexey.zip

     

  • JS Урок 2. Javascript — примеры скриптов

    Введение в JS в примерах

    Основным инструментом работы и динамических изменений на странице является DOM (Document Object Model) — объектная модель, используемая для XML/HTML-документов.

    Согласно DOM-модели, документ является иерархией.
    Каждый HTML-тег образует отдельный элемент-узел, каждый фрагмент текста — текстовый элемент, и т.п.

    Проще говоря, DOM — это представление документа в виде дерева тегов. Это дерево образуется за счет вложенной структуры тегов плюс текстовые фрагменты страницы, каждый из которых образует отдельный узел.

    Простейший документ

    Построим, для начала, дерево для следующего документа.


    Самый внешний тег — <html>, поэтому дерево начинает расти от него.

    <html>
    <head>
    <title>Заголовок</title>
    </head>
    <body>
      Прекрасный документ
    </body>
    </html>

    Внутри <html> находятся два узла: <head> и <body> — они становятся дочерними узлами для <html>.

    Теги образуют узлы-элементы (element node). Текст представлен текстовыми узлами(text node). И то и другое — равноправные узлы дерева DOM.

    Пример посложнее

    Рассмотрим теперь более жизненную страничку:

    <html>
        <head>
            <title>
                О лосях
            </title>
        </head>
        <body>
            Правда о лосях.
            <ol>
                <li>
                    Лось - животное хитрое
                </li>
                <li>
                    .. И коварное
                </li>
            </ol>
        </body>
    </html>
    

    Корневым элементом иерархии является html. У него есть два потомка. Первый -head, второй — body. И так далее, каждый вложенный тег является потомком тега выше:

    На этом рисунке синим цветом обозначены элементы-узлы, черным — текстовые элементы.

    Дерево образовано за счет синих элементов-узлов — тегов HTML.

    А вот так выглядит дерево, если изобразить его прямо на HTML-страничке:

    Кстати, дерево на этом рисунке не учитывает текст, состоящий из одних пробельных символов. Например, такой текстовый узел должен идти сразу после <ol>. DOM, не содержащий таких «пустых» узлов, называют «нормализованным».

    Пример с атрибутами и DOCTYPE

    Рассмотрим чуть более сложный документ.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <title>Документ</title>
        </head>
        <body>
            <div id="dataKeeper">Data</div>
            <ul>
                <li style="background-color:red">Осторожно</li>
                <li class="info">Информация</li>
            </ul>
            <div id="footer">Made in Russia &copy;</div>
        </body>
    </html>
    

    Это свойство управляет стилем. Оно аналогично установке стиля в CSS.Верхний тег — html, у него дети head и body, и так далее. Получается дерево тегов:

    Атрибуты

    В этом примере у узлов есть атрибуты: style, class, id. Вообще говоря, атрибуты тоже считаются узлами в DOM-модели, родителем которых является элемент DOM, у которого они указаны.

    Однако, в веб-программировании в эти дебри обычно не лезут, и считают атрибуты просто свойствами DOM-узла, которые, как мы увидим в дальнейшем, можно устанавливать и менять по желанию программиста.

    Свойства элементов

    У элементов есть масса свойств. Обычно используется максимум треть из них. Некоторые из них можно читать и устанавливать, другие — только читать.

    Есть еще и третий вариант, встречающийся в IE — когда устанавливать свойство можно только во время создания элемента.

    Рассмотрим здесь еще некоторые (не все) свойства элементов, полезные при работе с DOM.

    tagName

    Атрибут есть у элементов-тегов и содержит имя тега в верхнем регистре, только для чтения.

    Например,

    alert(document.body.tagName) // => BODY

    Например, можно установить element.style.width:style

    Исходный код этой кнопки:

    <input type="button" style="width: 300px" onclick="this.style.width = parseInt(this.style.width)-10+'px'" value="Укоротить на 10px" />
    Когда-то это свойство поддерживалось только в IE. Теперь его поддерживают все современные браузеры.Обработчик события onclick обращается в этом примере к свойствуthis.style.width, т.к значением this в обработчике события является текущий элемент (т.е сама кнопка). Подробнее об этом — во введении в события.

    Есть общее правило замены — если CSS-атрибут имеет дефисы, то для установкиstyle нужно заменить их на верхний регистр букв.

    Например, для установки свойства z-index в 1000, нужно поставить:

    element.style.zIndex = 1000

    Оно содержит весь HTML-код внутри узла, и его можно менять .innerHTML

    Свойство innerHTML применяется, в основном, для динамического изменения содержания страницы, например:

    document.getElementById('footer').innerHTML = '<h1>Bye!</h1> <p>See ya</p>'

    Пожалуй, innerHTML — одно из наиболее часто используемых свойств DOM-элемента.

    className

    Это свойство задает класс элемента. Оно полностью аналогично html-атрибуту «class».

    elem.className = 'newclass'
    
    
    
    Для того чтобы получить доступ к определенному элементу используйте document.getElementById.
    
    element = document.getElementById(id);
    

    События JavaScript

    В JavaScript, как и других объектно ориентированных языках, определен ряд событий, связанных с элементами документа. Обработчики дают возможность организовать реакцию на возникновение событий из сценария. При этом соответствующий обработчик указывается как атрибут элемента HTML-документа; значением этого атрибута является выражение JavaScript. Например,

    <div onmouseOver="this.style.bgColor='#CCCCCC'" 
               onmouseOut="this.style.bgColor='#EEEEEE'
          ">
          Наведите курсор мыши
          </div>

     

     

    — наведение и увод курсора мыши на элемент сопровождаются изменением цвета фона.

    <body onUnLoad="alert('окно закрывается!'">
    — при попытке пользователя закрыть окно и выгрузить документ выводится сообщение

    <img src="cat.jpg" onClick="showPict()">
    — при щелчке мышью по изображению выполняется некая функция showPict()

    Половина обработчиков поддерживаются практически всеми HTML-элементами ( * ). Некоторые события можно имитировать с помощью соответствующих методов. Ниже приводится список событий согласно спецификации HTML 4.0 и некоторые события, поддерживаемые MS IE. Трактовка браузеров может отличаться от стандарта и в плане применимости обработчика к тем или иным элементам

    Обработчик события Поддерживающие HTML-элементы Описание Метод
    имитации
    onAbort IMG Прерывание загрузки изображения
    onBlur A, AREA, BUTTON, INPUT, LABEL, SELECT, TEXTAREA Потеря текущим элементом фокуса, т.е. переход к другому элементу. Возникает при щелчке мышью вне элемента либо нажатии клавиши табуляции blur()
    onChange INPUT, SELECT, TEXTAREA Изменение значений элементов формы. Возникает после потерей элементом фокуса, т.е. после события blur change()
    onClick   Практически все HTML-элементы Одинарный щелчок (нажата и отпущена кнопка мыши) click()
    onDblClick   Практически все HTML-элементы Двойной щелчок
    onError IMG, WINDOW Возникновение ошибки выполнения сценария
    onFocus A, AREA, BUTTON, INPUT, LABEL, SELECT, TEXTAREA Получение элементом фокуса (щелчок мышью на элементе или очередное нажатие клавиши табуляции) focus()
    onKeyDown   Практически все HTML-элементы Нажата клавиша на клавиатуре
    onKeyPress   Практически все HTML-элементы Нажата и отпущена клавиша на клавиатуре
    onKeyUp   Практически все HTML-элементы Отпущена клавиша на клавиатуре
    onLoad BODY, FRAMESET Закончена загрузка документа
    onMouseDown    Практически все HTML-элементы Нажата кнопка мыши в пределах текущего элемента
    onMouseMove   Практически все HTML-элементы Перемещение курсора мыши в пределах текущего элемента
    onMouseOut    Практически все HTML-элементы Курсор мыши выведен за пределы текущего элемента
    onMouseOver   Практически все HTML-элементы Курсор мыши наведен на текущий элемент
    onMouseUp   Практически все HTML-элементы Отпущена кнопка мыши в пределах текущего элемента
    onMove WINDOW Перемещение окна
    onReset FORM Сброс данных формы ( щелчок по кнопке
    <input type=»reset»> )
    reset()
    onResize WINDOW Изменение размеров окна
    onSelect INPUT, TEXTAREA Выделение текста в текущем элементе
    onSubmit FORM Отправка данных формы ( щелчок по кнопке
    <input type=»submit»> )
    submit()
    onUnload BODY, FRAMESET Попытка закрытия окна браузера и выгрузки документа

    *  Практически все HTML-элементы :  все, за исключением APPLET, BASE, BASEFONT, BDO, BR, FONT, FRAME, FRAMESET, HEAD, HTML, IFRAME, ISINDEX, META, PARAM, SCRIPT, STYLE, TITLE

    Математические операторы и их использование.

    ОПЕРАТОР рекомендуемое использование Стандартное использование
    = x = y x = y
    += x += y x = x + y
    -= x -= y x = x — y
    *= x *= y x = x * y
    /= x /= y x = x / y
    %= x %= y x = x % y

    Логические операторы.

    Operator Description
    == Равно
    === Равные значения/ Равные типоы
    != Не равно
    !== Не равные значения/ не равные типы
    > Больше чем
    < Меньше чем
    >= Больше или равно чем
    <= Меньше или равно чем

     

     

    setTimeout и setInterval

    Почти все реализации JavaScript имеют внутренний таймер-планировщик, который позволяет задавать вызов функции через заданный период времени.

    setTimeout

    Синтаксис:

    var timerId = setTimeout(func/code, delay[, arg1, arg2...])

    func/codeПараметры:

    Функция или строка кода для исполнения.
    Строка поддерживается для совместимости, использовать её не рекомендуется.

    delay

    Задержка в милисекундах, 1000 милисекунд равны 1 секунде.

    arg1arg2

    Аргументы, которые нужно передать функции. Не поддерживаются в IE9-.

    Исполнение функции произойдёт спустя время, указанное в параметре delay.

    Например, следующий код вызовет alert(‘Привет’) через одну секунду:

    function func() {
      alert('Привет');
    }
    setTimeout(func, 1000);

    Если первый аргумент является строкой, то интерпретатор создаёт анонимную функцию из этой строки.

    То есть такая запись работает точно так же:

    setTimeout("alert('Привет')", 1000);

    Использование строк не рекомендуется, так как они могут вызвать проблемы при минимизации кода, и, вообще, сама возможность использовать строку сохраняется лишь для совместимости.

    Вместо них используйте анонимные функции:

    setTimeout(function() { alert('Привет') }, 1000);

    Параметры для функции и контекст

    Во всех современных браузерах, с учетом IE10, setTimeout позволяет указать параметры функции.

    Пример ниже выведет «Привет, я Вася» везде, кроме IE9-:

     

    function sayHi(who) {
      alert("Привет, я " + who);
    }
    setTimeout(sayHi, 1000, "Вася");

    …Однако, в большинстве случаев нам нужна поддержка старого IE, а он не позволяет указывать аргументы. Поэтому, для того, чтобы их передать, оборачивают вызов в анонимную функцию:

    function sayHi(who) {
      alert("Привет, я " + who);
    }
    setTimeout(function() { sayHi('Вася') }, 1000);


    Отмена исполнения

    Функция setTimeout возвращает идентификатор timerId, который можно использовать для отмены действия.

    Синтаксис: clearTimeout(timerId).

    В следующем примере мы ставим таймаут, а затем удаляем (передумали). В результате ничего не происходит.

    var timerId = setTimeout(function() { alert(1) }, 1000);
    clearTimeout(timerId);

    Следующий пример при запуске станет выводить сообщение каждые две секунды, пока вы не нажмете на кнопку «Стоп»:setInterval

    Метод setInterval имеет синтаксис, аналогичный setTimeout.

    var timerId = setInterval(func/code, delay[, arg1, arg2...])

    Смысл аргументов — тот же самый. Но, в отличие от setTimeout, он запускает выполнение функции не один раз, а регулярно повторяет её через указанный интервал времени. Остановить исполнение можно вызовом clearInterval(timerId).

    <input type="button" onclick="clearInterval(timer)" value="Стоп">
    <script>
      var i = 1;
      var timer = setInterval(function() { alert(i++) }, 2000);
    </script>

     

  • Php урок 8. Основные функции PHP

    Основные функции php для обработки строк

    strip_tags — Эта функция возвращает строку str , из которой удалены HTML и PHP тэги. Для удаления тэгов вам ничего не надо делать, php сделает все на автомате за вас. Вот видите, уже программный код не попадет в базу, а только чистый текст. В данной функции можно сделать исключения.

    Как это работает — пример использования strip_tags()

    Код php

    <?php
    $text = '
    <p>Параграф.</p>
    <!-- Комментарий -->
    Здесь текст';
     
    echo strip_tags($text);
     
    echo "\n\n-------\n";
     
    // не удалять <p>
    echo strip_tags($text, '<p>');
    ?>
    

    Вот, что получилось;

    Параграф.
    
    Здесь текст
    
    -------
    
    <p>Параграф.</p>
    
    Здесь текст

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

    Trim – очистка пробелов с начала и конца строки

    Эта функция возвращает строку str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim()удаляет следующие символы:

    » » (ASCII 32 (0x20)), символ пробела.

    «\t» (ASCII 9 (0x09)), символ табуляции.

    «\n» (ASCII 10 (0x0A)), символ перевода строки.

    «\r» (ASCII 13 (0x0D)), символ возврата каретки.

    «\0» (ASCII 0 (0x00)), NUL-байт.

    «\x0B» (ASCII 11 (0x0B)), вертикальная табуляция.

    Ну, здесь все просто, ничего сложного не вижу. Двигаемся далее

     

    addslashes — Экранирует спецсимволы в строке (strip slashes)

    Описание

    string addslashes ( string $str )

    Возвращает сроку str , в которой перед каждым спецсимволом добавлен обратный слэш (\), например, для последующего использования этой строки в запросе к базе данных. Экранируются одиночная кавычка (‘), двойная кавычка («), обратный слэш (\) и NUL (байт NULL).

    Функция addslashes() часто применяется при записи в базу данных. Предположим, если нужно внести в базу данных имя O’reilly, то символ ‘ должен быть экранирован. В большинстве баз данных для этого используется \, строка будет выглядеть как O\’reilly. Заметьте, что сам символ \ в базу данных записан не будет. Если директива конфигурации magic_quotes_sybase имеет значениеon, то символ ‘ будет экранироваться добавлением еще одного ‘ вместо \.

    Директива конфигурации magic_quotes_gpc по умолчанию имеет значение on, при этом функция addslashes() автоматически применяется ко всем данным GET, POST, и COOKIE. Не используйте addslashes() для данных, обработанных magic_quotes_gpc, чтобы избежать двойного экранирования. Для проверки состояния этой директивы используется get_magic_quotes_gpc().

    Пример использования addslashes()

    <?php
    $str = "Is your name O'reilly?";
    // выводит: Is your name O\'reilly?
    echo addslashes($str);
    ?>

    Если сказать просто, то функция не даст сделать SQL инъекцию в базу данных и не взломает ее.

    Это что касается защиты от взлома. Ну, а теперь опишу еще одну функцию, которая запретит вводить определенное количество символов. Берем, к примеру, те же комментарии, допустим, мы не хотим комментарии более 1000 символов. Для этого есть функцияstrlen

    strlen — Возвращает длину строки

    Пример использования strlen

    strlen($str)>1000

    В результате php проверит длину строки. Вот в принципе я и описал основные функции обработки строк в php. На этом, пожалуй, завершу данный пост. Есть вопросы — задавайте в комментариях, отвечу обязательно всем. Всем удачи в программировании на php.

     

    explode — Разбивает строку с помощью разделителя

     

    array explode ( string $delimiter , string $string [, int $limit ] )

    Возвращает массив строк, полученных разбиением строки string с использованием delimiter в качестве разделителя.

     

    Пример

    <?php
    
    /*
    
       Строка, которая не содержит разделителя, будет
    
       просто возвращать массив с одним значением оригинальной строки.
    
    */
    
    $input1 = "hello";
    
    $input2 = "hello,there";
    
    var_dump( explode( ',', $input1 ) );
    
    var_dump( explode( ',', $input2 ) );
    
    ?>
    

    strpos — Возвращает позицию первого вхождения подстроки

     

    mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

    Ищет позицию первого вхождения подстроки needle в строку haystack.

     

    <?php
    
    $mystring = 'abc';
    
    $findme   = 'a';
    
    $pos = strpos($mystring, $findme);
    
    
    
    // Заметьте, что используется ===.  Использование == не даст верного
    
    // результата, так как 'a' находится в нулевой позиции.
    
    if ($pos === false) {
    
        echo "Строка '$findme' не найдена в строке '$mystring'";
    
    } else {
    
        echo "Строка '$findme' найдена в строке '$mystring'";
    
        echo " в позиции $pos";
    
    }
    
    ?>

     

    filter_var — Фильтрует переменную с помощью определенного фильтра

     

    mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

    Список параметров

    variable

    Значение переменной для фильтрации.

    filter

    Идентификатор (ID) применяемого фильтра. На странице Types of filters приведен список доступных фильтров.

     

    Если не указан, то используется FILTER_DEFAULT, который равнозначен FILTER_UNSAFE_RAW. Это значит, что по умолчанию не применяется никакого фильтра.

     

    options

    Ассоциативный массив параметров либо логическая дизъюнкция (операция ИЛИ) флагов. Если фильтр принимает параметры, флаги могут быть указаны в элементе массива «flags». Для фильтра «callback» должен быть указан тип callable. Фильтр «callback» должен принимать один аргумент, значение для фильтрации, и возвращать значение после фильтрации.

     

    <?php
    
    // используйте этот формат для фильтров с дополнительными параметрами
    
    $options = array(
    
        'options' => array(
    
            'default' => 3, // значение, возвращаемое, если фильтрация завершилась неудачей
    
            // другие параметры
    
            'min_range' => 0
    
        ),
    
        'flags' => FILTER_FLAG_ALLOW_OCTAL,
    
    );
    
    $var = filter_var('0755', FILTER_VALIDATE_INT, $options);
    
    
    
    // для фильтра, который принимает только флаги, вы можете передать их непосредственно
    
    $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
    
    
    
    // для фильтра, который принимает только флаги, вы так же можете передать их как массив
    
    $var = filter_var('oops', FILTER_VALIDATE_BOOLEAN,
    
                      array('flags' => FILTER_NULL_ON_FAILURE));
    
    
    
    // callback-фильтр валидации
    
    function foo($value)
    
    {
    
        // Ожидаемый формат: Фамилия, Имена
    
        if (strpos($value, ", ") === false) return false;
    
        list($surname, $givennames) = explode(", ", $value, 2);
    
        $empty = (empty($surname) || empty($givennames));
    
        $notstrings = (!is_string($surname) || !is_string($givennames));
    
        if ($empty || $notstrings) {
    
            return false;
    
        } else {
    
            return $value;
    
        }
    
    }
    
    $var = filter_var('Doe, Jane Sue', FILTER_CALLBACK, array('options' => 'foo'));
    
    ?>

    Возвращаемые значения

     

    Возвращает отфильтрованные данные или FALSE, если фильтрация завершилась неудачей.

     

    Примеры

     

    Пример #1 Пример использования filter_var()

     

    <?php
    
    var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
    
    var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
    
    ?>

    Результат выполнения данного примера:

     

    string(15) "bob@example.com"

    bool(false)

     

     

    Фильтры валидации данных

     

    Список фильтров валидации данных

    ID Имя Параметры Флаги Описание
    1 FILTER_VALIDATE_BOOLEAN «boolean» default FILTER_NULL_ON_FAILURE Возвращает TRUE для значений «1», «true», «on» и «yes». Иначе возвращает FALSE.

     

    Если установлен флаг FILTER_NULL_ON_FAILURE, то FALSE возвращается только для значений «0», «false», «off», «no» и «», а NULL будет возвращен для всех небулевых значений.

     

    2 FILTER_VALIDATE_EMAIL «validate_email» default Проверяет, что значение является корректным e-mail.
    3 FILTER_VALIDATE_FLOAT «float» default, decimal FILTER_FLAG_ALLOW_THOUSAND Проверяет, что значение является корректным числом с плавающей точкой.

     

    4 FILTER_VALIDATE_INT «int» default, min_range, max_range FILTER_FLAG_ALLOW_OCTAL, FILTER_FLAG_ALLOW_HEX Проверяет, что значение является корректным целым числом, и, при необходимости, входит в определенный диапазон.
    5 FILTER_VALIDATE_IP «validate_ip» default FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE Проверяет, что значение является корректным IP-адресом, при необходимости только для протоколов IPv4 или IPv6, а также отсутствие вхождения в частные или зарезервированные диапазоны.

     

    6 FILTER_VALIDATE_REGEXP «validate_regexp» default, regexp Проверяет значение на соответствие regexp, Perl-совместимому регулярному выражению.

     

    7 FILTER_VALIDATE_URL «validate_url» default                FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED Проверяет значение на корректность URL (в соответствии с » http://www.faqs.org/rfcs/rfc2396), при желании можно указать обязательные компоненты. Имейте в виду, что корректная ссылка может не содержать HTTP-протокол http://, т.е. необходима еще одна проверка, определяющая наличие необходимого протокола у ссылки, например, ssh:// или mailto:. Обратите внимание, что функция работает только с ASCII-ссылками, таким образом, интернациональные доменные имена (содержащие не-ASCII символы) не пройдут проверку.

     

     

    Замечание:

    Начиная с PHP 5.4.11, числа +0 и -0 проверяются оба и как целые и как числа с плвающей точкой (используя FILTER_VALIDATE_FLOAT и FILTER_VALIDATE_INT). До версии PHP 5.4.11 они проверялись только как числа с плавающей точкой (FILTER_VALIDATE_FLOAT).

    Если естановлен параметр default, то значение defaultиспользуется, если не прошла валидаци

     

     

    substr — Возвращает подстроку

    Описание

    string substr ( string $string , int $start [, int $length ] )

    Возвращает подстроку строки string, начинающейся с start символа по счету и длиной length символов.

    Список параметров

    string

    Входная строка. Должна содержать хотя бы один символ.

    start

    Если start неотрицателен, возвращаемая подстрока начинается с позиции start от начала строки, считая от нуля. Например, в строке ‘abcdef’, в позиции 0 находится символ ‘a’, в позиции 2 — символ ‘c’, и т.д.

    Если start отрицательный, возвращаемая подстрока начинается с позиции, отстоящей на start символов от конца строкиstring.

    Если string меньше либо содержит ровно start символов, будет возвращено FALSE.

    Пример #1 Использование отрицательного параметра start

    <?php
    $rest = substr("abcdef", -1);    // возвращает "f"
    $rest = substr("abcdef", -2);    // возвращает "ef"
    $rest = substr("abcdef", -3, 1); // возвращает "d"
    ?>

    length

    Если length положительный, возвращаемая строка будет не длиннее length символов, начиная с параметраstart (в зависимости от длины string).

    Если length отрицательный, то будет отброшено указанное этим аргументом число символов с конца строки string (после того как будет вычислена стартовая позиция, если start отрицателен). Если при этом позиция начала подстроки, определяемая аргументом start, находится в отброшенной части строки или за ней, возвращается false.

    Если указан параметр length и является одним из 0, FALSE или NULL, то будет возвращена пустая строка.

    Если параметр length опущен, то будет возвращена подстрока, начинающаяся с позиции, указанной параметром start и длящейся до конца строки.

    Пример #2 Использование отрицательного параметра length

    <?php
    $rest = substr("abcdef", 0, -1);  // возвращает "abcde"
    $rest = substr("abcdef", 2, -1);  // возвращает "cde"
    $rest = substr("abcdef", 4, -4);  // возвращает false
    $rest = substr("abcdef", -3, -1); // возвращает "de"
    ?>

    Возвращаемые значения

    Возвращает извлеченную часть строки, или FALSE в случае возникновения ошибки или пустую строку string.

     

    Примеры с использованием функций.

    <meta charset='utf-8'>
    <?
    //--------------Валидация данных-----------------------------
    
    if(isset($_GET['email']))
    {
      $pos=mb_strpos($_GET['email'],"@");
      echo $login=substr($_GET['email'],0,$pos);
      echo "<hr>";
      echo $_GET['email'];
      if(filter_var($_GET['email'], FILTER_VALIDATE_EMAIL) !== false)
      {
        echo "Валидация емайла прошла успешно";
      }
      
      else
      {
        echo "Валидация емайла не пройдена";
      }
    
    }
    //----------------защита sql запросов; SQL инъекции---------
    /*$data="'данные'";
    $data=addslashes($data);
    echo "{$data}";
    echo "<br>";
    echo$data=stripslashes($data);
    echo "<br>";
    $p="');delete from users;";
    mysql_query("insert into user (`user`,`password`) values ('{$u}','{$p}')");
    "insert into user (`user`,`password`) values ('fff','');delete from users;')"*/
    
    //===========удаляем теги используя  strip_tags===============
    $_GET['otziv']=strip_tags($_GET['otziv'],"<h1><p>");
    //задаем кодировку mb_internal_encoding
    
    //==============Блокируем стоп слова============================
    mb_internal_encoding("utf-8");
    //задаем преобразуем в нижний регистр mb_strtolower
    $lower=mb_strtolower($_GET['otziv']);
    $stop=array("дурак","спам","идиот");
    
    foreach($stop as $word)//для каждого элемента массива $stop как $word
    {
    if(mb_strpos($lower,$word)!==false)	//проверяем есть ли стоп слово
      {
      echo "Обнаружено запрещенное слово.";
      $_GET['otziv']="Удалено за нарушение правил сайта. ";
      break;
      }
      
    }
    echo $_GET['otziv'];
    //======================Форма с перечислением===============
    echo $_GET['tel'];
    echo "<hr>";
    $tel_array=explode(",",$_GET['tel']);//преобзаовать строку в массив 
    $cnt=1;
    foreach($tel_array as $tel)
    {	
      $tel=trim($tel);// удаляем пробелы в начале и в конце строки
      if(strlen($tel)<1)//защита от пустых данных
          continue;
      echo  "телефон ".$cnt.": ".$tel;
      echo "<br>";
      $cnt++;
    }
    ?>
    <head>
      <style>
        input{width:100%;}
        textarea{width:100%;height:300px;}
      </style>
    </head>
    <h1>Валидация данных.</h1>
    <hr>
    <form>
    Ваш емайл<br>
    <input name='email' type='email' required ><br><br>
    <input type='submit'>
    
    </form>
    
    <h1>Введите телефоны через запятую.</h1>
    <hr>
    <form>
    Контактные телефоны<br>
    <input name='tel' ><br><br>
    <input type='submit'>
    
    </form>
    <h1>Форма оставить комментарий.Защита данных.</h1>
    <hr>
    <form>
    Ваше имя<br>
    <input name='user' ><br><br>
    Ваш отзыв<br>
    <textarea name='otziv'></textarea><br><br>
    <input type='submit'>
    
    </form>

     

  • Php урок 7. .htaccess и $_SERVER

    .htaccess

    htaccess (с точкой в начале имени) – это файл, который дает возможность конфигурировать работу сервера в отдельных директориях (папках), не предоставляя доступа к главному конфигурационному файлу. Например, устанавливать права доступа к файлам в директории, менять названия индексных файлов, самостоятельно обрабатывать ошибки Apache, перенаправляя посетителей на специальные страницы ошибок.

    Как известно, конфигурационные директивы сервера Apache находятся в файлe httpd.conf. Но далеко не всегда у Вас будут права доступа к этому файлу. Например, если Вы используете для хостинга виртуальный сервер, когда один сервер Apache обслуживает множество сайтов, то, естественно, Вам никто не позволит менять его конфигурацию. Но, тем не менее, вы можете конфигурировать работу сервера в своих директориях. И делать вы это можете с помощью файлов .htaccess.

    Файл .htaccess может быть размещен в любом каталоге. Директивы этого файла действует на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess).

    Изменения, вносимые в файлы .htaccess, вступают в силу немедленно и не требуют перезагрузки сервера, в отличие от изменений, вносимых в главный конфигурационный файл httpd.conf.

    Настройки httpd.conf, разрешающие применение файлов .htaccess

    Для того, что бы эти файлы .htaccess можно было использовать — необходимы соответствующие настройки главного конфигурационного файла. В файле httpd.conf должны быть прописаны директивы, которые разрешат файлу .htaccess переопределять конфигурацию web-сервера в каталоге. Эта директива называется AllowOverride. Она может быть установлена как для всего сервера (глобально), так и для отдельного каталога.

    Директива AllowOverride может включать в себя одну из следующих директив или их комбинацию: All, None, AuthConfig, FileInfo, Indexes, Limit, Options.

    Для того чтобы дать директивам файлов .htaccess максимальные права следует прописать в httpd.conf:

    AllowOverride All

    Примечание

    При желании название конфигурационного файла можно изменить, и например, назвать его не .htaccess, a access.conf. За название этого файла отвечает директива AccessFileName в файле httpd.conf. Но все же рекомендуется этого не делать.

    Синтаксис .htaccess

    Перед тем, как будут рассмотрены примеры, остановимся на синтаксисе директив в файлах .htaccess.

    Пути к файлам и директориям должны указываться от корня сервера, например, /pub/home/server1/html/

    Если вы не знаете путь от корня сервера, то Вы можете его узнать, спросив у администратора сервера, либо можете посмотреть сами, запустив на сайте функцию PHP — phpinfo(). Она выведет на экран конфигурацию PHP в виде фиолетовых таблиц. В них Вам необходимо найти переменную doc_root и посмотреть ее значение — это будет путь от корня сервера до Вашей основной директории.

    • В именах доменов обязательно должны быть указаны протоколы, например:

    Redirect / http://www.newsite.ru

    Примеры использования .htaccess

    Глобальное перенаправление (редирект) на другой адрес:

    Redirect / http://www.newsite.ru

    Перенаправление (редирект) только при запросе определенных страниц:

    redirect /company http://www.newsite.com/newcompany 
    redirect /forum http://www.newsite.com/newforum

    При запросе страниц из каталогов company и forum будет произведено перенаправление на новые адреса.

    Перенаправление (редирект) только посетителей с определенным IP-адресом:

    SetEnvIf REMOTE_ADDR 192.145.121.1 REDIR="redir" 
    RewriteCond %{REDIR} redir 
    RewriteRule ^/$ /only_for_you.html

    Если посетитель имеет IP-адрес 192.145.121.1, то ему будет открыта страница only_for_you.html.

    Изменение названия индексной страницы:

    DirectoryIndex index.html index.php index.shtml

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

    Выполнять код PHP в файлах HTML

    RemoveHandler .html .htm 
    AddType application/x-httpd-php .php .htm .html .phtml

    Добавив эти строки в .htaccess вы дадите директиву серверу выполнять инструкции PHP не только в файлах с расширением *.php и *.phtml, но и в файлах с расширением *.htm и *.html.

    Обработка ошибок Apache

    ErrorDocument 401 /401.html 
    ErrorDocument 403 /403.html 
    ErrorDocument 404 /404.html 
    ErrorDocument 500 /500.html

    При возникновении этих ошибок посетитель будет перенаправлен на специально созданные страницы.

    401 ошибка — Требуется авторизация (Authorization Required).

    403 ошибка — пользователь не прошел аутентификацию, доступ запрещен (Forbided).

    404 ошибка — Документ не найден (Not Found).

    500 ошибка — Внутренняя ошибка сервера (Internal Server Error).

    Запрет на отображение содержимого каталога при отсутствии индексного файла

    Options –Indexes

    Определение кодировки, в которой сервер «отдает» файлы

    AddDefaultCharset windows-1251

    Определение кодировки на загружаемые файлы

    CharsetSourceEnc windows-1251

    Запрет доступа ко всем файлам

    deny from all

    Запрещен доступ ко всем файлам и каталогам в текущей директории.

    Разрешить доступ только с определенного IP-адреса

    order deny,allow 
    deny from all 
    allow from 195.135.232.70

    Строка order deny,allow определяет, в каком порядке следует выполнять директивы. Сначала выполняется директива запрета доступа, а затем разрешается доступ только для IP-адреса 195.135.232.70. Если в первой строке поменять порядок следования директив на order allow,deny, то доступ для данного IP-адреса не будет открыт, так как директива deny, выполняемая последней перекроет действия директивы allow.

    Запретить доступ с определенного IP-адреса

    deny from 195.135.232.70

    Запретить доступ к определенному файлу

    <Files config.php> 
      deny from all 
    </Files>

    Запрещен доступ посетителей к файлам config.php. Этот запрет не действует на скрипты web-сервера. Они по прежнему будут иметь доступ к этому файлу.

    Запретить доступ к файлам с определенным расширением

    <Files "*.conf"> 
      deny from all 
    </Files>

    Здесь запрещен доступ к файлам с расширением *.conf. Директива , при указании имени файлов, позволяет использовать подстановочные символы.

    ? — любой одиночный символ
    * — любая последовательность символов, исключая символ / (слеш)

    Запретить доступа к файлам с несколькими типа расширений

    <Files ~ "\.(inc|conf|cfg)$"> 
      deny from all 
    </Files>

    Запрещен доступ к файлам с расширением *.inc, *.conf и *.cfg. Хотя директива , по умолчанию, не работает с регулярными выражениями, но их можно включить поставив символ тильды(~) в опциях директивы. Синтаксис следующий:
    [тильда] [пробел] [далее_все_без_пробелов]

    Установка пароля на директорию

    <Files>
    AuthName "Admin page" 
    AuthType Basic 
    AuthUserFile /pub/home/server/.pass 
    require valid-user 
    </Files>
    

     

     

    • Перенаправление с www на http://
    • RewriteEngine On
    • RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    • RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]

     

     

    • Обработка ошибки 404 файл не найден
    • ErrorDocument 404 /404.html

     

    • Динамически создаваемые странички
    • RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ /index.php?id=$1 [NC,L,QSA]

     

     

     

     

     

     

     

    $_SERVER

    $HTTP_SERVER_VARS [удалено]

    (PHP 4 >= 4.1.0, PHP 5)

    $_SERVER — $HTTP_SERVER_VARS [удалено] — Информация о сервере и среде исполнения

    Описание

    Переменная $_SERVER — это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов. Записи в этом массиве создаются веб-сервером. Нет гарантии, что каждый веб-сервер предоставит любую из них; сервер может опустить некоторые из них или предоставить другие, не указанные здесь. Тем не менее, многие эти переменные присутствуют в » спецификации CGI/1.1, так что вы можете их ожидать их реализации и в конкретном веб-сервере.

    Переменная $HTTP_SERVER_VARS содержит ту же начальную информацию, но она не суперглобальная. (Заметьте, что$HTTP_SERVER_VARS и $_SERVER являются разными переменными, так что PHP обрабатывает их соответственно). Также учтите, что «длинные массивы» были удалены в версии PHP 5.4.0, поэтому $HTTP_SERVER_VARS больше не существует.

    Индексы

    Вы можете найти (а можете и не найти) любой из следующих элементов в массиве $_SERVER. Заметьте, что немногие элементы, если вобще такие найдутся, будут доступны (или действительно будут иметь значение), если PHP запущен в командной строке.

    ‘PHP_SELF’

    Имя файла скрипта, который сейчас выполняется, относительно корня документов. Например,$_SERVER[‘PHP_SELF’] в скрипте по адресу http://example.com/foo/bar.php будет /foo/bar.php. Константа __FILE__ содержит полный путь и имя файла текущего (то есть подключенного) файла. Если PHP запущен в командной строке, эта переменная содержит имя скрипта, начиная с PHP 4.3.0. Раньше она была недоступна.

    argv

    Массив агрументов, переданных скрипту. Когда скрипт запущен в командой строке, это дает C-подобный доступ к параметрам командной строки. Когда вызывается через метод GET, этот массив будет содержать строку запроса.

    argc

    Содержит количество параметров, переданных скрипту (если запуск произведен в командной строке).

    ‘GATEWAY_INTERFACE’

    Содержит используемую сервером версию спецификации CGI; к примеру’CGI/1.1‘.

    ‘SERVER_ADDR’

    IP адрес сервера, на котором выполняется текущий скрипт.

    ‘SERVER_NAME’

    Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определенное для этого виртуального хоста.

    ‘SERVER_SOFTWARE’

    Строка идентификации сервера, указанная в заголовках, когда происходит ответ на запрос.

    ‘SERVER_PROTOCOL’

    Имя и версия информационного протокола, через который была запрошена страница; к примеру ‘HTTP/1.0‘;

    ‘REQUEST_METHOD’

    Какой метод был использован для запроса страницы; к примеру ‘GET‘, ‘HEAD‘, ‘POST‘, ‘PUT‘.

    Замечание:

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

    ‘REQUEST_TIME’

    Временная метка начала запроса. Доступна, начиная с PHP 5.1.0.

    ‘REQUEST_TIME_FLOAT’

    Временная метка начала запроса с точностью до микросекунд. Доступна, начиная с PHP 5.4.0.

    ‘QUERY_STRING’

    Строка запросов, если есть, с помощью которой была получена страница.

    ‘DOCUMENT_ROOT’

    Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.

    ‘HTTP_ACCEPT’

    Содержимое заголовка Accept: из текущего запроса, если он есть.

    ‘HTTP_ACCEPT_CHARSET’

    Содержимое заголовка Accept-Charset: из текущего запроса, если он есть. Например: ‘iso-8859-1,*,utf-8‘.

    ‘HTTP_ACCEPT_ENCODING’

    Содержимое заголовка Accept-Encoding: из текущего запроса, если он есть. Например: ‘gzip‘.

    ‘HTTP_ACCEPT_LANGUAGE’

    Содержимое заголовка Accept-Language: из текущего запроса, если он есть. Например: ‘en‘.

    ‘HTTP_CONNECTION’

    Содержимое заголовка Connection: из текущего запроса, если он есть. Например: ‘Keep-Alive‘.

    ‘HTTP_HOST’

    Содержимое заголовка Host: из текущего запроса, если он есть.

    ‘HTTP_REFERER’

    Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER. Одним словом, в самом деле ему нельзя доверять.

    ‘HTTP_USER_AGENT’

    Содержимое заголовка User-Agent: из текущего запроса, если он есть. Эта строка содержит обозначение браузера, которым пользователь запросил данную страницу. Типичным примером является строка: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Среди прочего, вы можете использовать это значение с функцией get_browser() чтобы адаптировать вывод вашей страницы к возможностям браузера пользователя

    ‘HTTPS’

    Принимает непустое значение, если запрос был произведен через протокол HTTPS.

    Замечание: Обратите внимание, что при использовании ISAPI с IIS значение будет off, если запрос не был произведен через протокол HTTPS.

    ‘REMOTE_ADDR’

    IP-адрес, с которого пользователь просматривает текущую страницу.

    ‘REMOTE_HOST’

    Удаленный хост, с которого пользователь просматривает текущую страницу. Обратный просмотр DNS базируется на значении переменной REMOTE_ADDR.

    Замечание: Ваш веб-сервер должен быть настроен, чтобы создавать эту переменную. Для примера, в Apache вам необходимо присутствие директивы HostnameLookups On в файле httpd.conf, чтобы эта переменная создавалась. См. такжеgethostbyaddr().

    ‘REMOTE_PORT’

    Порт на удаленной машине, который используется для связи с веб-сервером.

    ‘REMOTE_USER’

    Аутентифицированный пользователь.

    ‘REDIRECT_REMOTE_USER’

    Аутентифицированный пользователь, если запрос был перенаправлен изнутри.

    ‘SCRIPT_FILENAME’

    Абсолютный путь к скрипту, который в данный момент исполняется.

    Замечание:

    Если скрипт запускается в коммандной строке (CLI), используя относительный путь, такой как file.php или ../file.php, переменная $_SERVER[‘SCRIPT_FILENAME’] будет содержать относительный путь, указанный пользователем.

    ‘SERVER_ADMIN’

    Эта переменная получает свое значение (для Apache) из директивы конфигурационного файла сервера. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для данного виртуального хоста.

    ‘SERVER_PORT’

    Порт на компьютере сервера, используемый веб-сервером для соединения. Для установок по умолчанию, значение будет ‘80‘; используя SLL, например, это значение будет таким, какое сконфигурировано для соединений безопасного HTTP.

    Замечание: Чтобы получить физический (реальный) порт в Apache 2, необходимо установить UseCanonicalName = On иUseCanonicalPhysicalPort = On, иначе это значение может быть подменено и не вернуть реальной значение физического порта. Полагаться на это значение небезопасно в контексте приложений, требующих усиленной безопасности.

    ‘SERVER_SIGNATURE’

    Строка, содержащая версию сервера и имя виртуального хоста, которые добавляются к генерируемым сервером страницам, если включено.

    ‘PATH_TRANSLATED’

    Filesystem- (not document root-) based path to the current script, after the server has done any virtual-to-real mapping.

    Замечание: Начиная с PHP 4.3.2, переменная PATH_TRANSLATED больше не устанавливается неявно в Apache 2 SAPI, по сравнению с Apache версии 1, где она устанавливается в то же самое значение, что и переменная SCRIPT_FILENAME, когда она не используется Apache. Это изменение было сделано для соответствия спецификации CGI, где переменнаяPATH_TRANSLATED должна существовать только тогда, когда PATH_INFO определена. Пользователи Apache 2 могут использовать директиву AcceptPathInfo = On в конфигурационном файле httpd.conf для задания переменной PATH_INFO.

    ‘SCRIPT_NAME’

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

    ‘REQUEST_URI’

    URI, который был передан для того, чтобы получить доступ к этой странице. Например, ‘/index.html‘.

    ‘PHP_AUTH_DIGEST’

    При выполнении HTTP Digest аутентификации, этой переменной присваивается заголовок ‘Authorization’, который присылается клиентом (его необходимо потом использовать для соответствующей валидации).

    ‘PHP_AUTH_USER’

    Когда выполняется HTTP-аутентификация, этой переменной присваивается имя пользователя, предоставленное пользователем.

    ‘PHP_AUTH_PW’

    Когда выполняется HTTP-аутентификация, этой переменной присваивается пароль, предоставленный пользователем.

    ‘AUTH_TYPE’

    Когда выполняется HTTP-аутентификация, этой переменной присваивается тип аутентификации, который используется.

    ‘PATH_INFO’

    Содержит любой предоставленный пользователем путь, содержащийся после имени скрипта, но до строки запроса, если доступно. Например, если текущий скрипт запрошен по URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, то переменная $_SERVER[‘PATH_INFO’] будет содержать /some/stuff.

    ‘ORIG_PATH_INFO’

    Исходное значение переменной ‘PATH_INFO’ до начала обработки PHP.

    Список изменений ¶

    Версия Описание
    5.4.0 Массив $HTTP_SERVER_VARS больше не доступен в связи с удалением «длинных массивов».
    5.3.0 Директива register_long_arrays, которая приводила к заполнению $HTTP_SERVER_VARS помечена как устаревшая.
    4.1.0 Введена переменная $_SERVER вместо старой $HTTP_SERVER_VARS.

    Примеры ¶

    Пример #1 Пример использования $_SERVER

    <?php
    echo $_SERVER['SERVER_NAME'];
    ?>

    Результатом выполнения данного примера будет что-то подобное:

    www.example.com

    Примечания

    Замечание:

    Это ‘суперглобальная’ или автоматическая глобальная переменная. Это просто означает что она доступна во всех контекстах скрипта. Нет необходимости выполнять global  $variable; для доступа к ней внутри метода или функции.

    Смотрите также

     

     

    Для проверки правильных настроек сжатия и кэширования используйте

    https://developers.google.com/speed/pagespeed/insights/?url=ipage.com&tab=mobile

     

     

    Включаем сжатие

    <IfModule mod_deflate.c>
    
        #The following line is enough for .js and .css
    
        AddOutputFilter DEFLATE js css
    
        AddOutputFilterByType DEFLATE text/plain text/xml application/xhtml+xml text/css   application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php application/x-httpd-fastphp text/html
    
    
    
        #The following lines are to avoid bugs with some browsers
    
        BrowserMatch ^Mozilla/4 gzip-only-text/html
    
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
    
        BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
    </IfModule>

    Настраиваем и включаем кэширование.

    ExpiresActive On

    ExpiresDefault A0

     

    # 1 YEAR - doesn't change often
    
    <FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
    
    ExpiresDefault A31536000
    
    </FilesMatch>

     

    # 1 WEEK - possible to be changed, unlikely
    
    <FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
    
    ExpiresDefault A604800
    
    </FilesMatch>

     

    # 3 HOUR - core content, changes quickly
    
    <FilesMatch "\.(txt|xml|js|css)$">
    
    ExpiresDefault A10800
    
    </FilesMatch>

     

     

     

    <?
    mysql_connect("localhost","root","");//соединились с базой данных
    mysql_select_db("users");//выбрали базу данных с которой будем работать
    $param=explode("/",$_GET['id']);
    echo "<meta charset='utf-8'>";
    if($param[2]>0)//выводим статью
    {
    $table=mysql_query(
    "select * from posts where `id`='{$param[2]}'");
    while($r=mysql_fetch_array($table))
    {
    $text=str_replace("<"," <",$r['text']);
    $text=strip_tags($text);
    mb_internal_encoding("utf-8");
    $text=mb_substr($text,0,100);
    $text=trim($text);
    $text=str_replace(" ","-",$text);
    $text=str_replace("--","-",$text);
    $text=str_replace("--","-",$text);
    $text=str_replace("--","-",$text);
    echo "
    <img src='http://alexey/images/{$r['img']}' height='300px'>";
    echo "<div style='height:155px;overflow:hidden;text-overflow:ellipsis;'>{$r['text']}</div>";
    }
      
      
    }//выводим категорию
    else 
    {
    echo "<h1>Вы находитесь в категории ".$_GET['id'].".</h1><hr>";
    
    
    $table=mysql_query(
    "select * from posts where `h1`='{$_GET['id']}'");
    
    while($r=mysql_fetch_array($table))
    {
    $text=str_replace("<"," <",$r['text']);
    $text=strip_tags($text);
    mb_internal_encoding("utf-8");
    $text=mb_substr($text,0,100);
    $text=trim($text);
    $text=str_replace(" ","-",$text);
    $text=str_replace("--","-",$text);
    $text=str_replace("--","-",$text);
    $text=str_replace("--","-",$text);
    echo "<a href='http:/{$_GET['id']}/{$text}/{$r['id']}'><img src='../images/{$r['img']}' height='300px'>";
    echo "<div style='height:155px;overflow:hidden;text-overflow:ellipsis;'>{$r['text']}</div><hr><br><br>";
    }
    }
    ?>

     

  • Php урок 6. Сессии и Куки

    Сессии в PHP

    Введение

    Сессии — это на самом деле очень просто. Надо только понимать, для чего они нужны и как устроены. Ответим сначала на первый вопрос.
    Возможно Вы знаете, что веб-сервер не поддерживает постоянного соединения с клиентом, и каждый запрос обрабатывается, как новый, без связи с предыдущими.

    То есть, нельзя ни отследить запросы от одного и того же посетителя, ни сохранить для него переменные между просмотрами отдельных страниц. Вот для решения этих двух задач и были изобретены сессии.
    Собственно, сессии, если в двух словах — это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера файл на сервере, в котором хранятся переменные сеанса.

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

    В принципе, довольно несложно сделать собственный аналог сессий, не такой функциональный, как встроенный в PHP, но похожий по сути. На cookies и базе данных.

    При запросе скрипта смотрим, пришла ли cookies с определенным именем. Если cookies нет, то ставим ее и записываем в базу новую строку с данными пользователя. Если cookies есть, то читаем из базы данные. Еще одним запросом удаляем из базы старые записи и вот у нас готов механизм сессий. Совсем несложно. Но есть некоторые нюансы, которые делают предпочтительным использование именно встроенного механизма сессий.

    Как устроены, и как работают сессии?

    Для начала надо как-то идентифицировать браузер. Для этого надо выдать ему уникальный идентификатор и попросить передавать его с каждым запросом. Стыдно признаться, но когда я впервые узнал о сессиях, я думал, что это какой-то особый механизм, некий новый способ общения браузера с сервером — «сессии». Что идентификатор сессии передается каким-то особым образом. Но, разочарование было жестоким…

    Сессии используют стандартные, хорошо известные способы передачи данных. Собственно, других-то просто и нет.
    Идентификатор — это обычная переменная. По умолчанию ее имя — PHPSESSID.
    Задача PHP отправить ее браузеру, чтобы тот вернул ее со следующим запросом. Из уже упоминавшегося раздела FAQ ясно, что переменную можно передать только двумя способами: в cookies или POST/GET запросом.
    PHP использует оба варианта.

    За это отвечают две настройки в php.ini:

    session.use_cookies - если равно 1, то PHP передает идентификатор в cookies, если 0 - то нет.
    session.use_trans_sid если равно 1, то PHP передает его, добавляя к URL и формам, если 0 - то нет.

    Менять эти и другие параметры сессий можно так же, как и другие настройки PHP — в файле php.ini, а так же с помощью команды ini_set() или в файлах настройки веб-сервера

    Если включена только первая, то при старте сессии (при каждом вызове session_start()) клиенту устанавливается cookies. Браузер исправно при каждом следующем запросе эту cookies возвращает и PHP имеет идентификатор сессии. Проблемы начинаются, если браузер cookies не возвращает. В этом случае, не получая cookies с идентификатором, PHP будет все время стартовать новую сессию, и механизм работать не будет.

    Если включена только вторая, то cookies не выставляется. А происходит то, ради чего, в основном, собственно, и стоит использовать встроенный механизм сессий. После того, как скрипт выполняет свою работу, и страница полностью сформирована, PHP просматривает ее всю и дописывает к каждой ссылке и к каждой форме передачу идентификатора сессии. Это выглядит примерно так:

    <a href="/index.php">Index</a>

    превращается в

    <a href="/index.php?PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f">Index</a>

    а к формам добавляется скрытое поле

    <input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />

    И браузер при клике на любую ссылку, или при нажатии на кнопку в форме, пошлет в запросе нужную нам переменную — идентификатор сессии!

    Теоретически, в наших с вами самодельных сессиях на cookies и базе, можно самому, руками приписать ко всем ссылками передачу id- и тогда наши собственные сессии будут работать независимо от cookies. Но, согласитесь — приятнее, когда эту работу делает кто-то другой? 😉

    По умолчанию в последних версиях PHP включены обе опции. Как PHP поступает в этом случае? Кука выставляется всегда. А ссылки автодополняются только если РНР не обнаружил cookies с идентификатором сессии. Когда пользователь в первый раз за этот сеанс заходит на сайт, ему ставится cookies, и дополняются ссылки. При следующем запросе, если cookies поддерживаются, PHP видит cookies и перестает дополнять ссылки. Если cookies не работают, то PHP продолжает исправно добавлять id к ссылкам, и сессия не теряется.
    Пользователи, у которых работают cookies, увидят длинную ссылку с ID только один раз.

    С передачей идентификатора закончили. Теперь осталось привязать к нему файл с данными на стороне сервера. PHP это сделает за нас. Достаточно просто написать:

    session_start();
    $_SESSION['test']='Hello world!';

    И PHP запишет в файл, связанный с этой сессией, переменную test.

    Здесь очень важное замечание.

    Массив $_SESSION — особенный.
    В нем, собственно, и находятся переменные, которые мы ходим сделать доступными в различных скриптах.
    Чтобы поместить переменную в сессию, достаточно присвоить ее элементу массива $_SESSION.
    Чтобы получить ее значение — достаточно обратиться к тому же элементу. Пример будет чуть ниже.

    Cборкой мусора — удалением устаревших файлов PHP тоже занимается сам. Как и кодированием данных и кучей всяких других нужных вещей. В результате этой заботы работа с сессиями оказывается очень простой.
    Вот мы, собственно, и подошли к примеру работы сессий.
    Пример очень маленький:

    <? 
    session_start(); 
    if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
    echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз. ";
    echo "<br><a href=".$_SERVER['PHP_SELF'].">обновить"; 
    ?>

    Мы проверяем, есть ли у нас в сессии переменная counter, если нет, то создаем ее со значением 0, а дальше выводим ее значение и увеличиваем на единицу. Увеличенное значение запишется в сессию, и при следующем вызове скрипта переменная будет иметь значение 1, и так далее. Все очень просто.

    Для того, чтобы иметь доступ к переменным сессии на любых страницах сайта, надо написать ТОЛЬКО ОДНУ(!) строчку в самом начале КАЖДОГО файла, в котором нам нужны сессии:

    session_start();

    И далее обращаться к элементам массива $_SESSION. Например, проверка авторизации будет выглядеть примерно так:

    session_start();
    if ($_SESSION['authorized']<>1) {
    header("Location: /auth.php");
    exit;
    }

    Удаление переменных из сессии. Если у вас register_globals=off, то достаточно написать

    unset($_SESSION['var']);

    Если же нет, то тогда рядом с ней надо написать:

    session_unregister('var');

    Область применения

    Очень важно понимать, для чего сессии стоит использовать, а для чего — нет.

    Во-первых, помните, что сессии можно применять только тогда, когда они нужны самому пользователю, а не для того, чтобы чинить ему препятствия. Ведь он в любой момент может избавиться от идентификатора!
    Скажем, при проверке на то, что заполняет форму человек, а не скрипт, пользователь сам заинтересован в том, чтобы сессия работала — иначе он не сможет отправить форму! А вот для ограничения количества запросов к скрипту сессия уже не годится — злонамеренный скрипт просто не будет возвращать идентификатор.

    Во-вторых. Важно четко себе представлять тот факт, что сессия — это сеанс работы с сайтом, так как его понимает человек. Пришел, поработал, закрыл браузер — сессия завершилась. Как сеанс в кино. Хочешь посмотреть еще один – покупай новый билет. Стартуй новый сеанс. Этому есть и техническое объяснение. Гарантированно механизм сессий работает только именно до закрытия браузера. Ведь у клиента могут не работать cookies, а в этом случае, естественно, все дополненные идентификатором ссылки пропадут с его закрытием.

    Правда, сессия может пропасть и без закрытия браузера. В силу ограничений, рассмотренных в этой статье, механизм сессий не может определить тот момент, когда пользователь закрыл браузер. Для этого используется таймаут – заранее определенное время, по истечении которого мы считаем, что пользователь ушел с сайта. По умолчанию этот параметр равен 24 минутам.

    Если вы хотите сохранять пользовательскую информацию на более длительный срок, то используйте cookies и, если надо — базу данных на сервере. В частности, именно так работают все популярные системы авторизации:

    — по факту идентификации пользователя стартует сессия и признак авторизованности передается в ней.
    — Если надо «запомнить» пользователя, то ему ставится cookies, его идентифицирующая.
    — При следующем заходе пользователя на сайт, для того, чтобы авторизоваться, он должен либо ввести пароль, либо система сама его опознает по поставленной ранее cookies, и стартует сессию. Новую сессию, а не продолжая старую.

    В-третьих, не стоит стартовать сессии без разбору, каждому входящему на сайт. Это создаст совершенно лишнюю нагрузку. Не используйте сессии по пустякам – к примеру, в счетчиках. То, что спайлог называет сессиями, считается, конечно же, на основе статистики заходнов, а не с помощью механизма сессий, аналогичного PHP.

    К тому же, возьмем поисковик, который индексирует ваш сайт. Если поисковый робот не поддерживает cookies, то PHP по умолчанию будет поставлять к ссылкам PHPSESSID, что может не сильно понравится поисковику, который, по слухам, и так-то динамические ссылки не жалует, а тут вообще при каждом заходе — новый адрес!

    Если сессии используются для ограничения доступа к закрытому разделу сайта, то все просто поисковик и не должен его индексировать. Если же приходится показывать одну и ту же страницу как авторизованным, так и не авторизованным пользователям, то тут поможет такой трюк – стартовать сессию только тем, кто ввел пароль, или тем, у кого уже стартовала сессия.

    Для этого в начало каждой страницы вместо просто session_start() пишем:

    if (isset($_REQUEST[session_name()])) session_start();

    таким образом, Мы стартуем сессию только тем, кто прислал идентификатор.
    Соответственно, надо еще в первый раз отправить его пользователю – в момент авторизации.

    Если имя и пароль верные – пишем session_start()!

    Возможные проблемы и их устранение

    Самыми распространенными ошибками, которые выдает РНР при попытке работать с сессиями, являются такие:
    Две из них,

    Warning: Cannot send session cookie — headers already sent
    Warning: Cannot send session cache limiter — headers already sent

    вызваны одной и той же причиной.

    Третья,

    Warning: open(/tmp\sess_SID, O_RDWR) failed: No such file or directory (2) in full_script_path on line number

    ранее она выглядела, как

    Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp),

    если перевести ее с английского, подробно объясняет проблему: недоступен указанный в php.ini путь к каталогу, в который пишутся файлы сессий. Эту ошибку исправить проще всего. Просто прописать каталог, который существует, и доступен на запись, например,

    session.save_path = c:\windows\temp

    И не забыть перезагрузить Apache после этого.

    Как выясняется, сообразительность людская не имеет пределов, и поэтому я вынужден пояснить:
    сообщение о третьей ошибке (невозможно найти каталог) НЕИЗБЕЖНО приведет к появлению первых двух, поскольку сообщение об ошибке — это вывод в браузер и после него заголовками пользоваться нельзя. Поэтому не спешите искать преждевременный вывод, а сначала пропишите правильный путь!

    Следующей по распространенности проблемой при работе с сессиями является тяжелое наследие register_globals. НЕ давайте переменным скрипта имена, совпадающие с индексами массива $_SESSION!

    При register_globals=on значения будут перезаписывать друг друга, и вы запутаетесь.

    Если не работает, но и никаких сообщений не выводится, то добавьте в самое начало скрипта две строчки, отвечающие за вывод ВСЕХ ошибок на экран — вполне возможно, что ошибки есть, но вы их просто не видите.

    ini_set('display_errors',1);
    error_reporting(E_ALL);

    или смотрите ошибки в error_log. Вообще, тема отображения сообщений об ошибках выходит за рамки данной статьи, поэтому просто убедитесь хотя бы, что вы можете их видеть.

    Если вы уверены, что ошибок нет, но приведенный пример не работает все равно, то, возможно, в PHP не включена передача id через url, а cookies по каким-то причинам не работают.
    Смотрите, что у вас с cookies.

    Вообще, если у вас «не работают» сессии, то сначала попробуйте передать идентификатор сессии руками, то есть, сделать ссылку и приписать к ней идентификатор:

    <? 
    session_start(); 
    if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;
    echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз.<br>
    <a href=".$_SERVER['PHP_SELF'].'?'.session_name().'='.session_id().">обновить"; 
    ?>

    При этом следует убедится, что не включена директива session.use_only_cookies, которая запрещает PHP принимать идентификатор сессии, если он был передан через URL

    Если этот пример не заработает, то проблема либо в банальных опечатках (половина «проблем» с сессиями происходит от неправильно написанного имени переменной), либо в слишком старой версии PHP: поддержка сессий появилась в версии 4.0, а массив $_SESSION — в 4.1 (До этого использовался $HTTP_SESSION_VARS).

    Если же заработает — то проблема в cookies. Отслеживайте — что за cookies ставит сервер браузеру, возвращает ли браузер ее. Искать очень полезно, просматривая просматривая обмен HTTP-заголовками между браузером и сервером.

    Объяснение принципа работы cookies выходит за рамки этого и так уж слишком большого текста, но хотя бы убедитесь, что сервер cookies с идентификатором посылает, а браузер — возвращает. И при этом идентификаторы совпадают друг с другом =)
    Установка cookies должна выглядеть, как

    Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;

    или как

    Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; path=/

    (если вы запрашиваете скрипт не из корневого каталога)
    Ответ сервера должен выглядеть, как

    Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6

    либо

    Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b=b

    если браузер возвращает другие cookies, кроме идентификатора сессии.

    Если пример отсюда работает, а ваш собственный код — нет, то проблема, очевидно, не в сессиях, а в алгоритме. Ищите, где потеряли переменную, по шагам переносите пример отсюда, отлаживайте свой скрипт.

    Еще одна проблема может возникнуть, если вы используете перенаправление через header или навигацию с помощью JavaScript.
    Дело в том, что РНР автоматически дописывает идентификатор сессии только к ссылкам вида <a href=>, но не делает этого для header-ов, яваскрипта, мета-тегов.

    Поэтому надо добавлять идентификатор руками, например, так:

    header("Location: /script.php?".session_name().'='.session_id());

    Так же, весьма редкая, и совершенно непонятно, откуда появляющаяся, проблема бывает в том, что настройка session.save_handler имеет значение, отличное от files. Если это не так — исправляйте.

    Дополнительная информация:

    • Кроме cookies, механизм сессий посылает еще и заголовки, запрещающие кэширование страниц (тот самый cache limiter). Для html это правильно и необходимо. Но вот когда вы пытаетесь скриптом, проверяющим авторизацию, отдать файл, то интернет эксплорер отказывается его скачивать. Именно из-за этого заголовка. Вызов
      session_cache_limiter(«private»);
      перед стартом сессии должен решить проблему.
    • Как это ни кажется странным, но в массиве $_SESSION нельзя использовать числовые индексы — $_SESSION[1],$_SESSION[’10’] — cессии работать не будут.
    • Где-то между версиями 4.2 и 5.0 невозможно было установить session.use_trans_sid с помощью ini_set(). Начиная с 5.0 уже можно снова.
    • До версии 4.3.3 cookies PHP отправлял cookies только если при старте сессии в запросе отсутстввал идентификатор. Теперь же cookies посылается при каждом вызове session_start()

    PHP и Cookies

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

    Приведем пример использования Cookies на конкретном примере.

    Предположим, нам нужно написать счетчик посещения сайта. Нам нужно знать, какое число посещений сайта осуществлялось каждым конкретным посетителем.

    Данную задачу можно решить двумя способами. Первый из них заключается в ведении учета IP-адресов пользователей. Для этого нужна база данных всего из одной таблицы, примерная структура которой такая:

    IP-адрес Число посещений
    210.124.134.203 7
    212.201.78.207 14
    83.103.203.73 3

    Когда пользователь заходит на сайт, нам нужно определить его IP-адрес, найти в базе данных информацию о его посещениях, увеличить счетчик и вывести его в браузер посетителя. Написать обработчик (скрипт) подобной процедуры несложно. Однако при использовании такого метода у нас появляются проблемы следующего характера:

    • Для каждого IP-адреса нужно вести учет в одной таблице, которая может быть очень большой. А из этого следует, что мы нерационально используем процессорное время и дисковое пространство;
    • У большинства домашних пользователей IP-адреса являются динамическими. То есть, сегодня у него адрес 212.218.78.124, а завтра — 212.218.78.137. Таким образом, велика вероятность идентифицировать одного пользователя несколько раз.

    Можно использовать второй способ, который намного легче в реализации и более эффективен. Мы устанавливаем в Cookie переменную, которая будет храниться на диске удаленного пользователя. Эта переменная и будет хранить информацию о посещениях. Она будет считываться скриптом при обращении посетителя к серверу. Выгода такого метода идентификации очевидна. Во-первых, нам не нужно хранить множество ненужной информации о IP-адресах. Во-вторых, нас не интересуют динамические IP-адреса, поскольку данные о своих посещениях хранятся конкретно у каждого посетителя сайта.

    Теперь понятно, для чего мы можем использовать Cookie — для хранения небольшой по объему информации у клиента (посетителя) сайта, например: настройки сайта (цвет фона страниц, язык, оформление таблиц и.т.д.), а также другой информации.

    Файлы Cookies представляют собой обыкновенные текстовые файлы, которые хранятся на диске у посетителей сайтов. Файлы Cookies и содержат ту информацию, которая была в них записана сервером.

    Программирование Cookies

    Приступим к программированию Cookies.

    Для установки Cookies используется функция SetCookie(). Для этой функции можно указать шесть параметров, один из которых является обязательным:

    • name — задает имя (строк), закрепленное за Cookie;
    • value — определяет значение переменной (строка);
    • expire — время «жизни» переменной (целое число). Если данный параметр не указать, то Cookie будут «жить» до конца сессии, то есть до закрытия браузера. Если время указано, то, когда оно наступит, Cookie самоуничтожится.
    • path — путь к Cookie (строка);
    • domain — домен (строка). В качестве значения устанавливается имя хоста, с которого Cookie был установлен;
    • secure — передача Cookie через защищенное HTTPS-соединение.

    Обычно используются только три первые параметра.

    Пример установки Cookies:

     

    <?php
    
    // Устанавливаем Cookie до конца сессии:
    SetCookie("Test","Value");
    
    // Устанавливаем Cookie на один час после установки:
    SetCookie("My_Cookie","Value",time()+3600);
    
    ?>

    При использовании Cookies необходимо иметь в виду, что Cookies должны устанавливаться до первого вывода информации в браузер (например, оперетором echo или выводом какой-либо функции). Поэтому желательно устанавливать Cookies в самом начале скрипта. Cookies устанавливаются с помощью определенного заголовка сервера, а если скрипт выводит что-либо, то это означает, что начинается тело документа. В результате Cookies не будут установлены и может быть выведено предупреждение. Для проверки успешности установки Cookies можно использовать такой метод:

    <?php
    // Устанавливаем Cookie до конца сессии:
    // В случае успешной установки Cookie, функция SetCookie возвращает TRUE:
    if (SetCookie("Test","Value")) echo "<h3>Cookies успешно установлены!</h3>";
    ?>

    Функция SetCookie() возвращает TRUE в случае успешной установки Cookie. В случае, если Cookie установить не удаетсяSetCookie() возвратит FALSE и возможно, предупреждение (зависит от настроек PHP). Пример неудачной установки Cookie:

    <?php
    // Cookies установить не удастся, поскольку перед отправкой
    // заголовка Cookie мы выводим в браузер строку 'Hello':
    echo "Hello";
    // Функция SetCookie возвратит FALSE:
    if (SetCookie("Test","Value")) echo "<h3>Cookie успешно установлен!</h3>";
    else echo "<h3>Cookie установить не удалось!</h3>";
    // Выводит 'Cookie установить не удалось!'.
    ?>

    Cookie установить не удалось, поскольку перед посылкой заголовка Cookie мы вывели в браузер строку «Hello».

    Чтение значений Cookies

    Получить доступ к Cookies и их значениям достаточно просто. Они хранятся в суперглобальных массивах и $_COOKIE и$HTTP_COOKIE_VARS.

    Доступ к значениям осуществляется по имени установленных Cookies, например:

    echo $_COOKIE['my_cookie'];
    // Выводит значения установленной Cookie 'My_Cookie'

    Пример установки Cookie и последующего его чтения:

    <?php
    // Устанавливаем Cookie 'test' со значением 'Hello' на один час:
    setcookie("test","Hello",time()+3600);
    // При следующем запросе скрипта выводит 'Hello':
    echo @$_COOKIE['test'];
    ?>

    В рассмотренном примере при первом обращении к скрипту устанавливается Cookie «test» зо значением «hello». При повторном обращении к скрипту будет выведено значение Cookie «test», то есть строка «Hello».

    При чтении значений Cookies обращайте внимание на проверку существования Cookies, например, используя операторisset(). Либо путем подавления вывода ошибок опереатором @

    А вот пример, как построить счетчик числа загрузок страницы с помощью Cookies:

    <?php
    // Проверяем, был ли уже установлен Cookie 'Mortal',
    // Если да, то читаем его значение,
    // И увеличиваем значение счетчика обращений к странице:
    if (isset($_COOKIE['Mortal'])) $cnt=$_COOKIE['Mortal']+1;
    else $cnt=0;
    // Устанавливаем Cookie 'Mortal' зо значением счетчика,
    // С временем "жизни" до 18/07/29,
    // То есть на очень долгое время:
    setcookie("Mortal",$cnt,0x6FFFFFFF);
    // Выводит число посещений (загрузок) этой страницы:
    echo "<p>Вы посещали эту страницу <b>".@$_COOKIE['Mortal']."</b> раз</p>";
    ?>

    Удаление Cookies

    Иногда возникает необходимость удаления Cookies. Сделать это несложно, необходимо лишь вновь установить Cookie с идентичным именем и пустым параметром. Например:

    <?php
    // Удаляем Cookie 'Test':
    SetCookie("Test","");
    ?>

    Установка массива Cookies и его чтение

    Мы может установить массив Cookies, используя квадратные скобки в именах Cookies [], а затем прочитать массив Cookies и значения этого массива:

     

    <?php
    // Устанавливаем массив Cookies:
    setcookie("cookie[1]", "Первый");
    setcookie("cookie[2]", "Второй");
    setcookie("cookie[3]", "Третий");
    
    // После перезагрузки страницы мы отобразим
    // Состав массива Cookies 'cookie':
    if (isset($_COOKIE['cookie'])) {
    foreach ($_COOKIE['cookie'] as $name => $value) {
    echo "$name : $value <br>";
    }
    }
    ?>

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