Академический Документы
Профессиональный Документы
Культура Документы
PHP
– это широко используемый язык сценариев общего назначения с открытым исходным кодом.
Существует два вида синтаксиса:
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
$a=readline("a="); //input
$x = 1;
do{
echo $x;
//12345678910
/* vars.php в той же области видимости, что и foo(), *
* поэтому $fruit НЕ будет доступен за пределами этой области *
* $color доступен, поскольку мы объявили переменную глобальной */
foo(); // Одно зеленое яблоко
echo "Одно $color $fruit"; // Одно зеленое
?>
I. Открытие файла
FOPEN
fopen — Открывает файл или URL
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
FILE
file — Читает содержимое файла и помещает его в массив
Можно также использовать функцию file_get_contents() для получения файла в виде строки.
При вызове этой функции, каждая строка файла сохранятся в отдельном элементе указанного массива.
II. Манипуляции с данными файла
fwrite()
<?php
$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
if ($test) echo 'Данные в файл успешно занесены.';
else echo 'Ошибка при записи в файл.';
fclose($fp); //Закрытие файла
?>
Для построчного считывания файла используют функцию fgets(). fgets ( resource $handle [, int $length ] )
<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while (!feof($fp))
{
$mytext = fgets($fp, 999);
echo $mytext."<br />";
}
}
else echo "Ошибка при открытии файла";
fclose($fp);
?>
Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до
тех пор, пока указатель не достигнет конца файла (EOF).
readfile(): открывает файл, отображает его содержимое в окне браузера, а затем закрывает файл:
fgetc() читает файл по символам:
<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while(!feof($fp))
{
$char = fgetc($fp);
if ($char == 'с') $i = $i + 1;// Находим символ «с»
}
echo 'Количество букв "c" в файле: '. $i;
}
else echo "Ошибка при открытии файла";
?>
1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся
функцией file_exists().
Массивы
Если требуется начать массив с другого индекса, например, с 1, то необходимо явно это указать в
конструкции array():
<?php
$arr = array(1 => "PHP",
2 => "MySQL",
3 => "Apache");
?>
или
<?php
$arr[1] = "PHP";
$arr[2] = "MySQL";
$arr[3] = "Apache";
?>
Следует заметить, что число элементов в массиве не обязательно знать заранее — его можно вычислить при
помощи функции count():
<?php
for ($i = 1; $i <= count($arr); $i++)
{
echo $arr[$i]." "; //echo "$arr[1] $arr[2] $arr[3]";
}
?>
<?php
$arr["first"] = "PHP";
$arr["second"] = "MySQL";
$arr["third"] = "Apache";
?>
В этом случае массив называется ассоциативным, а его индексы называются ключами. Для вывода элемента
массива в строке кавычки (ни двойные, ни одинарные) указывать не следует:
<?php
echo "$arr[first] $arr[second] $arr[third]";
?>
Так как у ассоциативных массивов нет индексов, для обхода их введён специальный вид цикла — foreach:
<?php
foreach($arr as $key => $value)
{
echo "$key = $value <br />";
}
?>
Вывод:
first = PHP
second = MySQL
third = Apache
Конструкция "$key =>", позволяющая получить доступ к ключу массива на каждом из циклов является не
обязательно и может быть опущена:
<?php
foreach($arr as $value)
{
echo "$value <br />";
}
?>
explode(), которая позволяет разбить строку на несколько фрагментов, каждый из которых помещается в
отдельный элемент массива
$str = "345|mail@mail.ru|http://www.softtime.ru|login|password";
$arr = explode("|",$str);
implode(), которая объединяет, элементы массива в строку, используя для этого заданный разделитель:
$str = implode("##",$arr);
Многомерные массивы
Двумерный массив:
<?php
$arr = array( array(‘Вася’, ‘слесарь’, 2500 ),
array(‘Миша’,’строитель’, 3000),
array(‘Андрей’, ‘шофер’, 2700));
?>
Пусть необходимо создать массив $c, которые будет содержать как элементы массива $a так и массива $b:
<?php
$a = array("a"=>"aa", "x"=>"xx");
$b = array("c"=>"cc", "d"=>"dd");
$c = $a + $b;
echo "<pre>";
print_r($c);
echo "</pre>";
?>
Результат:
Array
(
[a] => aa
[x] => xx
[c] => cc
[d] => dd
)
НО если массив числовой:
$c = array_merge($a,$b);
3) Сортировка массива
sort($name); // если требуется отсортировать массив в алфавитном порядке
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
$min = strlen($name[0]);
$nam = $name[0];
for ($i=1; $i < count($name); $i++)
{
$len = strlen($name[$i]);
if ($len < $min)
{
$nam = $name[$i];
$min = strlen($nam);
}
}
echo 'Наименьшая длина - '.$nam;
?>
Вывод в обратном порядке:
<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
$end = end($num);
While ($end)
{
echo $end.' - ';
$end = prev($num);
}
?>
Функции next(), each() перемещают указатель на один элемент вперед. Функция reset() возвращает указатель
на 1 элемент в массиве.
Суперглобальные переменные
Некоторые предопределённые переменные в PHP являются "суперглобальными", что означает, что они
доступны в любом месте скрипта. Нет необходимости использовать синтаксис global $variable; для доступа к
ним в функциях и методах.
Суперглобальными переменными являются:
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
$GLOBALS - Ссылки на все переменные глобальной области видимости. Имена переменных являются
ключами массива.
<?php
function test() {
$foo = "локальная переменная";
echo '$foo в глобальной области видимости: ' . $GLOBALS["foo"] . "\n";
echo '$foo в текущей области видимости: ' . $foo . "\n";
}
$foo = "Пример содержимого";
test();
?>
$_SERVER - это массив, содержащий информацию, такую как заголовки, пути и местоположения скриптов.
Записи в этом массиве создаются веб-сервером.
Примеры индексов:
'PHP_SELF'
Имя файла скрипта, который сейчас выполняется, относительно корня документов.
'SERVER_ADDR'
IP-адрес сервера, на котором выполняется текущий скрипт.
'SERVER_NAME'
Имя хоста, на котором выполняется текущий скрипт.
$_SESSION Ассоциативный массив, содержащий переменные сессии, которые доступны для текущего
скрипта.
Сессии - это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера
файл на сервере, в котором хранятся переменные сеанса.
HTML-формы (GET и POST)
HTTP методы GET и POST используются для отправки данных на сервер. Данные попадают в
суперглобальные массивы $_GET и $_POST. Массивы $_GET и $_POST являются ассоциативными. Таким
образом, переданный на сервер параметр с именем "user_name", будет доступен
как $_GET['user_name'] или $_POST['user_name'] в зависимости от используемого метода. Основное отличие
метода GET от POST в способе передачи данных.
Запрос GET передает данные в URL в виде пар "имя-значение" (другими словами, через ссылку), а запрос
POST передает данные в теле запроса (подробно показано в примерах ниже).
Страница, созданная методом GET, может быть открыта повторно множество раз. Из этого следует, что
метод GET следует использовать для получения данных от сервера и не желательно в запросах,
предполагающих внесений изменений в ресурс. Например, можно использовать метод GET в HTML форме
фильтра товаров: когда нужно, исходя из данных введенных пользователем, переправить его на страницу с
отфильтрованными товарами, соответствующими его выбору.
Запрос, выполненный методом POST, напротив следует использовать в случаях, когда нужно вносить
изменение в ресурс (выполнить авторизацию, отправить форму обратной связи, форму онлайн заявки).
Повторный переход по конечной ссылке не вызовет повторную обработку запроса, так как не будет содержать
переданных ранее параметров. Метод POST имеет большую степень защиты данных, чем GET: параметры
запроса не видны пользователю без использования специального ПО, что дает методу преимущество при
пересылке конфиденциальных данных, например в формах авторизации.
$_GET Ассоциативный массив параметров, переданных скрипту через URL. Метод GET отправляет
закодированную пользовательскую информацию, добавленную к запросу страницы. Страница и
закодированная информация разделены символом ?.
<?php
echo 'Привет ' . htmlspecialchars($_GET["name"]) . '!';
?>
Подразумевается, что пользователь ввел в браузере адрес http://example.com/?name=Hannes
GET относится также к QUERY_STRING (информация в URL после '?'). Так,
например, http://www.example.com/test.php?id=3 содержит GET-данные, доступные как $_GET['id'].
?php
if( $_GET["name"] || $_GET["age"] ) {
echo "Welcome ". $_GET['name']. "<br />";
echo "You are ". $_GET['age']. " years old.";
exit();
}
?>
<html>
<body>
</body>
</html>
$_POST
Метод POST передает информацию через заголовки HTTP. Информация кодируется, как описано в случае
метода GET
<form action="action.php" method="post">
<p>Ваше имя: <input type="text" name="name" /></p>
<p>Ваш возраст: <input type="text" name="age" /></p>
<p><input type="submit" /></p>
</form>
Когда пользователь заполнит форму и нажмет кнопку отправки, будет вызвана страница action.php. В этом
файле может быть что-то вроде:
Здравствуйте, <?php echo htmlspecialchars($_POST['name']); ?>.
Вам <?php echo (int)$_POST['age']; ?> лет.
htmlspecialchars() обеспечивает правильную кодировку "особых" HTML-символов так, чтобы вредоносный
HTML или Javascript не был вставлен на вашу страницу.
В примере показана простая HTML форма авторизации.
Запрос состоит из области заголовков и тела запроса.
В заголовках указана служебная информация: URL обработчика, тип кодирования, параметры браузера и т.д.
В теле запроса содержатся передаваемые параметры. Формат тела запроса может отличаться в зависимости от
выбранного типа кодирования.
$_REQUEST
Ассоциативный массив (array), который по умолчанию содержит данные
переменных $_GET, $_POST и $_COOKIE.
htmlspecialchars — Преобразует специальные символы в HTML-сущности
Функции для работы с MySQL
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
1. Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
2. Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так
далее.
Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
mysqli_connect(<адрес сервера>, <имя пользователя>, <пароль>, <имя базы данных>);
Функция возвращает результат — ресурс соединения, принимает все конфигурационные настройки и
подключается к серверу. Данный ресурс используется для всех следующих операций с MySQL.
Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернет логическое
значение типа «ложь» — false .
Хорошей практикой будет всегда проверять значение результа выполнения этой функции и сравнивать его
с ложью.
Установка кодировки: mysqli_set_charset($con, "utf8");
ВЫПОЛНЕНИЕ ЗАПРОСОВ
Следует разделять все SQL-запросы на две группы:
1. Чтение информации (SELECT).
2. Модификация (UPDATE, INSERT, DELETE).
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат
их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою
очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив
(если требуется список записей).
Составим корректный SQL-запрос, а затем выполним его путём передачи этого запроса
в функцию mysqli_query() . Первым параметром для функциии mysqli_query() является ресурс подключения,
полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
функция mysqli_insert_id() .
Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней
добавленной записи.
// закрываем подключение
mysqli_close($link);
Update
Оператор UPDATE изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Case
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель
отсутствует в продаже (ее нет в таблице РС), то вместо цены вывести текст «Нет в наличии».
Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны
иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой
(числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов,
чтобы привести его значения к символьному представлению.
Create table
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Создание таблицы, используя другую:
CREATE TABLE new_table_name AS
SELECT column1, column2,...
FROM existing_table_name
WHERE ....;
INNER JOIN
U) users D) departments
id name d_id id name
-- ---- ---- -- ----
1 Владимир 1 1 Сейлз
2 Антон 2 2 Поддержка
3 Александр 6 3 Финансы
4 Борис 2 4 Логистика
5 Юрий 4
SELECT u.id, u.name, d.name AS d_name
FROM users u
INNER JOIN departments d ON u.d_id = d.id
id name d_name
-- -------- ---------
1 Владимир Сейлз
2 Антон Поддержка
4 Борис Поддержка
3 Юрий Логистика
LEFT JOIN
SELECT u.id, u.name, d.name AS d_name
FROM users u
LEFT OUTER JOIN departments d ON u.d_id = d.id
id name d_name
-- -------- ---------
1 Владимир Сейлз
2 Антон Поддержка
3 Александр NULL
4 Борис Поддержка
5 Юрий Логистика
Добавив условие
WHERE d.id IS NULL
в выборке останется только 3#Александр, так как у него не назначен департамент.
RIGHT JOIN
RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.
SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
id name d_name
-- -------- ---------
1 Владимир Сейлз
2 Антон Поддержка
4 Борис Поддержка
NULL NULL Финансы
5 Юрий Логистика
SELECT d.id, d.name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
WHERE u.id IS null
В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи.
(3#Финансы)
FULL JOIN возвращает `объединение` объединений LEFT и RIGHT таблиц, комбинируя результат двух
запросов.
GROUP BY
The GROUP BY statement groups rows that have the same values into summary rows, like "find the number of
customers in each country".
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
The following SQL statement lists the number of customers in each country, sorted high to low:
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC; //ASC|DESC;
Работа сетей
Веб сервер принимает запросы пользователей и выдает им документ, страницу или сайт
Веб сервер хранит информацию, получает запросы, запускает программы на языках программирования,
формирует веб страницы, отправляет назад пользователю, защищает информацию, проводит идентификацию
и тд
Принципы передачи информации в сети:
Протоколы
Когда пользователь вложит адрес, браузер передает запрос, кодируя информацию по правилам протокола
Хост, к которому привязан адрес, запускает программы сервера
Получаемые данные расшифровываются, команды выполняются, формируется гипертекст, кодируется и
отправляется обратно
Браузер получает ответ, преобразовывает код в хтмл и показывает на экране страницу
URL - универсальный указатель ресурса. Запрос передается серверу доменных имён (DNS), он преобразует
URL в IP адрес. Далее браузер по IP определяет сервер с контентом и отправляет ему запрос, запрос
обрабатывается и данные возвращаются пользователю.
DNS - система доменных имён. Первым делом после запроса браузер выясняет, известен ли сайт в днс сервере
провайдера.
Существуют корневые серверы имён (root name server), который ссылается на нужный сервер имен домена
(например .com name server).
Для ускорения получения ip адресов используется кэширование (24 часа после посещения).
Протокол - стандартизированный формат для передачи данных между двумя устройствами. Протоколы
позволяют обмениваться данными независимо от ПО и ОС.
Набор протоколов интернета: стек TCP/IP.
Прикладной уровень протоколов: протоколы создания данных и их передачи через интернет (http, FTP,
SMTP).
Канальный уровень: определяет способ подключения маршрутизаторов друг к другу по сети
Транспортный уровень: контролирует назначение портов и взаимодействие компьютеров
Сетевой уровень: определяет способ адресации и механизм маршрутизации данных, передаваемых по сети
Веб протоколы различаются по типу запрашиваемых данных, способу сжатия и механизму взаимодействия
клиента и сервера: FTP (передача крупных файлов, клиент подключается к файловому серверу, а не веб
серверу), SMTP (простой протокол пересылки почты, стандартный протокол обмена электронной почты через
интернет; часто отправка по этому, а получение почты по POP), RTP (протокол передачи в реальном времени:
доставка аудио и видео)
HTTP - протокол передачи гипертекста. Однонаправленный (затруднение в отправке и получении больших
файлов) протокол без хранения состояния (запросы удаляются, не засоряется память —> но сохранение имён
пользователей и сеансов браузера осуществляется с помощью других средств).
HTTPS - защищённый вариант. Объединяет http и протокол обеспечения безопасности.
Веб сервер - это компьютер со специализированным программным обеспечением. Все веб серверы имеют IP
адреса. Виртуальный хостинг - несколько сайтов на одном IP. Разделяемый хостинг - сайт на веб сервере
вместе с другими сайтами, при выделенном хостинге для сайта отдельный сервер. Веб стэк - набор программ,
которые обрабатывают веб страницы и возвращают их браузерам. Веб стэк: ОС, веб сервер, сервер баз
данных, язык программирования (стэк lamp: Linux, Apache, MySQL, PHP/Python; wamp).
Сети
Ethernet - локальная сеть, проводные соединения и электрические сигналы на физ уровне
MAC адрес (зашит в карту) - уникальный идентификатор сетевого интерфейса для реализации коммуникации
устройств в сети на физ уровне.
Маршрутизация - процесс определения маршрута данных в сетях связи
Топологии сетей, которые неэффективны в случае появления разрыва:
1 Линейная шина (все узлы к одному кабелю)
2 Кольцо (узлы между собой)
3 Звезда (центральное звено - коммутатор/свитч [устройство для соединения нескольких узлов в комп сети]).
ARP протокол предназначен для определения MAC адреса по IP адресу другого компьютера
Сетевой шлюз - аппаратный маршрутизатор, служит для сопряжения комп сетей, использующих разные
протоколы.
Маска подсети - битовая маска, определяющая, какая часть IP адреса узла сети относится к адресу сети, а
какая - к адресу самого узла в этой сети.
объекты отражают реальные сущности - люди, товары, карточки, статьи в блогах и др. Это во многом
упрощает задачу, когда вы только начинаете проектировать свое приложение, так как назначение каждого
объекта, как и цель отношений между объектами, будет ясно и понятно.
Легче писать модульные программы: ООП предполагает написание модулей. Разделяя код на модули,
вам будет легче им управлять, дебажить и расширять его. Объект — это совокупность характеристик и
поведений, которое соответствует некой сущности. Объект - это переменная специального типа, которая
создается через класс. Он содержит действительные данные и функции для манипулирования ими. Чтобы
создать объект в программе, нужно описать шаблон для этого объекта, который называется классом.
Характеристики объекта в классе описываются в виде переменных, которые называются полями.
Поведение объекта в классе описывается функциями, которые называются методами.
Объектно ориентированное программирование базируется на принципах:
инкапсуляция
наследование
абстракция
полиморфизм
Инкапсуляция — объединение полей и методов в классе, с целью закрыть прямой доступ к полям и открыть
его для методов, которые этими полями управляют.
Согласно инкапсуляции, доступ к полям рекомендуется закрывать используя соответствующие
спецификаторы доступа. Чтобы предоставить возможность вносить изменения или получать значения полей,
создаются специальные методы.
Метод, возвращающий значение поля, называется геттер (от английского get — «получать»).
Метод, устанавливающий значение поля, называется сеттер (от английского set — «устанавливать»).
public function getField()
{
return $this->field;
}
public function setField($newValue)
{
if ($newValue < 0) {
$newValue = -1;
}
return $this->field = $newValue;
}
Наследование — позволяет создавать классы на основе уже существующих. Тем самым облегчая задачу по
созданию новых классов с точки зрения использования уже существующего программного кода. Класс, от
которого произошло наследование, называется базовым или родительским. Классы, которые произошли от
базового, называются потомками, наследниками или производными классами.
Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод. Он описан в программе,
имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от
абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов,
наследованных от абстрактного.
Методы класса:
class ClassName
{
public function methodName() {
// (код)
}
__
<?php
class Member
{
public $username = "";
private $loggedIn = false;
public function login() {
$this->loggedIn = true;
}
public function logout() {
$this->loggedIn = false;
}
public function isLoggedIn() {
return $this->loggedIn;
}
}
?>
Вы наверное заметили, что мы использовали новое ключевое слово $this. В контексте методов объекта
специальная переменная $this ссылается на сам объект. Используя $this в методе объекта, метод может
получить доступ к любой переменной класса и методу объекта.
Например, метод login() может получить доступ к переменной класса $loggedIn объекта через $this->loggedIn.
Мы добавили некоторые методы в наш класс, теперь давайте попробуем их применить для чего-то:
view sourceprint?
<?php
class Member
{
public $username = "";
private $loggedIn = false;
public function login() {
$this->loggedIn = true;
}
public function logout() {
$this->loggedIn = false;
}
public function isLoggedIn() {
return $this->loggedIn;
}
}
$member = new Member();
$member->username = "Fred";
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
$member->login();
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
$member->logout();
echo $member->username . " is " . ( $member->isLoggedIn() ? "logged in" : "logged out" ) . "<br>";
?>
Данный скрипт отобразит следующее:
Fred is logged out
Fred is logged in
Fred is logged out