Блог

  • 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 или их часть. Таким образом, мы можем иметь некоторые проблемы в идентификации таких посетителей.

     

     

     

     

     

  • Задания по HTML ко второму уроку

    Краткое содержание 2 урока:

    1. Комментарии в HTML задаются следующим образом

    <!--   Комментарий в браузере не отображается -->

    Они необходимы для собственной метки кода html, что приводит к удобству в работе

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

    Пример тега с атрибутом

    3. Атрибут style-задает визуальные настройки тэга, например: цвет, размер, отступы и т.д.

    Существует большое количество значений атрибутов? каждый из которых несет свой функционал Вот некоторые из них:

    <p style="background: yellow;">Желтый фон: background:yellow;</p>
    <p style="color: red;">Цвет текста красный: color:red;</p>
    <p style="text-align:center;">Расположение текста по центру: text-align:center </p>
    <p style="font-family: "Open Sans", sans-serif;">Шрифт font-family: "Open Sans"</p>
    <p style="font-size: 18px;">Размер шрифта: font-size:18px</p>
    <p style="font-weight: bolder;">Толщина текста: font-weight:bolder</p>
    <p style="line-height: 50px;">Высота строки: line-height:50px</p>
    <p style="letter-spacing: 0.5em;">Меж символьный интервал: letter-spacing:0.5em</p>
    <p style="width: 100px; height: 100px; background: pink;">Ширина: width:100px; высота: height:100px</p>
    

    Желтый фон: background:yellow;

    Цвет текста красный: color:red;

    Расположение текста по центру: text-align:center

    Шрифт font-family: «Open Sans»

    Размер шрифта: font-size:18px

    Толщина текста: font-weight:bolder

    Высота строки: line-height:50px

    Меж символьный интервал: letter-spacing:0.5em

    Ширина: width:100px; высота: height:100px

    4. Тег <img> предназначен для отображения на веб-странице изображений в графическом формате GIF, JPEG или PNG. Адрес файла с картинкой задаётся через атрибут src.

    <img src="https://ot7.ru/wp-content/uploads/2015/09/Untitled-6.jpg" alt="паттерн" width="130" height="130" />

    паттерн

    Задание 1.

    1. Откройте папку с вашим именем в папке «html»
    2. Скопируйте папку «урок 1» и переименуйте его на «урок 2»
    3. Создайте в папке «урок 2» папку «images» (там вы будете хранить картинки)
    4. Откройте файл index.html и в контейнере title замените «1 урок» на «2 урок»
    5. В тег BODY пропишите атрибут с именем style и слудующими значениями
    <body style="font-family: Courier New,sans-serif;width:1200px;">

    style=»font-family: Courier New,sans-serif;» — задает стиль шрифта ( Courier New) без засечек (sans-serif)

    width — ширина блока

    height — высота блока

    6. В тег H1 пропишите атрибут с именем style

    <h1 style="text-align:center;background: #FFDCF3;">Профессия WEB-ДИЗАЙНЕР</h1>

    text-align:center; — расположение текста по центру

    background: #FFDCF3; — фон

    7. Сохраните эти изображения в папку imagescolorWebDesign web_design web_design3

    В документе после заголовка первого уровня отобразите сохраненные вами изображения используя тег <img> и в нем пропишите обязательные атрибуты src=»путь к картинке» и alt=»альтернатива изображению, необходим для продвижения в поисковой системе»

    <img src="images/web_design.jpg" alt="Веб дизайнер" height="300px;">
    
    <img src="images/colorwebdesign.jpg" alt="Веб дизайнер" height="300px;">
    
    <img src="images/web_design3.png" alt="Веб дизайнер" height="300px;">

    8. В блокe предварительного форматирования текста пропишите атрибут с именем style и используя значение text-align расположите блок по правому краю

    <pre style="text-align: right;">
      «Цифровой дизайн похож на живопись, только краски никогда не сохнут».
                                  Невилл Броуди (Neville Brody)</pre>

    9. В заголовке второго уровня задайте фон #F1C1FD и меж строчный интервал = 0,3em, расположите текст по центру

    <h2 style="text-align:center;background: #F1C1FD;letter-spacing:0.3em;">Кто такой Web-дизайнер?</h2>

    10. Заголовку третьего уровня задайте цвет текста — #FF00D2

    <h3 style="color:#FF00D2;">В обязанности Веб-дизайнера входит:</h3>

    11. Абзацу начинающегося с фразы «Его задача» задайте толщину текста -bold, цвет фона #FFDCF3, и высоту строки — 2em

    <p style="font-weight: bold; background: #FFDCF3;line-height: 2em;"> <i>Его задача:</i> помочь пользователю сориентироваться на веб-сайте, сделать работу пользователя с веб-сайтом легкой и приятной. В тоже время веб-дизайнер должен помнить, что он создает рекламный продукт, который должен соответствовать поставленным задачам (т.е. доносить некое рекламное сообщение до пользователя). </p>

    12. После отобразите в документе следующее изображение и в тег <img> пропишите обязательный атрибут  alt=»обязанности веб-дизайнера»

    web_design2

    13.Заголовок второго уровня  Описание деятельности расположите по центру, задайте меж символьный интервал равный 0,3em и фон цветом #FFDCF3

    <h2 style="text-align:center; background: #FFDCF3;letter-spacing:0.3em;">Описание деятельности</h2>

    14. Для абзаца «В Казахстане — 90-200 тысяч тенге» задайте ширину равную 500px, расположите текст по центру, задайте фон #9BEA9B, высоту строки 3em, толщину текста жирнее, размер шрифта 20px

    <p style="width: 500px;text-align: center;background: #9BEA9B;line-height: 3em;font-weight: bolder;font-size: 20px;">В Казахстане — 90-200 тысяч тенге</p>

    15. Абзац «Источник HeadHunter» расположите в правой сторонедокумента

    <p style="text-align:right;"><em>Источник HeadHunter</em></p>

    В результате у вас должно получиться следующее:

    Снимок3

    Снимок Снимок2

     

    https://ot7.ru/html/2.html

  • HTML Урок 2. Атрибуты.Стили.Форматирование текста.Картинки

     

    В этом уроке:

    • Как задаются комментарии в HTML
    • Что такое атрибут
    • Использование стилей.Атрибут style
    • Задний фон
    • Цвет текста
    • Шрифт
    • Размер
    • Выравнивание
    • Форматирование текста
    • Тэг <img>

    Комментарии

    В HTML-документ можно добавлять комментарии, которые не будут отображаться в браузере. Они должны начинаться с символов <!— и заканчиваться символами —>. Все, что заключено между этими символами, при просмотре странице в браузере остается невидимым.

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

    Примечание: обратите внимание, что комментарии могут занимать несколько строк. Помните, что все, написанное между символами <!— и —>, даже HTML-код, будет проигнорировано браузером.

    <html>
      <body>
     
        <!--Этот комментарий не будет отображен-->
        <p>Обычный абзац</p>
     
      </body>
    </html>

      Атрибуты html тегов

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

    Пример тега с атрибутом

    Как мы видим, атрибуты состоят из пары: имя_атрибута=»значение». Имена атрибутов не чувствительны к регистру символов и могут быть записаны с любым сочетанием строчных и заглавных букв. Значение атрибута может состоять из текста, цифр и других символов (единственным исключением является символ амперсанда (&), его использование запрещено). Дополнительные ограничения на использование различных символов зависят от способа записи значения.

    <!-- при указании нескольких атрибутов для одного тега, они должны быть отделены
     друг от друга символом пробела -->
    <p атр1="значение" атр2="значение">содержимое</p>
     
    <!-- сочетание строчных и заглавных букв в имени атрибута -->
    <p АтРибУт1="значение">содержимое</p>

    Использование стилей. Атрибут style

    Атрибут style — используется для стилизации элементов непосредственно в коде. Цель атрибута style заключается в предоставлении простого способа использования CSS стилей в любом HTML-элементе.

    В этом самоучителе атрибут style показан для вашего общего представления об использовании CSS, как инструмента для стилизации страниц. Основы CSS вы cможете изучить с помощью нашего самоучителя по CSS.

    Код примера познакомит вас с новым способом форматирования документа.

    <html>
      <body style="background-color:Gray;">
     
        <h1>Посмотрите на цвета и стили</h1>
        <p style="font-family:verdana;color:red;">
          Этот текст написан красным цветов с помощью шрифта Verdana.
        </p>
        <p style="font-family:times;color:green;">
          Этот текст написан зеленым цветом с помощью шрифта Times.
        </p>
        <p style="font-size:30px;">Этот текст имеет размер 30 пикселей.</p>
     
      </body>
    </html>

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

    После демонстрации работы атрибута style предлагаем вам познакомится с самыми распространенными свойствами для стилизации текста

    Задний фон background

    Задний фон элемента задается с помощью свойства background-color, которое в качестве значения может принимать любое доступное значение цвета (про различные значения цветов смотрите ниже), после свойства обязательно должно идти двоеточие и значение, после значения обязательно ставится точка с запятой, эти правила распространяются на все свойства атрибута style. Если нужно задать несколько свойств стиля для одного элемента, то каждое последующее свойство записывается после «;» предыдущего свойства.

    Цвет текста color

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

    Определение цвета по названию

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

    color: silver;

    Итак, чтобы задать цвет таким образом, нужно просто указать его название в качестве значения свойства. При этом не имеет значения, пишите вы названия строчными или прописными буквами, поэтому можно написать silver, Silver или SILVER, и все это будет работать.

    Определение цвета через значение, задаваемое сочетанием красного, зеленого и синего

    Можно определить цвет, указав сочетание красного, зеленого и синего в определенной пропорции. Допустим, вам нужно задать оранжевый цвет, который состоит из 80% красного, 40% зеленого и 0% синего. Вот как это можно сделать:

    color: rgb(80%, 40%, 0%);

    Можно также задавать значение красного, зеленого и синего числами от 0 до 255. Например, вместо 80% красного, 40% зеленого и 0% синего можно писать 204 красного, 102 зеленого и 0 синего.

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

    color: rgb(204, 102, 0);

    Определение цвета через шестнадцатеричный код

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

    color: #cc6600;

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

    Шрифт

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

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

    font-family: Verdana, Geneva, Arial, sans-serif;

    Свойство font-family дает возможность задать список предпочтительных шрифтов, которые указываются через запятую. Если имя шрифта состоит из нескольких слов, то такое название следует заключить в двойные кавычки, например: «Courier New».

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

    font-family: (шрифт без засечек), Arial, Helvetica, sans-serif;
    
    font-family: (шрифт с засечками), «Times New Roman», Times, serif;
    
    font-family: (моноширинный шрифт), «Courier New», Courier, monospaced;

    Размер шрифта

    Размер шрифта очень сильно влияет на дизайн веб-страницы и читабельность ее текста. В CSS есть несколько единиц измерения, с помощью которых можно задавать размер для текста, все они подробно описаны в разделе Единицы измерения CSS. Также имеется возможность задавать размер с помощью ключевых слов:

    font-size: medium;

    Все доступные ключевые слова, задающие размер, вы можете посмотреть в нашем справочнике по CSS в описании свойства font-size.

    Выравнивание

    Данный стиль задает выравнивание текста внутри родительского блока. Может иметь значения left, right, center.

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

    Хочу заметить тот факт, что выравнивание, заданное свойством text-align, распространяется так же на графические элементы внутри блока.

    line-height

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

    Значение данного свойства задается в процентах (100%, 150% …), множителем (1 —  интерлиньяж по умолчанию, 1.5 — увеличен в полтора раза) или точным значением в пикселах (10px, 1.5 em…).

    letter-spacing

    Межсимвольное расстояние. Значение данного свойства указывает в единицах длины (пиксели, дюймы, pt), либо относительные единицы — em.

    font-weight

    При желании сделать текст блока жирным — используйте стиль font-weight:bold. Если вы наоборот хотите убрать жирное выделение — тут все просто font-weight:normal

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

    <html>
      <body style="background-color: black; color: white;">
     
        <h1 style="font-family: verdana;">Заголовок</h1>
        <p style="font-size: 10px;">Очень маленький размер текста.</p>
        <p style="text-align: right;">Этот текст будет выровнен по правому краю.</p>
        <p style="line-height:100px">Высота строки равна 100px</p>
        <p style="letter-spacing:0.5em">Расстояние между символами</p>
        <p style="font-weight:bold">Жирный текст</p> 
      </body>
    </html>

    Результат:

    Заголовок

    Очень маленький размер текста.

    Этот текст будет выровнен по правому краю.

    Высота строки равна 100px

    Расстояние между символами

    Жирный текст

     Тег <img>

    Тег <img> предназначен для отображения на веб-странице изображений в графическом формате GIF, JPEG или PNG. Адрес файла с картинкой задаётся через атрибут src. Если необходимо, то рисунок можно сделать ссылкой на другой файл, поместив тег <img> в контейнер <a>. При этом вокруг изображения отображается рамка, которую можно убрать, добавив атрибут border=»0″ в тег <img>.

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

    Синтаксис

    HTML <img src=»URL» alt=»альтернативный текст»>
    XHTML <img src=»URL» alt=»альтернативный текст» />

    Атрибуты

    alt — Альтернативный текст для изображения.

    width – Ширина изображения.

    height – Высота изображения.

    Src — Путь к графическому файлу.

    Закрывающий тег

    Не требуется.

    Пример

    <img src="images/girl.png" width="189" height="255" alt="Фото моей дочки">

    Заключение:

    1. Комментарии в HTML задаются следующим образом

    <!--   Комментарий в браузере не отображается -->

    Они необходимы для собственной метки кода html, что приводит к удобству в работе

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

    Пример тега с атрибутом

    3. Атрибут style-задает визуальные настройки тэга, например: цвет, размер, отступы и т.д.

    Существует большое количество значений атрибутов? каждый из которых несет свой функционал Вот некоторые из них:

    <p style="background: yellow;">Желтый фон: background:yellow;</p>
    <p style="color: red;">Цвет текста красный: color:red;</p>
    <p style="text-align:center;">Расположение текста по центру: text-align:center </p>
    <p style="font-family: "Open Sans", sans-serif;">Шрифт font-family: "Open Sans"</p>
    <p style="font-size: 18px;">Размер шрифта: font-size:18px</p>
    <p style="font-weight: bolder;">Толщина текста: font-weight:bolder</p>
    <p style="line-height: 50px;">Высота строки: line-height:50px</p>
    <p style="letter-spacing: 0.5em;">Меж символьный интервал: letter-spacing:0.5em</p>
    <p style="width: 100px; height: 100px; background: pink;">Ширина: width:100px; высота: height:100px</p>
    

    Желтый фон: background:yellow;

    Цвет текста красный: color:red;

    Расположение текста по центру: text-align:center

    Шрифт font-family: «Open Sans»

    Размер шрифта: font-size:18px

    Толщина текста: font-weight:bolder

    Высота строки: line-height:50px

    Меж символьный интервал: letter-spacing:0.5em

    Ширина: width:100px; высота: height:100px

    4. Тег <img> предназначен для отображения на веб-странице изображений в графическом формате GIF, JPEG или PNG. Адрес файла с картинкой задаётся через атрибут src.

    <img src="https://ot7.ru/wp-content/uploads/2015/09/Untitled-6.jpg" alt="паттерн" width="130" height="130" />

    паттерн

  • Задания по HTML к первому уроку

    Задание 1.

    Необходимые программы для выполнения задания:  notepad++ и браузер Сhrome

    (Скачать по ссылке:  http://notepad-plus-plus.org/download/v6.7.4.html )

    1. Создать папку HTML на рабочем столе если ее нет.
    2. Создать папку со своим именем в папке HTML.
    3. Создать файл html
    4. Открыть файл index.html с помощью notepad++.
    5. В меню кодировки выбрать «Преобразовать в UTF-8 без BOM» (Это основная кодировка для страниц на Русском языке). Ее мы будем использовать всегда для создания страниц.
      Untitled-3
    6. Наберите в документе  основной скелет html:
      <html>
          <head> Служебная информация о вашем документе</head>
          <body>
              Тело документа 
          </body>
      </html>
    7. Внутри контейнера <head></head> пропишите следующее:
    <head>
     <title>1 урок-Профессия WEB-ДИЗАЙНЕР</title>
     <meta charset="utf-8">
     <meta name="description" content="Веб-дизайнер - профессия 21 века.Профессию web-дизайнера является перспективной в карьерном плане.Он специалист в области компьютерных технологий, который отвечает за то, как выглядит и воспринимается Интернет-сайт.">
     <meta name="keywords" content="Web дизайнер дизайн страниц графический дизайн интернет сайт компьтерные технологии баннер фриланс свободный график создание сайта web интерфейс художественное оформление сайта">
     <meta name="author" lang="ru" content="Жарова Салтанат" >
     <meta name="robots" content="index,follow">
    </head>

    8.В контейнере <body></body> используя теги и нижеописанный текст на желтом фоне, создать страницу как на рис.1

    <p>Параграф.</p>
    <b>Текст жирным шрифтом.</b>
    <h1>Заголовок</h1>
    <h2>Подзаголовок</h2>
    <h3>Под-подзаголовок</h3> 
    <i>Italic</i>
    <br /> перевод строки
    <hr /> Горизонтальная линия
    <ul>Список</ul>
    <ol>Упорядоченный список</ol>
    <li>Элемент списка</li>
    <pre>˙·٠•●♥ Ƹ̵̡Ӝ̵̨̄Ʒ ♥●•٠·˙</pre>

    Профессия WEB-ДИЗАЙНЕР

    «Цифровой дизайн похож на живопись, только краски никогда не сохнут».
    															Невилл Броуди (Neville Brody)

    Кто такой Web-дизайнер?

    Web-дизайн (от англ. Web design) — отрасль web-разработки и разновидность дизайна.
    Web-дизайнер – это специалист в области компьютерных технологий, который отвечает за то, как выглядит и воспринимается Интернет-сайт.

    В обязанности Веб-дизайнера входит:

    1. создание логотипов, баннеров и других элементов графики
    2. продумывает навигацию по сайту
    3. определяет, где следует разместить текст
    4. учет времени загрузки сайта
    5. проектирует пользовательский интерфейс

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


    ░░░░██▄
    ░░░██▀░░░░▐
    ▌░███▄░░░░▐
    ▌▐███░▀▄███▄▄▄██▄▄
    ▌█████▌░░▌░░░░░░▌
    ▌▀▀▀▌▐█░░▌░░░░░░▌
    ▌▀▀▀▌▐█░░▌░░░░░░▌
    ▌░░░▌░█▄▌░░░░░░░▌
    

    Описание деятельности

    Основной сферой деятельности web-дизайнера является стилевая, визуальная и программная организация информации электронного формата, логичное и приятное оформление информации, графическое отображение её на страницах Интернета.

    Cредняя заработная плата

    В Казахстане — 90-200 тысяч тенге

    Источник HeaHunter

    1

    Рис. 1

    9. Сохранить документ и посмотреть результат.

    https://ot7.ru/html/1.html

    ПРИМЕЧАНИЕ:
    Текст в теге <Title> должен содержать от 10-70 символов. Текст должен содержать наиболее важные ключевые слова, которые описывают тематику вашего сайта.
    ОБЯЗАТЕЛЬНО: Каждая страница сайта должна содержать уникальное описание.
    Придерживаясь наших рекомендаций, вы получите максимальное количество посетителей сайта.

     

  • Урок 1 Java script

    Для изучения JavaScript Вам необходимо пройти курс «Верстка HTML CSS» и «Программирование на PHP»

    Если вы прошли это курсы или не уверены в том нужны они вам или нет. Вы можете проверить уровень своей подготовки пройдя тестирование. Тест HTML CSS PHP.

    JavaScript является самым популярным языком программирования в мире. В этом уроке вы увидите несколько несложных примеров о том что умеет делать JS.

    Вот например вот такая строчка:

    document.getElementById("demo").innerHTML = "Hello JavaScript";

    найдет HTML элемент с id= «demo» и поменяет его содержимое на «Hello JavaScript».

    А следующая изменит размер шрифта на 25 пикселей:

    document.getElementById("demo").style.fontSize = "25px";

    В JavaSript очень обширные возможности, и мы будем изучать их в этом курсе.

    Теперь приступим непосредственно к первому уроку и напишем нашу первую программу на JavaScript.

     

    <script language="JavaScript" type="text/javascript">
    function hello_world1() {
      alert('Hello, World!');
    }
    function hello_world() {
     document.getElementById('test_but').onclick=function(){
      alert('Hello, World!');
     }
    }
    </script>
    
    <input type='button' value='Test' onClick="javascript: window.alert('test');" id='test_but'><br>
    <input type='button' value='Change' onClick="hello_world1()"><br>
    <input type='button' value='Magic' id='test_but'>

    Итак, что же наша программа делает, спросите вы? Все очень просто. Вкратце: по нажатию на кнопку Test на экране появится всплывающее окно с текстом «test».

    По нажатию на кнопку Change или Magic на экране тоже появится всплывающее окно но с текстом «Hello, World!».

    Но в чем разница? Разница в том, что в первом случае мы вызываем всплывающее окно напрямую в кнопке, а во втором и в третьем случае мы вызываем функцию написанную отдельно, которое собственно и вызывает всплывающее окно, но если к кнопке Magic мы обращаемся непосредственно из функции hello_world() ,то в кнопке Change мы вызываем функцию hello_world1() с помощью атрибута  onClick.

  • Задание по Php к пятому уроку

    Задание

    1. Создать форму для загрузки изображений
    2. Написать скрипт загрузки файла.
    1. Создадим файл для нашей формы zagruzka.php. Его код:

     

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</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>

    И в файле index.php сделаем ссылку на zagruzka.php

    <a href="zagruzka.php">Страница для загрузки файлов</a> <br />

    И смотрим результат:

    Untitled-1

    рис 1

    2. Код скрипта:

    <?php
    $target_dir = "uploads/"; //Задаем папку в которую загружается файл.
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // исходное имя файла, такое
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Получаем расширение файла для проверки, что файл является картинкой
    if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); // полный путь к временному файлу на диске
    if($check !== false) {
    echo "Файл является изображением - " . $check["mime"] . "";
    $uploadOk = 1;
    } else {
    echo "Файл не является изображением или поврежден.";
    $uploadOk = 0;
    }
    }
    if (file_exists($target_file)) // проверяем существует ли файл
    {
    echo "Извините файл уже существует.";
    $uploadOk = 0;
    }
    if ($_FILES["fileToUpload"]["size"] > 500000) // Проверим размер загруженного файла в байтах
    {
    echo "Файл слишком большой.";
    $uploadOk = 0;
    }
    if($imageFileType != "jpg" and $imageFileType != "png" and $imageFileType != "jpeg" and $imageFileType != "gif" ) // если значение переменной $imageFileType не равно (!=) указанным расширениям то выводим сообщение
    {
    echo "Только JPG, JPEG, PNG & GIF можно загружать. Неверное расширение файла";
    $uploadOk = 0;
    }
    
    if ($uploadOk == 0) {
    echo "Ошибка загрузки файла.";
    } else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) // Перемещаем файл на сервер
    {
    echo "Файл ". basename( $_FILES["fileToUpload"]["name"]). " загружен.";
    } else {
    echo "Ошибка копирования файла.";
    }
    }
    ?>

     

  • Php урок 5. Загрузка файла и отправка email

    Создаем форму для загрузки изображения

    Добавляем форму загрузки файла, в которой пользователь сможет выбрать файл изображения который ему необходимо загрузить на сервер:

     

    <!DOCTYPE html>
    <html>
    <body>
    
    <form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
    </form>
    
    </body>
    </html>

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

    Используйте метод пост для формы — method=»post»
    У формы обязательно должен быть задан атрибут : enctype=»multipart/form-data». Этот атрибут используется при загрузке фалов.
    Без указания данного атрибута загрузка не будет работать.

    Замечание:

    В форме необходимо указать атрибут type=»file» для тега <input>. В этом случае в форме отобразится поле загрузки файла, с кнопкой нажав которую вы сможете выбрать загружаемый файл. Необходимо задать имя тега input для последующего получения данных о файле. В нашем примере имя тега будет fileToUpload.
    После загрузки файла вся информация о нем будет передаваться не как обычно через $_POST, а в суперглобальном массиве $_FILE.

    Pathinfo

    (PHP 4 >= 4.0.3, PHP 5, PHP 7)

    pathinfo — Возвращает информацию о пути к файлу

    Описание

    mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )

    pathinfo() возвращает информацию о path в виде ассоциативного массива или строки в зависимости от options.

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

    Path — aнализируемый путь.

    Options — eсли указан, то задает для возврата отдельный элемент: один из следующих PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME.

    Если options не указан, то возвращаются все доступные элементы.

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

    Если параметр options не передан, то возвращаемый ассоциативный массив (array) будет содержать следующие элементы: dirname, basename, extension (если есть) и filename.

    Замечание:
    Если path содержит больше одного расширения, то PATHINFO_EXTENSION возвращает только последнее и PATHINFO_FILENAME отрезает только последнее расширение. (смотрите пример ниже).
    Замечание:
    Если path не содержит расширения, то не будет возвращен элемент extension (см. ниже второй пример).
    Если указан параметр options, будет возвращена строка (string), содержащая указанный элемент.

    Пример Пример использования функции pathinfo()

     

    <?php
    $path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
    
    echo “$path_parts['dirname']<br />”;
    echo $path_parts['basename'] <br />”;
    echo $path_parts['extension'] <br />”;
    echo $path_parts['filename'] <br />”; // начиная с PHP 5.2.0
    ?>

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

    /www/htdocs/inc
    lib.inc.php
    php
    lib.inc

    File_exists

    (PHP 4, PHP 5, PHP 7)
    file_exists — Проверяет наличие указанного файла или каталога

    Описание

    bool file_exists ( string $filename )
    Проверяет наличие указанного файла или каталога.

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

    filename
    Путь к файлу или каталогу.

    На платформах Windows, для проверки наличия файлов на сетевых ресурсах, используйте имена, подобные //computername/share/filename или \\computername\share\filename.

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

    Возвращает TRUE, если файл или каталог, указанный параметром filename, существует, иначе возвращает FALSE.

    Замечание:
    Данная функция возвращает FALSE для символических ссылок, указывающих на несуществующие файлы.

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

    Замечание:
    Проверка происходит с помощью реальных UID/GID, а не эффективных идентификаторов.
    Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.

    Пример Проверка существования файла

     

    <?php
    $filename = '/path/to/foo.txt';
    
    if (file_exists($filename)) {
    echo "Файл $filename существует";
    } else {
    echo "Файл $filename не существует";
    }
    ?>

    Ошибки

    В случае неудачного завершения работы генерируется ошибка уровня E_WARNING.

    Рассмотрим более детально суперглобальный массив $_FILES

    Для каждого загруженного файла массив $_FILES содержит массив, со следующими данными:
    $_FILES[‘fileToUpload’][‘name’] — исходное имя файла, такое, каким его видел пользователь, выбирая файл;
    $_FILES[‘fileToUpload ‘][‘type’] — mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
    $_FILES[‘fileToUpload’][‘size’] — размер загруженного файла в байтах;
    $_FILES[‘fileToUpload’][‘tmp_name’] — полный путь к временному файлу на диске;
    $_FILES[‘fileToUpload’][‘error’] — Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно
    .
    Где [‘fileToUpload’] имя тега <input> через который загружается файл.

    php коды ошибок передаваемые через $_FILES[‘fileToUpload’][‘error’]

    UPLOAD_ERR_OK
    Значение: 0; Ошибок не возникало, файл был успешно загружен на сервер.

    UPLOAD_ERR_INI_SIZE
    Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.

    UPLOAD_ERR_FORM_SIZE
    Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.

    UPLOAD_ERR_PARTIAL
    Значение: 3; Загружаемый файл был получен только частично.

    UPLOAD_ERR_NO_FILE
    Значение: 4; Файл не был загружен.

    UPLOAD_ERR_NO_TMP_DIR
    Значение: 6; отсутствует временная папка.

    UPLOAD_ERR_CANT_WRITE
    Value: 7;ошибка записи на диск. С версии PHP 5.1.0.

    UPLOAD_ERR_EXTENSION
    Value: 8; Загрузка остановлена. Модуль PHP не имеет возможности загрузить файл; проверьте список загруженных модулей через phpinfo(). С версии PHP 5.2.0.

    Создайте файл «upload.php», И добавьте в него скрипт приведенный ниже.
    Необходимо создать папку uploads, в которую будет копироваться загружаемый файл.

    Первая часть скрипта. Первоначальная проверка файла. В этом скрипте мы проверим, что файл является картинкой.

    <?php
    $target_dir = "uploads/"; //Задаем папку в которую загружается файл.
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
    // Проверяем, что файл является картинкой.
    if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
    echo "Файл является картинкой - " . $check["mime"] . "";
    $uploadOk = 1;
    } else {
    echo "Файл не является картинкой допустимого формата.";
    $uploadOk = 0;
    }
    }
    ?>

    Описание PHP скрипта проверки типа файла:

    $target_dir = «uploads/» – задаем папку, в которую будем сохранять загружаемый файл
    $target_file в этой переменной хранится полный путь файла.
    $uploadOk=1 переменная в которой будет храниться статус ошибки. 1- ошибок нет.
    $imageFileType в этой переменной мы храним расширение файла
    Теперь проверим файл на соответствие заявленному расширению. Проверим соответствует ли расширение содержимому файла.
    Замечание: Вам необходимо создать каталог «uploads» в том каталоге в котором создан файл «upload.php». Все загружаемые файл будут храниться там.

    Проверим, существует ли такой файл.
    Для начала проверим существует ли файл и если он существует обнулим переменную $uploadOk:

    // Проверка существует ли файл.
    if (file_exists($target_file)) {
    echo "Файл уже существует.";
    $uploadOk = 0;
    }

    Ограничим размер файла.
    Не очень хорошо загружать фалы большого размера и отображать их на страницах сайта. В этом случае страница будет загружаться очень долго.
    Проверим если размер картинки больше 500kb, в случае если фал большой, то мы обнулим $uploadOk и выведем сообщение файл слишком большой:

    // Проверим размер файла
    if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Извините, ваш файл слишком большой.";
    $uploadOk = 0;
    }

    Разберем следующую часть скрипта которая проверяет расширение файла.
    Код приведенный ниже позволяет загружать только JPG, JPEG, PNG и GIF файлы. Все остальные не будут загружаться и выдадут сообщение об ошибке и обнулят $uploadOk :

    // Разрешаем только определенные форматы фалов. Проверяем значение переменной $imageFileType в которой хранится расширение файлов.
    if($imageFileType != "jpg" and $imageFileType != "png" and $imageFileType != "jpeg" and $imageFileType != "gif" ) {
    echo "Загрузка разрешена только JPG, JPEG, PNG & GIF файлов. Неверный формат файла";
    $uploadOk = 0;
    }

    Полный скрипт загрузки файла изображения.
    Полный скрипт «upload.php» теперь выглядит следующим образом:

     

    move_uploaded_file — Перемещает загруженный файл в новое место

    Описание

    bool move_uploaded_file ( string $filename , string $destination )

    Эта функция проверяет, является ли файл filename загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination.

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

    <meta charset="utf-8">
    <?
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
    if(isset($_POST["submit"])) {
     $uploadOk = 1;
     echo '<pre>';
     print_r ($_FILES);
     echo '</pre>';
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
    echo "Файл является изображением - " . $check["mime"] . "";
    $uploadOk = 1;
    } else {
    echo "Файл не является изображением или поврежден.";
    $uploadOk = 0;
    }
    
    if (file_exists($target_file)) {
    echo "Извините файл уже существует.";
    $uploadOk = 0;
    }
    if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Файл слишком большой.";
    $uploadOk = 0;
    }
    if($imageFileType != "jpg" and $imageFileType != "png" and $imageFileType != "jpeg" and $imageFileType != "gif" ) {
    echo "Только JPG, JPEG, PNG & GIF можно загружать. Неверное расширение файла";
    $uploadOk = 0;
    }
    if ($uploadOk == 0) {
    echo "Ошибка загрузки файла.";
    } else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "Файл ". basename( $_FILES["fileToUpload"]["name"]). " загружен.";
    } else {
    echo "Ошибка копирования файла.";
    }
    }
    }
    ?>
    <form action="" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
    </form>

    Php Отправка Email

    Функция mail отправляет сообщение на почту.

    function utf8mail($to,$s,$body,$from_name="x",$from_a = "info@x.com", $reply="info@x.com")
    {
    $s= "=?utf-8?b?".base64_encode($s)."?=";
    $headers = "MIME-Version: 1.0\r\n";
    $headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
    $headers.= "Content-Type: text/html;charset=utf-8\r\n";
    $headers.= "Reply-To: $reply\r\n";
    $headers.= "X-Mailer: PHP/" . phpversion();
    mail($to, $s, $body, $headers);
    }
    

     

     

    <?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';
      $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);
    }?>
    
    
    
    
    Active.php
    
    <meta charset="utf-8">
    <?
    mysql_connect("localhost","root","");
    mysql_select_db('baza');
    
    $res=mysql_query("SELECT * from `users` where `email`='{$_GET['email']}'");
    $data=mysql_fetch_array($res);
    echo "SELECT * from `users` where `email`='{$_GET['email']}'" . "<br>";
    if($data['id']){
     $auth=md5($_GET['email']).md5($data['id']);
     echo $auth;
     if($auth==$_GET['auth']){
     $upd=mysql_query("update `users` set `auth`='1' where`email`='{$_GET['email']}'"); 
     if($upd='TRUE'){
     echo 'Поздравляем, регистрация прошла успешно!';
     }
     } 
     else {echo 'Возникла ошибка, попробуйте зарегистрироваться заново!';}
    }
    
    ?>

     

    База данных

     

    -- phpMyAdmin SQL Dump
    -- version 4.0.10.6
    -- http://www.phpmyadmin.net
    --
    -- Хост: 127.0.0.1:3306
    -- Время создания: Мар 16 2016 г., 17:11
    -- Версия сервера: 5.5.41-log
    -- Версия PHP: 5.3.29
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    
    --
    -- База данных: `iweb`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `posts`
    --
    
    CREATE TABLE IF NOT EXISTS `posts` (
      `id` int(255) NOT NULL AUTO_INCREMENT,
      `title` text NOT NULL,
      `content` text NOT NULL,
      `author` varchar(50) NOT NULL DEFAULT 'Жарова Салтанат',
      `img` varchar(200) NOT NULL DEFAULT 'default.jpg',
      `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
    
    --
    -- Дамп данных таблицы `posts`
    --
    
    INSERT INTO `posts` (`id`, `title`, `content`, `author`, `img`, `date`) VALUES
    (2, 'Lorem Ipsum', 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry''s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:42:22'),
    (6, 'long established fact', 'It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:46:47'),
    (7, 'Contrary to popular belief', 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:48:08'),
    (9, 'Lorem Ipsum', '<b>There are many</b> variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don''t look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn''t anything embarrassing hidden in the middle of text. <p style="color:red;">All the Lorem Ipsum </p>generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:48:50'),
    (10, 'The point of using', 'It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:49:09'),
    (11, 'default model', '<strong>It is a long established</strong> fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''Content here, content here'', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for ''lorem ipsum'' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).', 'Жарова Салтанат', 'images/default.jpg', '2016-03-04 11:49:19'),
    (14, 'Lorem Ipsum - это текст-"рыба"', 'Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.', 'Жарова Салтанат', 'images/default.jpg', '2016-03-07 10:10:01'),
    (15, 'заполнение шаблона 11145', 'Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает сосредоточиться. Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации "Здесь ваш текст.. Здесь ваш текст.. Здесь ваш текст.." Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию, так что поиск по ключевым словам "lorem ipsum" сразу показывает, как много веб-страниц всё ещё дожидаются своего настоящего рождения. За прошедшие годы текст Lorem Ipsum получил много версий. Некоторые версии появились по ошибке, некоторые - намеренно (например, юмористические варианты).', 'Жарова Салтанат', 'images/default.jpg', '2016-03-07 10:10:26'),
    (16, 'Есть много вариантов Lorem Ipsum', 'Есть много вариантов Lorem Ipsum, но большинство из них имеет не всегда приемлемые модификации, например, юмористические вставки или слова, которые даже отдалённо не напоминают латынь. Если вам нужен Lorem Ipsum для серьёзного проекта, вы наверняка не хотите какой-нибудь шутки, скрытой в середине абзаца. Также все другие известные генераторы Lorem Ipsum используют один и тот же текст, который они просто повторяют, пока не достигнут нужный объём. Это делает предлагаемый здесь генератор единственным настоящим Lorem Ipsum генератором. Он использует словарь из более чем 200 латинских слов, а также набор моделей предложений. В результате сгенерированный Lorem Ipsum выглядит правдоподобно, не имеет повторяющихся абзацей или "невозможных" слов.,hj,hj,h', 'Жарова Салтанат', 'images/default.jpg', '2016-03-07 10:10:45'),
    (17, 'ugkj,m', 'sdxfcghjbkml;,./uo;jkm.,', 'Жарова Салтанат', 'images/default.jpg', '2016-03-14 10:14:16'),
    (18, 'sfdsfsdfds', 'fdsfdsfsdsdfsdfsdfdfsdfdsfd', 'Жарова Салтанат', 'images/uploads/user.png', '2016-03-14 10:29:59'),
    (19, 'sfdsfsdfds', 'fdsfdsfsdsdfsdfsdfdfsdfdsfd', 'Жарова Салтанат', 'uploads/user.png', '2016-03-14 10:35:51'),
    (20, 'sdfsdfsdf', 'sdfsdf sdfsdfsdf sdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdf sdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdf sdfsdf sdfsdfsdfsdfsdf sdfsdfsdfsdfsdf sdfsdfsdf', 'Жарова Салтанат', 'images/uploads/balkon_dver.jpg', '2016-03-14 13:40:22');
    
    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `users`
    --
    
    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(200) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `email` varchar(20) NOT NULL,
      `pass` varchar(255) NOT NULL,
      `auth` int(1) NOT NULL,
      `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;
    
    --
    -- Дамп данных таблицы `users`
    --
    
    INSERT INTO `users` (`id`, `name`, `email`, `pass`, `auth`, `date`) VALUES
    (16, 'saltik', 'saltik91@mail.ru', '698d51a19d8a121ce581499d7b701668', 1, '0000-00-00 00:00:00'),
    (17, 'ddd', 'ddd@ddd.ti', '202cb962ac59075b964b07152d234b70', 1, '0000-00-00 00:00:00'),
    (19, 'Salta', 'aaa@aaa.aaa', '202cb962ac59075b964b07152d234b70', 1, '2016-03-14 16:18:19');
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    

     

     

    Результат 10 уроков можно скачать по этой ссылке 

     

    Пример простой админки

    <?
    session_start();//запустили работу с сессиями
    if($_GET['exit']==1)
      unset($_SESSION['login']);
    if($_SESSION['login']!='admin')
      {
      header("location: login.php");
      }
    mysql_connect("localhost","root","");//соединились с базой данных
    mysql_select_db("users");//выбрали базу данных с которой будем работать
    
    if($_GET['spam']>0)
      mysql_query("update `posts` set 
        `status`='spm' where `id` = '{$_GET['spam']}'");
    if($_GET['ok']>0)
      mysql_query("update `posts` set 
        `status`='ok' where `id` = '{$_GET['ok']}'");
    if($_GET['new']>0)
      mysql_query("update `posts` set 
        `status`='new' where `id` = '{$_GET['new']}'");
    
    if(isset($_POST['h1']))
    {
      if($_GET['edit']>0)
        {
        mysql_query("update `posts` set `h1`='{$_POST['h1']}',
        `text`='{$_POST['text']}' where `id`={$_GET['edit']} 
        ");	
        header("location: index.php");
        }
      else
        {
        do{
          $n=rand(0,1000000000000);
        }while(file_exists("../images/{$n}.jpg"));
        move_uploaded_file($_FILES['myfile']['tmp_name'],"../images/{$n}.jpg");	
        mysql_query("insert into `posts` (`h1`,`text`,`img`) 
        values ('{$_POST['h1']}','{$_POST['text']}','{$n}.jpg');
        ");	
      }
      
    }
    if($_GET['edit']>0)
    {
    $t=mysql_query("select * from `posts` where 
      `id`={$_GET['edit']}");	
    $r=mysql_fetch_array($t);	
    }
    if($_GET['del']>0)
    {
    mysql_query("delete from `posts` where `id`='{$_GET['del']}'");
    }
    ?>
    <meta charset='utf-8'>
    <h1>Вы находитесь в админ панели сайта</h1>
    <a href='?exit=1'>Выход</a>
    <form method='post' enctype='multipart/form-data'>
    <input name="h1" style='Width:400px' value='<?=$r['h1'];?>'><br>
    <textarea name="text" style='Width:400px;height:400px;'>
    <?=$r['text'];?>
    </textarea><br>
    <input type='file' name='myfile'><br>
    <input type='submit' value='Сохранить'>
    </form>
    <hr>
    <?
    $table=mysql_query("select * from posts");
    while($r=mysql_fetch_array($table))
    {
    echo "<h1>{$r['h1']}</h1>";
    echo "<img src='../images/{$r['img']}' height='300px'>";
    echo "<p>{$r['text']}</p>";
    echo "<p style='color:green'>Текущий статус: {$r['status']}</p>";
    echo "Поменять статус: <a href='?spam={$r['id']}'>Спам</a> | ";
    echo "<a href='?new={$r['id']}'>Новая</a> | ";
    echo "<a href='?ok={$r['id']}'>Утвердить</a><br>";
    
    echo "<a href='?del={$r['id']}'>Удалить</a> | ";
    echo "<a href='?edit={$r['id']}'>Редактировать</a><hr>";
    
    }
    
    ?>

     

  • Задание по php к четвертому уроку

    Задание.
    1. Создать форму регистрации пользователя.
    2. Сделать проверку в базе данных существует ли пользователь с таким логином.
    3. Если существует предложить перейти на форму входа на сайт или сменить пароль.
    4. Если пользователь не существует, то добавить его в базу данных.
    5. Создать форму входа на сайт.
    6. Создать форму смены пароля.
    7. Создать страницу подтверждения емайла.

     1. Для этого создадим файл registration.php в нем будет хранится наша форма для регистрации. В результате получим такой код:

     

    <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</title>
    </head>
    <body>
    <form action="proverka.php" method="POST"> // страница обработчик
    
    <table>
    <tr>
    <td>Пароль<font color="red">*</font>:</td>
    <td><input type="password" size="20" maxlength="20" name="password"></td>
    </tr>
    <tr>
    <td>Подтверждения пароля<font color="red">*</font>:</td>
    <td><input type="password" size="20" maxlength="20" name="password2"></td>
    </tr>
    <tr>
    <td>E-mail<font color="red">*</font>:</td>
    <td><input type="text" size="20" name="email"></td>
    </tr>
    <tr>
    <td>Имя:</td>
    <td><input type="text" size="20" name="name"></td>
    </tr>
    <tr>
    <td>Фамилия:</td>
    <td><input type="text" size="20" name="lastname"></td>
    </tr>
    <tr>
    <td></td>
    <td colspan="2"><input type="submit" value="Зарегистрироваться" name="submit"></td>
    </tr>
    </table>
    </form>
    
    <br><font color="red">*</font> обязательны для заполнения
    </body>
    </html>

    При сохранении файла обязательно указать кодировку как и в предыдущих уроках и смотрим результат:

    у4-1

    рис 1

    2. Теперь создадим базу данных, в которой будут храниться данные зарегистрированных пользователей. Для этого:

    а)

    у4-2

    рис 2

     Выбрем дополнительно-> phpMyAdmin;

    b) Откроется окно где нужно указать пользователь root пароль не нужно указывать и ок.

    у4-7

    рис 3

    Откроется следующее окно:

    у4-4

    рис 4

    Во вкладке базы данных вводим название test выбираем utf8_general_ci и жмем создать:
    c) Теперь в нашей базе данных нужно создать таблицу users где и будут храниться данные пользователей. Для этого выбираем нашу базу данных test->новая откроется следующее окно.

    у4-3

    рис 5

    d) Перед тем как заполнять поля таблицы мы добавим еще 2 так как имеющихся нам не хватит для нужной нам таблицы:

    у4-6

    рис 6

    Далее заполняем поля:

    В столбцу имя указываем названия полей: id, email, password, date, name_user, lastname. Для поля id указываем тип int длина значения 11 этого будет достаточно. Для поля date выбираем тип timestamp. Для всех остальных полей выбираем тип varchar и длина 255. Для всех полей в графе сравнения указываем utf8_general_ci. И сохранить.

    у4-8

    рис 7

    3. Теперь нам нужна страница обработчик, которая указывается в строчке <form action=»proverka.php» method=»POST»> // страница обработчик. Создаем страницу proverka.php.
    Первый код программы на странице:

    <?php 
    $connect=mysql_connect("localhost","root",""); /* Здесь мы подключаемся к базе используя функцию mysql_connect, в ней следует указать три параметра 1)сервер базы данных 2)логин пользователя БД 3)пароль пользователя БД */
    $db=mysql_select_db("test");
    //Здесь мы указываем 
    //какую БД будем использовать
    ?>

    Второй код программы:

     <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</title>
    </head>
    <body>
     <?php
    if (isset($_POST['submit'])){
    $password = $_POST['password'];
    $mdPassword = md5($password);
    $password2 = $_POST['password2'];
    $email = $_POST['email'];
    $name = $_POST['name'];
    $lastname = $_POST['lastname']; 
    $table=mysql_query("SELECT * FROM `users` WHERE `email`='$email'"); // проверка на существование email в базе данных
    $res=mysql_fetch_array($table);
    if($res['email']==$email){
    echo '<font color="red">Пользователь с таким e-mail уже зарегистрирован!</font><a href="index.php">Войти на сайт</a> или <a href="SmenaParolya.php">сменить пароль</a>';
    }
    else{
    if ($password==$password2) // сравнение введённых пользователем паролей
    {
    $query = mysql_query("INSERT INTO `users` (password, email, name_user, lastname ) VALUES ('$mdPassword', '$email', '$name', '$lastname')");
    echo '<font color="green">Вы успешно зарегистрировались!</font><br><a href="index.php">На главную</a>';
    $query = mysql_query("select * from `users` where `email`='$email' and`password`='$mdPassword'");
    $res=mysql_fetch_array($query);
    echo '<a href="aktiv.php?id1='.$res['id'].'&id2='.$res['password'].'">активировать</a>'; // ссылка на страницу для активации
    }
    else {
    echo '<font color="red">Пароли не совпадают!</font>';
    }
    }
    }
    ?>
    </body>
    </html>

    Теперь пользователи могут регистрировать на сайте. Проверим работу формы:

    у4-9

    рис 8

    После нажатия кнопки зарегистрироваться выйдет окно:

    у4-10

    рис 9

    А в базе данных появится информация пользователя.

    у4-11

    рис 10

    Так как пользователи у нас уже существуют создадим форму входа на сайт. Для этого:

    1. Создадим форму входа на странице index.php ee код будет таким:

     

    <form action="login.php" method="POST"> <!-- страница обработчик-->
    <table>
    <tr>
    <td>E-mail:</td>
    <td><input type="text" name="email"></td> <!--поле для ввода email-->
    </tr>
    
    <tr>
    <td>Пароль:</td>
    <td><input type="password" name="password"></td> <!--поле для пароля-->
    </tr>
    
    <tr> // кнопка войти
    <td colspan="2"><input type="submit" value="Войти" name="submit"></td>
    </tr>
    </table>
    </form>
    
    <a href="registration.php">Регистрация</a> <br /> <!-- ссылка для тех кто еще не зарегистрирован-->

    И добавим ее в начало страницы сразу же после меню.

    2. Теперь создадим страницу обработчик login.php . Ее код будет такой:

     

    <?php // как и на странице proverka.php
    
    $connect=mysql_connect("localhost","root","");
    $db=mysql_select_db("test");
    
    ?>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</title>
    </head>
    <body>
    <?php
    
    if (isset($_POST['submit'])){
    
    $password = md5($_POST['password']);
    $email = $_POST['email'];
    
    $table=mysql_query("SELECT * FROM `users` WHERE `email`='$email' and `password`='$password'");
    $res=mysql_fetch_array($table);
    if($res['email']==$email and $res['password']==$password) // сравниваем введенные пользователем email и password с данными в базе существует ли такой пользователь или нет
    {
    echo '<font color="green">Добро пожаловать на сайт!</font>';
    }
    else {
    echo '<font color="red">Введите верные пароль и email или </font><a href="registration.php">зарегистрируйтесь</a>';
    }
    }
    ?>
    </body>
    </html>

    Проверяем работу формы:

    у4-12

    рис 11

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

    у4-13

    рис 12

    3. Перед тем как создать страницу для проверки email добавим новое поле в таблицу базы данных status. Выбираем вкладку структура, откроется окно:

    у4-14

    рис 13

    Внизу есть строчка добавить 1 поле и ok. Откроется следующее окно:

    у4-15

    рис 14

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

    4. Создадим страницу подтверждения email . В коде на странице proverka.php была такая строчка
    $query = mysql_query(«select * from `users` where `email`=’$email’ and `password`=’$mdPassword’»);
    $res=mysql_fetch_array($query);
    echo ‘<a href=»aktiv.php?id1=’.$res[‘id’].’&id2=’.$res[‘password’].’»>активировать</a>’;
    и ссылка активировать после регистрации: (рис 9)

    Создадим страницу aktiv.php . Ее код будет такой:

    <?php // как и на страницах proverka.php и login.php подключение к базе данных обязательно 
    $connect=mysql_connect("localhost","root","");
    $db=mysql_select_db("test");
    ?>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</title>
    </head>
    <body>
    <?php
    $query = mysql_query("select * from `users` where `id`='".$_GET['id1']."' and `password`='".$_GET['id2']."'"); // выбираем из базы данных его id и пароль подписывая как id2 в целях безопсности.
    $res=mysql_fetch_array($query); 
    if($res['id']==$_GET['id1']) // сравниваем результат и данные адресной строки
    {
    echo "ok";
    mysql_query("update `users` set `status`='active' where `id`='".$_GET['id1']."' and `password`='".$_GET['id2']."'"); 
    }
    else
    echo 'err';
    ?>
    </body>
    </html>

    Теперь при нажатии на ссылку активировать будет выходить такое окно:

    у4-16

    рис 15

    И статус пользователя будет меняться в базе данных:

    у4-17

    рис 16

    И на следующем этапе создадим форму смены пароля . Для этого:

    1. Создадим страницу SmenaParolya.php. Ее код будет таким:

    <?php
    $connect=mysql_connect("localhost","root","");
    $db=mysql_select_db("test");
    ?>
    <html>
    <head>
    <meta charset='utf-8'>
    <title>My First PHP Page</title>
    </head>
    <body>
    <?php
    if (isset($_POST['submit'])){
    $np=mysql_query("update `users` set password = '".md5($_POST['passwordn'])."' where `email` = '".$_POST['email']."'"); // заменить данные пароль на новые
    $res=mysql_query($np);
    echo '<font color="green">Пароль сохранен успешно!</font>';
    }
    ?>
    <form method="POST">
    <table>
    <tr>
    <td>E-mail:</td>
    <td><input type="text" name="email"></td>
    </tr>
    <tr>
    <td>Новый пароль:</td>
    <td><input type="password" name="passwordn"></td>
    </tr>
    <tr>
    <td colspan="2"><input type="submit" value="Сохранить" name="submit"></td>
    </tr>
    </table>
    </form>
    </body>

    И добавим ссылку на эту страницу в index.php сразу же после ссылки на регистрацию:

    <a href=»SmenaParolya.php»>Заменить пароль</a> <br />

    у4-18

    рис 17

    Теперь проверим работу формы заменим одному из зарегистрированных раннее пользователь пароль.
    Информация в базе данных до смены пароля:

    у4-19

    рис 18

    Информация в базе данных после смены пароля:

    у4-20

    рис 19

    Форма работает.