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

Инструменты сайта


php

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

php [2018/08/12 03:00] (текущий)
Строка 1: Строка 1:
 +====== PHP ======
 +**РНР** (читается как пи-эйч-пи) является интерпретируемым языком программирования.
  
 +  * [[class DFunction]] и полезные функции
 +  * [[cURL]]
 +  * [[FAQ]]
 +  * [[Массивы PHP]]
 +  * [[PHP CLI в командной строке(command line)]]
 +  * [[snmp#​php_and_snmp|PHP and SNMP]]
 +  * [[Composer]] - система управления пакетами для PHP.
 +  * [[Стандарты кодирования]]:​ правила наименования классов,​ PHP_CodeSniffer и т.д..
 +  * [[php.ini]] - конфигурационный файл PHP
 +  * [[Протоколирование ошибок PHP]]. Как перенаправить вывод ошибок PHP в браузер непосредственно из скрипта?​
 +  * [[Сессии]] - управление механизмом сессий в PHP
 +  * [[Xdebug]] - модуль для отладки PHP скриптов.
 +  * [[RegExp PHP]] - описание функций для использования регулярных выражений в [[PHP]].
 +  * [[Парсинг сайтов на PHP]]
 +  * ООП [[Классы и объекты]]
 +  * [[Файл инициализации приложения]]. Автоматическая загрузка классов.
 +  * [[Отправка электронной почты при помощи PHP]]: стандартная функция mail, Mail_Mime
 +  * [[Шаблонизаторы для PHP]]. Изолирование от HTML (смешанный режим).
 +  * [[phpinfo]]
 +  * [[PhpSysInfo]] написанный на PHP скрипт предоставляющий информацию о системе. ​
 +  * [[HTTP-аутентификация]] в PHP, Apache
 +  * [[wpru>​phpDocumentor]] PHPDoc - система документирования исходных текстов на PHP.  Альтернативой использованию phpDocumentor является Doxygen. **ApiGen** заменил PHPDocumentor как предпочитаемое средство работы с документацией для IDE [[NetBeans]]. ​
 +  * Базы данных:​
 +       * [[PDO]] - библиотека унифицированных методов для доступа к различным базам данных.
 +       * [[MySQLi или MySQL]] - взаимодействие PHP с [[MySQL]]
 +       * [[php-pgsql]] (php5-pgsql) - взаимодействие PHP с [[PostgreSQL]]
 +       * [[php-sqlite]] (php5-sqlite) - взаимодействие PHP c [[SQLite]]
 +  * [[php5-gd]] GD Graphics Library
 +  * [[XML]]: [[SimpleXML]]
 +  * [[SOAP]] в PHP
 +  * [[JSON]]
 +  * [[PHP генерация отчетов]] - создание отчетов в виде файлов [[csv#​format_fajla_xlsx|.xlsx]]
 +  * [[PHP LDAP]]
 +  * [[CSV]]
 +  * [[http://​us3.php.net/​manual/​ru/​refs.international.php|Поддержка языков и кодировок]]:​ многобайтные строки,​ iconv.
 +  * [[http://​php.net/​manual/​ru/​function.call-user-func.php|call_user_func]] - вызов callback функция. Прекрасно заменяет громоздкий switch.
 +  * [[http://​www.php.net/​manual/​ru/​language.types.string.php|Одинарные,​ двойные кавычки,​ heredoc-синтаксис,​ nowdoc-синтаксисом]]
 +  * PHP - создание PDF:
 +       - [[http://​www.fpdf.org|FPDF]] - нет встроенной поддержки Unicode, [[http://​www.fpdf.org/​en/​script/​script92.php|нужно патчить]]
 +       - PDFlib - бесплатна только для некоммерческого использования
 +       - [[TCPDF]] + подключение к [[Kohana]]
 +  * [[http://​www.php.net/​manual/​ru/​refs.basic.vartype.php|Расширения,​ относящиеся к переменным и типам]]:​ Ctype — Функции определения типа символов,​ Filter — Фильтрация данных.
 +  * [[mnogopotochnost?&#​mnogopotochnost_php|Многопоточность PHP]]: PCNTL
 +  * [[http://​php.net/​manual/​ru/​features.commandline.webserver.php|Встроенный web-сервер]]<​file bash websrv_start.sh>​
 +#!/bin/bash
 +/​usr/​bin/​php -S localhost:​8000 -t ~/​Dropbox/​php/​
 +</​file>​
 +  * [[https://​github.com/​Sybio/​GifCreator|GifCreator]] - класс PHP, который генерирует анимированные GIF из нескольких изображений.
 +====== Синтаксис ======
 +  * **Код на PHP начинается** с открывающего дескриптора **<?​php**,​ после которого следует исходный код PHP до конца файла. Как правило,​ они **не** завершаются закрывающим дескриптором **?>**. Закрывающий дескриптор является необязательным и в файлах содержащих только код PHP рекомендуется его опускать.
 +  * Для того чтобы **объявить переменную в PHP**, вначале имени переменной,​ ставиться знак $.
 +  * **Переменная** создаётся в момент первого присваивания ей значения. Прежде чем использовать переменную настоятельно рекомендуется присвоить ей значение.
 +  * **Имена переменных чувствительны к регистру,​ а имена функций нет**. Т.е. $Name и $name - это разные переменные,​ а Name() и name() - одинаковые функции.
 +  * Специальное значение [[http://​php.net/​manual/​ru/​language.types.null.php|NULL]] представляет собой переменную без значения.
 +  * Комментарии<​file>​
 +// или # - однострочный комментарии. /**/ - многострочный комментарий.
 +</​file>​
 +  * Строки заключённые в **одинарные кавычки**,​ трактуются как обычные литералы. При использовании одинарных кавычек следует экранировать только два специальных символа:​ обратную косую черту и саму одинарную кавычку,​ например<​file>​
 +print '​Кот-д\'​Ивуар - \изумительная\ страна.';​
 +</​file>​
 +  * Строки заключённые в **двойные кавычки** интерпретатор PHP будет пытаться вычислить.
 +  * **Символ тире и "​больше"​ (->)** обозначают вызов метода из класса.
 +  * **Двойное двоеточие (::)** обознает вызов статического метода из класса.
 +  * **Символ точка и интерполяция**. Строки в РНР объединяются при помощи символа точки (.), при этом все типы, отличные от строкового,​ приводятся К нему автомати­чески. Однако это не единственный способ формирования строки : можно прибегнуть к так называемой **интерполяции**,​ при которой переменная встав­ляется в строку,​ заключенную в двойные кавычки. Например,​ переменная $name = "​Hello"​ , подставленная в строку "$name world!",​ при водит к фор­мированию строки " Hello world!"​. **Аналогично можно подставлять в строку значения членов класса.** Однако конструкция $this->​имя_члена достаточно сложна для интерпретации. Для того чтобы интерпретатор мог корректно различить обращение к члену клас­са из строки,​ необходимо заключить переменную в фигурные скобки,​ например<​file>​
 +    public function get_full_info()
 +    {
 +      return "​{$this->​get_info()} ({$this->​get_age()})";​
 +    }
 +</​file>​
 +  * **Фигурные скобки {}** обозначают начало и конец выполняемых конструкций,​ если их **не** использовать в операторах (if, for и т.д.) будет выполняться только одна конструкция. Например:​ Вывести все [[grafika_dlja_web-dizajna|Веб корректные(безопасные) цвета]] (всего 216 цветов):<​file>​
 +<?php
 +for ($rr = 0; $rr <= 0xFF; $rr += 0x33)
 + for ($gg = 0; $gg <= 0xFF; $gg += 0x33)
 +  for ($bb = 0; $bb <= 0xFF; $bb += 0x33)
 +   ​printf("​%02X%02X%02X\n",​ $rr, $gg, $bb);
 +?>
 +
 +</​file>​**Фигурные скобки {}** можно применять для экранирования переменных,​ например<​file>​
 +echo "​Цена:​ ${Cost}UAH "; ​
 +// или
 +echo "​Цена:​ {$Cost}UAH ";
 +</​file>​
 +  * [[http://​php.net/​manual/​ru/​control-structures.alternative-syntax.php|Альтернативный синтаксис управляющих структур]]:​ if, while, for, foreach и switch. В каждом случае основной формой альтернативного синтаксиса является изменение открывающей фигурной скобки на двоеточие (:), а закрывающей скобки на endif;, endwhile;, endfor;, endforeach; или endswitch; соответственно.
 +===== Операторы =====
 +  * **Цикл for**. Синтаксис:<​file>​
 +FOR (условие1;​ условие2;​ условие3)выражения
 +</​file>​PHP поддерживает альтернативный синтаксис FOR:<​file>​FOR(усл1;​ уcл2; усл3;​):​операторы;​...;​ENDFOR;</​file> ​
 +
 +  * условие1 - Безусловно выполняется (вычисляется) в начале цикла
 +  * условие2 - Проверяется в начале каждой итерации. Если оно равно TRUE, то цикл продолжается и выполняются вложенные операторы. Если оно равно FALSE, то цикл заканчивается.
 +  * условие3 - Выполняется (вычисляется) в конце каждой итерации.
 +Каждое из этих условий может быть пустым.
 +
 +**Пример**. Так как условие1 безусловно выполняется один раз в начале цикла - это можно использовать для записи более компактного кода.<​file php array1.php>​
 +$matches = array('​Makap',​ true, '​false',​ 35);
 +
 +for ($i = 0, $cnt=count($matches);​ $i < $cnt; $i++) {
 +        echo "​$matches[$i]\n";​
 +}
 +</​file>​
 +  * [[http://​php.net/​manual/​ru/​control-structures.foreach.php|Конструкция foreach предоставляет простой способ перебора массивов]]. Когда оператор foreach начинает исполнение,​ внутренний указатель массива автоматически устанавливается на первый его элемент. Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной $value должен предшествовать знак &. У цикла foreach существует альтернативный вариант записи:<​file php>
 +<?php foreach ($array as $item): ?>
 +<​li><?​=$item?></​li>​
 +<?php endforeach; ?>
 +</​file>​
 +Вместо фигурных скобок используется закрывающее выражение endforeach, открывающая конструкция завершается двоеточием,​ а закрывающая – точкой с запятой.
 +
 +<note tip>В альтернативном варианте можно записать также: for, while, if-else, switch-case.</​note>​
 +===== Функции =====
 +Функция объявляется при помощи ключевого слова function, за которым следуют ее имя и какие либо параметры в скобках. Для вызова функции достаточно указать ее имя и задать значения аргументов для каждого ее параметра. Если функция возвращает значение,​ то можно присвоить результат функции переменной.
 +
 +PHP анализирует весь файл до его выполнения,​ поэтому можно произвольно размещать объявления функций и их вызовы. Однако в PHP запрещено переопределение функций. Если PHP обнаруживает функцию с именем ранее найденной функции,​ то он выдает фатальную ошибку и «умирает».
 +
 +Если не определено обратное,​ все значения передаются в функцию и из функции по значению,​ а не по ссылке. Это означает,​ что PHP создает копию значения и предоставляет эту копию для обработки. Поэтому любые изменения,​ происходящие с копией,​ не влияют на оригинальное значение. Во многих языках передача переменных по ссылке имеет еще одно преимущество – она значительно быстрее передачи по значению. И хотя для PHP это тоже справедливо,​ но разница в скорости минимальная. По этой причине прибегать к передаче по ссылке нужно только **при реальной необходимости и никогда в целях улучшения производительности**.
 +
 +Для того чтобы **функция принимала аргументы по ссылке**,​ а не по значению,​ поставьте символ & перед именем параметра в прототипе функции:<​file>​
 +function wrap_html_tag(&​$string,​ $tag = '​b'​) {
 +   ​$string = "<​$tag>​$string</​$tag>";​
 +}
 +</​file>​Теперь нет необходимости возвращать строку,​ поскольку изменяется сам оригинал.
 +  * Вывести все подключенные функции PHP<​file>​
 +print_r(get_defined_functions());​
 +</​file>​
 +<​note>​Желательно чтобы функция всегда возвращала значение,​ чтобы можно было проверить выполнилась функция или нет.</​note>​
 +
 +====== PHP и JavaScript ======
 +**Взаимодействие PHP и [[JavaScript]]**
 +  * [[http://​on-line-teaching.com/​php/​phpvsjs.htm|Взаимодействие PHP и JavaScript]]:​ Язык PHP предназначен для написания скриптов,​ которые выполняются на стороне сервера,​ а в браузер клиента отправляется не сам скрипт,​ а только результаты его работы. ​ Это означает,​ что пользователь,​ загрузивший страницу вашего сайта, никогда не увидит исходный код скрипта и может даже не догадываться,​ что страница создана динамически. В свою очередь,​ на языке [[JavaScript]] создаются исключительно клиентские скрипты,​ которые исполняются в браузере клиента. Для сервера скрипты JavaScript – это обычные текстовые данные,​ ничем не отличающиеся от прочего содержимого страницы. Поэтому ​ прямое взаимодействие скриптов на PHP и JavaScript невозможно. Для передачи данных между клиентской и серверной стороной можно использовать один из трёх вариантов:​
 +  - Внесение изменений в текст страницы,​ например в php файле<​file>​
 +echo '
 +<​html><​head>​
 +<​script>​
 +var fromDate="'​.$_POST['​fromDate'​].'";​
 +var toDate="'​.$_POST['​toDate'​].'";​
 +</​script>​
 +...Your HTML here
 +';
 +</​file>​После загрузки при помощи JavaScript считываются переменные fromDate и toDate.
 +  - Использование [[Cookie]]
 +  - Использование [[Ajax]]
 +===== Суперглобальные переменные =====
 +  * [[http://​www.php.net/​manual/​ru/​reserved.variables.php|Суперглобальные переменные PHP]]
 +
 +**Переменная $GLOBALS**. Ассоциативный массив (array), содержащий ссылки на все переменные глобальной области видимости скрипта,​ определенные в данный момент. Имена переменных являются ключами массива.<​note>​Опция (register_globals=On) в [[php.ini]] указывает на необходимость регистрации переменных,​ полученных методом [[POST]] или [[GET]] в глобальный массив $GLOBALS.</​note><​file>​
 +<?php
 +$conf['​conf'​]['​foo'​] = 'this is foo';
 +$conf['​conf'​]['​bar'​] = 'this is bar';
 +global $conf; // добавляем переменную в глобальный массив видимости скрипта
 +$output = print_r($GLOBALS["​conf"​],​ true);
 +echo "​$output\n";​
 +?></​file>​Для объявления глобальной переменной ее достаточно поместить в массив $GLOBALS<​file>​
 +$GLOBALS['​testkey2'​]='​testvalue2';​
 +</​file>​Вывести на экран все значения переменных массива $GLOBALS можно при помощи print_r($GLOBALS);​ или так:<​file>​
 +foreach ($GLOBALS as $key=>​$value)
 +   echo '​GLOBALS['​.$key.'​] == '​.$value.'<​br>'; ​
 +</​file>​
 +
 +**Переменная $_SERVER**.
 +  * Переменная [[http://​www.php.net/​manual/​ru/​reserved.variables.server.php|$_SERVER]] является массивом,​ содержание которого создается Веб- сервером. В нем должны присутствовать сведения (в зависимости от реализации сервера их может и не быть) описанные в спецификации [[RFC]] 3875, такие как
 +  * $_SERVER['​REMOTE_ADDR'​] IP- адрес, с которого пользователь просматривает текущую страницу
 +  * $_SERVER['​HTTP_ACCEPT_LANGUAGE'​] содержимое заголовка [[Accept-Language]]
 +  * $_SERVER['​HTTP_USER_AGENT'​] содержимое заголовка User-Agent
 +  * $_SERVER['​HTTP_VIA'​] если не пустая,​ значит используется proxy. Значение - адрес (или несколько адресов) proxy сервера.
 +  * $_SERVER['​HTTP_X_FORWARDED_FOR'​] если не пустая,​ значит используется proxy, без анонимизатора (т.е. ваш реальный IP не скрывается). Значение - реальный ip адрес клиента.
 +  * $_SERVER['​REQUEST_METHOD'​] какой метод был использован для запроса страницы '​GET',​ '​HEAD',​ '​POST',​ '​PUT'​ и тд., например проверим пришел ли запрос на нашу страницу методом POST<​file>​
 +if ($_SERVER['​REQUEST_METHOD'​]=='​POST'​) {
 +    include_once '​your.inc.php';​
 +}
 +</​file>​
 +  * $_SERVER['​HTTP_REFERER'​] - Адрес страницы (если есть), которая привела браузер пользователя на эту страницу. Этот заголовок устанавливается веб-браузером пользователя. Не все браузеры устанавливают его и некоторые в качестве дополнительной возможности позволяют изменять содержимое заголовка HTTP_REFERER. Одним словом,​ в самом деле ему нельзя доверять. ​
 +
 +**Переменная $_GET**.
 +
 +**Переменная $_POST**.
 +  * Вывести все переменные переданные методом POST<​file><?​php
 +echo '<​br>';​
 +var_dump($_POST);​
 +echo '<​br>';​
 +print_r($_POST);​
 +echo '<​br>';​
 +?>
 +</​file>​
 +  * Если массив POST пуст прервать выполнение скрипта<​file>​
 +if (empty($_POST)) {exit();}
 +</​file>​
 +**Переменная $_FILES** - переменные файлов,​ загруженных по протоколу [[HTTP]] методом [[POST]]. [[PHP - загрузка файла на сервер]].
 +
 +**Переменная $_REQUEST** - ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST и $_COOKIE. Переменные в массиве $_REQUEST передаются в скрипт посредством методов GET, POST или COOKIE, поэтому им нельзя доверять,​ т.к. они могли быть изменены удаленным пользователем. Их наличие и порядок добавления данных в соответствующие массивы определяется директивой [[http://​www.php.net/​manual/​ru/​ini.core.php#​ini.variables-order|variables_order]] (по умолчанию установлено GPCS). ​
 +
 +**Переменная $_SESSION**
 +
 +**Переменная $_ENV**. Заполняется если скрипт был запущен из командной строки. Массив $_SERVER будет содержать все переменные из массива $_ENV.
 +
 +**Переменная $_COOKIE**: [[cookie]].
 +
 +**Переменная $http_response_header**
 +
 +===== require и include =====
 +  * [[http://​ua2.php.net/​manual/​ru/​language.control-structures.php|Управляющие конструкции]]
 +Операторы include, require, include_once и require_once работают аналогично серверным включениям ([[SSI]]). Операторы include и require являются языковыми конструкциями,​ а значит могут использоваться без круглых скобок.<​file>​
 +include '​vars.php';​ include_once '​./​second.class.php';​
 +</​file>​
 +<​note>​Операторы require() и include() ничем не отличаются друг от друга, единственно в случае неудачного их выполнения require() выдаст сообщение о неисправимой ошибке и прервет выполнение программы,​ а include() выдаст только предупреждение.</​note>​
 +В относительном виде путь может содержать специальные управляющие символы "​."​ (точка) и "​.."​ (две точки). Точка обозначает текущий каталог,​ а две точки - предыдущий вышележащий.
 +<note important>​Относительный путь всегда вычисляется начиная от файла, с которого началось исполнение,​ а не от текущего исполняемого.</​note>​
 +
 +===== Тернарная операция =====
 +Тернарная операция в PHP записывается аналогично языку С. Синтаксис тернарного оператор "?":<​code>​
 +$переменная = условие ? $переменная = если условие выполнено : $переменная = если условие не выполнено
 +</​code>​
 +  * **Пример**.<​file>​
 +echo (empty($_SERVER['​HTTP_REFERER'​])) ? 'Not referer'​ : $_SERVER['​HTTP_REFERER'​];​
 +</​file>​
 +  * **Пример**. Формирование [[SQL]] запроса.<​file>​
 +#​!/​usr/​bin/​php
 +<?php
 +$nColumns = '​peer,​valute';​
 +for ($year = 2009; $year <= 2012; $year++) { // цикл перебирает года
 +    for ($month = 1; $month <= 12; $month++) { //​вложенный цикл перебирает месяцы
 +($month < 10 ? $day = $year . "​0"​ . $month . "​%"​ : $day = $year . $month . "​%"​);​ // тернарный оператор
 +$query = "​select " . $nColumns . " from Cache where day like '"​ . $day . "'";​
 +    }
 +}
 +?>
 +</​file>​
 +
 +====== Справочник функций PHP  ======
 +  * [[http://​php.net/​manual/​ru/​function.get-defined-vars.php|get_defined_vars]] - эта функция возвращает многомерный массив,​ содержащий список всех определенных переменных в месте вызова функции get_defined_vars()<​file>​
 +var_dump(get_defined_vars());​ exit;
 +</​file>​
 +[[http://​www.php.net/​manual/​ru/​ref.strings.php|Обработка строк]]
 +  * **[[http://​www.softtime.ru/​bookphp/​gl3_6.php|printf]]** - выводит отформатированную строку. Её следует использовать при необходимости вывода переменной в формате с плавающей запятой с определенной точностью,​ либо в любом другом случае,​ когда возникает необходимость изменения формата выводимых данных. Где только возможно printf нужно заменять функцией print(), так как она выполняется быстрее.
 +  * **print** - выводит строку.
 +  * [[phpfn>​echo]] - выводит одну или более строк. Пример краткой записи echo<​file>​
 +//​полная запись
 +<a href="​index.php"><?​php echo $num_page ?></​a>​
 + //​краткая запись
 +<a href="​index.php"><?​=$num_page?></​a>​
 +</​file>​
 +
 +[[http://​www.php.net/​manual/​ru/​refs.basic.text.php|Обработка текста]]
 +
 +  * **print_r** - выводит информацию о переменной,​ структуре массива и объекта. Принимает только один обязательный параметр(если будет указан второй параметр true - выходные данные функции будут представлять собой её возвращаемое значение и не будут выводиться на экран). В случае [[php#​massivy_php|массивов]] функция выводит все элементы массива,​ в наглядном виде.
 +  * **var_dump** - сходная с функцией print_r. Дополнительно выводит размер переменных,​ не выводит непубличные данные в объектах,​ не имеет второго параметра для вывода данных в возвращаемое значение.
 +  * **var_export** - сходна с print_r и print_r. Различие состоит в том, что var_export выводит информацию о переменных в стиле PHP кода, т.е. вывод можно скопировать и вставить в свой PHP- скрипт.
 +
 +  * **empty()** возвращает true, если переменная не существует или пустая,​ в противном случае - false. Переменная считается пустой,​ если она не существует или её значение равно FALSE.
 +  * **isset()** возвращает true, если переменная существует,​ и false - в противном случае (**переменная с пустой строкой считается существующей**). Удобно применять для проверки [[html5?​s[]=checkbox#​teg_form_label_input|checkbox]],​ так как элемент суперглобального массива для флажка (checkbox) устанавливается только в том случае,​ если флажок отмечен,​ в противном случае элемент для флажка в суперглобальном массиве не создается.
 +
 +  * [[http://​www.php.net/​manual/​ru/​function.nl2br.php|nl2br]] — Вставляет [[HTML5|HTML]] -код разрыва строки перед каждым переводом строки
 +
 +**[[http://​ua.php.net/​manual/​ru/​ref.exec.php|Функции запуска программ]]**
 +  * **[[http://​ua.php.net/​manual/​ru/​function.exec.php|exec]]** — исполняет внешнюю программу. Возвращает последнюю строку вывода запущенной на исполнение команды.
 +  * **passthru** — выполняет внешнюю программу и отображает необработанный вывод. Функция не возвращает значения после выполнения.<​file>​
 +<?php
 +passthru ('echo $PATH'​);​
 +?>
 +</​file>​
 +  * **system** — выполняет внешнюю программу и отображает её вывод.
 +  * **[[|shell_exec]]** - выполняет команду через [[shell]] и возвращает полный вывод в виде строки. Функция аналогична оператору исполнения:​ обратные кавычки (``).<​file>​
 +<?php
 +$output = shell_exec('​ls -lart'​);​
 +echo "<​pre>​$output</​pre>";​
 +?>
 +</​file>​
 +  * [[http://​ua.php.net/​manual/​ru/​function.escapeshellcmd.php|escapeshellcmd]] - экранирует метасимволы командной строки при помощи обратного слэша.
 +===== Функции для работы с файлами и сетью =====
 +
 +  * **[[http://​www.php.net/​manual/​ru/​book.filesystem.php|Функции для работы с файловой системой]]**
 +  * [[http://​php.net/​manual/​ru/​book.network.php|Функции для сети]]
 +
 +
 +  * **fgetss** - прочитать строку из файла и отбросить HTML и PHP теги.
 +  * **fgets** - построчное чтение из файла. Пример. Считываем построчно текстовый файл и каждую строку передаем на обработку функции TxtToSQL()<​file>​
 +function TxtToSQL($line) {
 +    echo "​$line";​
 +}
 +
 +$filename = '​ARMY_utf8.txt';​
 +
 +$fhandle = fopen($filename,​ "​r"​) or die("​File $filename not found\n"​);​
 +while (!feof($fhandle)) {
 +    TxtToSQL(fgets($fhandle));​
 +}
 +fclose($fhandle);​
 +</​file>​
 +  * [[http://​php.net/​manual/​ru/​function.file-get-contents.php|file_get_contents]] - читает содержимое файла в строку. Функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой. **Пример**:​ запрос страницы с передачей логина и пароля<​file>​
 +<?php
 +$url = '​https://​example.com/​dbs/​test.php';​
 +$auth = base64_encode('​user:​password'​);​
 +$header = array("​Authorization:​ Basic $auth"​);​
 +$opts = array('​http'​ => array('​method'​ => '​GET',​
 +//        '​protocol_version'​ => 1.1,
 +        '​header'​ => $header));
 +
 +// Создаем окружение с помощью установленных выше HTTP- заголовков
 +$context = stream_context_create($opts);​
 +$file = file_get_contents($url . '?​id=8300120011',​ false, $context);
 +
 +print_r($file);​
 +?></​file>​**Пример**:​ запрос страницы методом POST:<​file>​
 +<?php
 +$data = array(
 +    '​needle'​ => '​38093'​
 +);
 +$postdata = http_build_query($data);​ // Генерирует URL-кодированную строку запроса
 +$options = array('​http'​ =>
 +    array(
 +        '​method'​ => '​POST',​
 +        '​header'​ => '​Content-type:​ application/​x-www-form-urlencoded',​
 +        '​content'​ => $postdata
 +    )
 +);
 +$context = stream_context_create($options);​
 +// Открываем файл с помощью установленных выше HTTP-заголовков
 +$result = file_get_contents('​https://​example.com/​response.php',​ false, $context);
 +echo $result;
 +?>
 +</​file>​
 +
 +
 +====== Безопасность ======
 +Минимальная обработка на стороне сервера данных присланных пользователем:​
 +  * **Сервер ожидает от пользователя строку**. Минимальная защита достигается применением функций strip_tags и trim<​file>​
 +if ($_GET['​id'​]) {
 +                $id = trim(strip_tags($_GET['​id'​]));​
 +}
 +</​file>​
 +  * **Сервер ожидает от пользователя целое положительное число**. Минимальная защита достигается явным применением к целому типу и использовании функции abs<​file>​
 +$age = abs((int) ($_POST['​age'​]));​
 +</​file>​
 +===== Фильтрация(валидация) данных =====
 +  * [[http://​www.php.net/​manual/​ru/​book.filter.php|Фильтрация данных средствами PHP]]
 +  * [[http://​www.php.net/​manual/​ru/​filter.filters.validate.php|Фильтры валидации данных]]
 +  * [[class DFunction]] - класс для проверки пользовательских данных
 +  * [[PHP. Проверка на число в GET и POST запросах.]]
 +
 +
 +  * Валидация EMail, при помощи фильтра FILTER_SANITIZE_EMAIL (удаляет все символы,​ кроме букв, цифр и !#​$%&'​*+-/​=?​^_`{|}~@.[]. )<​file><?​php
 +# email
 +$a = "​dar(k)f ire@ex\amp/​le.c om";
 +echo filter_var($a,​ FILTER_SANITIZE_EMAIL);​
 +echo "​\n";​
 +?>
 +</​file>​
 +====== Маленькие советы ======
 +  * <​file>​
 +Hачинающий:​ echo "​$var";​
 +Пpофи: echo $var;
 +</​file>​
 +  * <​file>​
 +Начинающий:​ print("​Test"​);​
 +Пpофи: print "​Test";​
 +</​file>​
 +  * Краткая запись <?= для строки <?php echo. Спорный совет - требует включения [[http://​www.php.net/​manual/​ru/​ini.core.php#​ini.short-open-tag|short_open_tag]],​ не знаешь как писать всегда выбирай вариант с полными тегами т.е. первый вариант.<​file>​
 +1 способ:​ <?php echo '<a href=\"​http://​www.php.net\">​PHP</​a>';​ ?>
 +2 способ:​ <?= '<​br><​a href="​http://​www.php.net">​PHP1</​a>'​ ?>
 +</​file>​**Начиная с версии PHP 5.4.0 запись <?= стала доступна всегда.** ​
 +
 +  * <​file>​
 +Hачинающий:​ $a[0]=1; $a[1]=2; $a[2]=3;
 +Пpофи: $a = array(1,​2,​3);​
 +</​file>​
 +  * <​file>​
 +Hачинающий:​ if($a>1) { $b=2; } else { $b=3; }
 +Пpофи: $b = ($a>1) ? 2:3;
 +</​file>​
 +  * При написании собственных функций желательно чтобы они возвращали результат,​ даже если сама функция просто форматирует страницу. Это позволяет легко проверить выполнилась функция или нет, что позволяет проще обнаруживать этапы на которых возникли ошибки.
 +  * **Конкатенация строк** — два способа:<​file>​
 +Hачинающий:​ $a = $a. $b;
 +Пpофи: $a .= $b; // этот способ намного быстрее - использовать его
 +</​file>​
 +====== PHP eval ======
 +  * php.net: [[http://​php.net/​manual/​ru/​function.eval.php|mixed eval ( string $code )]]
 +
 +Языковая конструкция **eval** исполняет код PHP, содержащейся в переданной в нее строке. Исполняемый код из строки будет выполняться в области видимости кода, вызвавшего eval(). Таким образом,​ любык переменные,​ определенные или измененные кодом, выполненным eval(), будут доступны после его выполнения в теле программы.
 +  * При помощи eval запускаем сжатый и закодированный PHP код<​file php eval.php>​
 +<?php
 +
 +$code = 'echo "​My\tname\nis\tDROP";';​
 +
 +$code   = gzdeflate($code,​9);​
 +echo "gzde: $code\n";​
 +$code = base64_encode($code);​
 +echo "​base64:​ $code\n";​
 +
 +//  сжато и закодировано
 +eval(gzinflate(base64_decode($code))); ​
 +echo "​\n\n";​
 +
 +$code = base64_decode($code);​
 +echo "text: $code\n";​
 +$code   = gzinflate($code);​
 +echo "​gziin:​ $code\n";​
 +
 +eval ($code);
 +echo "​\n\n";​
 +
 +eval(gzinflate(base64_decode('​S03OyFdQ8q2MKclLzE2NycssjilxCfIPULIGAA=='​))); ​
 +echo "​\n\n";​
 +?>
 +</​file>​
php.txt · Последние изменения: 2018/08/12 03:00 (внешнее изменение)