PHP: различия между версиями

Содержимое удалено Содержимое добавлено
м Откат правок Oleg3280 (обс.) к версии 77.47.208.20
Нет описания правки
Строка 106:
 
=== Типы данных в РНР ===
Как уже было сказано, PHP предоставляет определенную гибкость в отношении типов переменных, то есть с одной и той же переменной на протяжении программы можно работать и как со строкой, и как с числом. Однако, несмотря на это в РНР существуют набор основных типов данных, которые могут явно указываться при работе с переменныtмипеременными:
*integer (целые числа);
*string (строки);
Строка 143:
 
Кроме функции <code>settype()</code> преобразование типов в РНР можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путем указания перед переменной ее нового типа, взятого в скобки:
<source lang="php">
$var = (intinteger)$var;
</source>
 
Соответственно, выполнение следующего кода приведет к тому, что РНР вернет integer:
Строка 149 ⟶ 151 :
<?php
$var = '5'; //Тип string
$var = (intinteger)$var; //Преобразуем в int
echo gettype($var);
?>
Строка 158 ⟶ 160 :
 
Сначала PHP инициализирует массивы <code>$_ENV</code> (переменные окружения) и <code>$_SERVER</code><ref>На самом деле, порядок инициализации суперглобальных массивов зависит от настроек в файле ''php.ini''</ref>. Ассоциативный массив $_SERVER содержит следующие ключи (индексы массива):
*<code>$_SERVER['HTTP_USER_AGENT']</code> — браузер клиента;
*<code>$_SERVER['HTTP_ACCEPT']</code> — принимаемые MIME-типы. Может служить для определения возможностей браузера;
*<code>$_SERVER['PHP_SELF']</code> — путь к файлу, содержащему выполняющийся скрипт, относительно корневого каталога (папки) сервера. Пример: <code>/w/index.php</code>
 
Затем РНР заполняет переменную <code>$_GET[]</code>, являющуюся ассоциативным массивом, которая создаётся при анализе строки запроса. Строка запроса хранится в элементе массива <code>$_SERVER['QUERY_STRING']</code> и представляет собой информацию, следующую за символом «?» в запрошенном URL. РНР разбивает строку запроса по символам «&»<ref>Символ разделения также может меняться в файле ''php.ini''. Часто используется символ «;».</ref> на отдельные элементы, а затем ищет в каждом из этих элементов знак «=». Если знак «=» найден, то создается переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:
 
<source lang="html5">
Строка 205 ⟶ 207 :
</source>
 
Если запрос страницы выполняется при помощи метода <code>POST</code>, то появляется группа POST-переменных, которые интерпретируются так же и помещаются в массив <code>$_POST[]</code>.
 
== Константы ==
Строка 239 ⟶ 241 :
*'''Унарный минус''' (<code>-</code>) — изменяет знак числа
*'''Сложение, вычитание, умножение''' (<code>+</code>, <code>-</code>, <code>*</code>) — действуют также как и в обычной математике
*'''Деление''' (<code>/</code>) всегда возвращает вещественное число (т.е. с типом данных <code>float</code>), вне зависимости от результата.
*'''Деление по модулю''' (<code>%</code>) — возвращает остаток от деления
 
=== Инкремент и декремент ===
Строка 251 ⟶ 253 :
Существуют следующие операторы сравнения:
{|
| <code>$a == $b</code> («равно»)
| Возвращает <code>true</code>, если $a равно $b
|-
| <code>$a === $b</code> («идентично»)
| Возвращает <code>true</code>, если $a равно $b и они имеют один и тот же тип
|-
| <code>$a != $b</code> или <code>$a <> $b</code> («не равно»)
| Возвращает<code>true</code>, если $a не равно $b
|-
| <code>$a > $b</code> («больше»)
| Возвращает <code>true</code>, если $a больше $b
|-
| <code>$a < $b</code> («меньше»)
| Возвращает <code>true</code>, если $a меньше $b
|-
| <code>$a >= $b</code> («больше или равно»)
| Возвращает <code>true</code> если $a больше или равно $b
|-
| <code>$a <= $b</code> («меньше или равно»)
| <code>true</code> если $a меньше или равно $b
|}
Строка 289 ⟶ 291 :
{| class="wikitable"
|-
| <code>&</code> || Поразрядная конъюнкция (AND)
|-
| <code><nowiki>|</nowiki></code> || Поразрядная дизъюнкция (OR)
|-
| <code>^</code> || Поразрядное исключающее ИЛИ (XOR)
|-
| <code>~</code> || Поразрядное отрицание (NOT)
|-
| <code><nowiki><<</nowiki></code> || Сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда.
|-
| <code><nowiki>>></nowiki></code> || Сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда.
|}
 
Строка 346 ⟶ 348 :
</source>
 
Можно использовать инструкцию <code>elseif</code> (иначе, если):
<source lang="php">
<?php
Строка 356 ⟶ 358 :
 
=== Переключатель switch ===
<source lang="php">
<?php
$a = "A";
switch ($a)
{
case 'A':
Строка 371 ⟶ 373 :
?>
</source>
Данный пример выведет «Переменная имеет значение „A“». И этот пример аналогичен:
<source lang="php">
<?php
$a = "A";
if($a == "A") echo "Переменная имеет значение \"A\"";
elseif($a == "B") echo "Переменная имеет значение \"B\"";
else echo "Ответ не найден";
?>
</source>
 
=== Операторы цикла ===
Строка 378 ⟶ 388 :
*цикл с постусловием: <code>do { statements; } while(condition);</code>
*итерационный цикл: <code>for(expression1; expression2; expression3) { statements; }</code>
*итерационный цикл foreach (т.е. перебор элементов массива): <code>foreach(array as [$key =>] $value) { statements; }</code>
 
Если 3 первых оператора цикла берут свое начало от С-подобных языков, то последний оператор позаимствован у языка Perl.
Строка 434 ⟶ 444 :
</source>
 
Примечание: В PHP стандартное время исполнения скрипта — 30 секунд (эту настройку можно изменить в файле php.ini). То есть по прошествии 30 секунд с начала выполнения скрипта, его действие будет прервано. Таким образом, время выполнения бесконечного цикла — полминуты.
 
==== do…while ====
Строка 467 ⟶ 477 :
 
==== for ====
Как уже говорилось, итерационный цикл имеет следующий формат:
 
<source lang="php">
Строка 481 ⟶ 491 :
<?php
$var = 5;
for ($i = 0; $i <= $var; $i++)
{
echo $i . '<br />';
}
?>
Строка 513 ⟶ 523 :
</source>
 
=== Тернарный оператор "«?"» : ===
Тернарный оператор «'''?:'''» это вид условного оператора, он проверяет Выражение 1 и если оно верно, то присваивает значение Выражения 2, иначе — Выражения 3.
<source lang="php">
Строка 542 ⟶ 552 :
<source lang="php">
$link_search_subject = "Экранирование";
$link_label = "Поиск по слову <<" . "$link_search_subject>>";
 
echo
'<a href=\"' . htmlspecialchars("http://ru.wikibooks.org/wiki/Служебная:Search?search=".urlencode($link_search_subject)
."&go=".urlencode("Перейти")).'">'.htmlspecialchars($link_label).
'</a>';
</source>
 
заметьте, что следующий (ниже представленный) код, содержит грубое нарушение, так как формирует гиперссылку с аттрибутоматрибутом содержащим незаконченную (не закрытую) ссылку на сущность (&…;) :
 
<source lang="php">
$link_search_subject = "Экранирование";
 
echo
'<a href="http://ru.wikibooks.org/wiki/Служебная:Search?search='.urlencode($link_search_subject)
.'&go='.urlencode("Перейти").'">'. // НАРУШЕНИЕ!!
"Поиск по слову Экранирование".
'</a>';
</source>
Строка 568 ⟶ 578 :
==== substr() ====
Функция '''<code>substr()</code>''' возвращает часть строки.
Например:
<source lang="php">
echo substr('Simple text', 3, 7);
Строка 579 ⟶ 589 :
Эта функция разобьет число по трём разрядам:
<source lang="php">
<?php
function my_int($value)
function my_int($value)
{
{
$len = strlen($value);
if ($len <= 3) {return $value;
else return my_int(substr($value, 0, $len-3)) . ' ' . substr($value, $len-3, 3);
} else {
return my_int(substr($value, 0, $len-3)) . ' ' . substr($value, $len-3, 3);
}
}
Строка 597 ⟶ 606 :
 
==== strpos() ====
 
<code>int strpos (string haystack, string needle [, int offset])</code>
 
Возвращает позицию первого вхождения подстроки <code>needle</code> (в переводе с английского — «иголка») в строку <code>haystack</code> (в переводе с английского, как вы уже догадались, — «стог сена»). Необязательный аргумент <code>offset</code> позволяет указать, с какого по счету символа строки <code>haystack</code> начинать поиск.
 
Если подстрока <code>needle</code> не найдена, <code>strpos()</code> возвращает '''<code>FALSE</code>'''.
Строка 608 ⟶ 616 :
Эта функция определяет модель браузера:
<source lang="php">
<?php
function getCurrentBrowser() {
function get_current_browser() {
$browser = strtoupper($_SERVER['HTTP_USER_AGENT']);
if (strpos( $browser, 'MSIE') !== false) { strtoupper($browser = _SERVER['Internet ExplorerHTTP_USER_AGENT']);}
else if if(strpos($browser, 'FIREFOXMSIE') !== false){ $browser = 'FirefoxInternet Explorer'; }
else if elseif(strpos($browser, 'KONQUERORFIREFOX') !== false){ $browser = 'KonquerorFirefox'; }
else if elseif(strpos($browser, 'LYNXKONQUEROR') !== false){ $browser = 'LynxKonqueror'; }
else { elseif(strpos($browser, 'LYNX') !== false) $_SERVER[browser = 'HTTP_USER_AGENTLynx']; }
return else { $browser = $_SERVER['HTTP_USER_AGENT'];
return $browser;
}
}
get_current_browser();
?>
</source>
 
Строка 745 ⟶ 756 :
 
=== Регистрация ===
Алгоритм регистрации пожалуй самый простой из тех, что мы будем здесь использовать. Серверу просто предстоит запись введённые пользователем данные и записать результата хэш-функции от пароля.
<source lang=php"html5">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>
Регистрация
</title>
</head>
<body>
</source>
<source lang="php">
<?php
//register
//Подключение к MySQL
mysql_connect("localhost", "root", "") or die(mysql_error);
//Подключение к базе данных deskside
mysql_select_db("deskside") or die(mysql_error);
$find_id_sql = mysql_query("SELECT * FROM users ORDER BY id ASC");
$find_id_row = mysql_num_rows($find_id_sql);
$find_names = mysql_query("SELECT * FROM users WHERE login='".$_POST['login']."'");
$find_row = mysql_num_rows($find_names);
$id_counter = 1;
 
$id_counter = 1;
 
//Вычисление последнего ID
while ($find_id_row = mysql_fetch_assoc($find_id_sql)){
$id_counter += 1;
}
$user_already = false; //Проверка, есть ли уже такой пользователь
 
if ($_POST['register'])
$user_already = false; //Проверка, есть ли уже такой пользователь
{
if ($_POST['register']){
while($find_row == mysql_fetch_assoc($find_names))
 
{
while ($find_row = mysql_fetch_assoc($find_names)){ //Проверка, есть ли уже такой пользователь
//Проверка, есть ли уже такой пользователь
 
if ($find_row['login'] == $_POST['login']){
$user_already = true; //Если есть, то так и пишем
}
}
if($user_already){
echo "
<p>
Такой пользователь уже есть <br /> <a href=\"http://localhost/register.htm">Пройти регистрацию заново... </a>
</p>
";
}
else
{
//Если такого пользователя всё-таки нет, то регистрируем нового пользователя с таким именем
if ($_POST['password'] == $_POST['second_password'])
{
//Проверка совпадений паролей
//Совпали:
echo "Регистрация проведена успешно";
$md5_password = md5($_POST['password']); //Хэширование пароля для базы данных
mysql_query("INSERT INTO users (`id`, `login`, `password`, `e-mail`, `name`) VALUES ('".$id_counter."', '".$_POST['login']."', '".$md5_password."', '".$_POST['e-mail']."', '".$_POST['name']."')");
}
else
{
echo "
<p>
Ошибка регистрации. Возможно, пароли не совпадают! <br /> <a href=\"http://localhost/register.htm\">Пройти регистрацию заново</a>
</p>
";
 
}
}
}
}
}
if($user_already){
if($_POST['register'])
echo "Такой пользователь уже есть <br> <a href=\"http://deskside/main.php?page=register\">Пройти регистрацию заново</a>";
{
}else{ //Если такого пользователя всё таки нет, то регистрируем нового пользователя с таким именем
//Если пользователь уже нажал кнопку РЕГИСТРАЦИЯ, то зачем ему заново показывать форму?!
if ($_POST['password'] == $_POST['second_password']){ //Проверка совпадений паролей
}
//Совпали
else
echo "Регистрация проведена успешно";
{
$md5_password = md5($_POST['password']); //хэширования пароля для базы данных
//Если он уже кликнул, то мы не показываем форму, а выводим либо сообщение о подтверждении, либо об ошибке
//
echo '
mysql_query("INSERT INTO users (`id`, `login`, `password`, `e-mail`, `name`) VALUES ('".$id_counter."', '".$_POST['login']."', '".$md5_password."', '".$_POST['e-mail']."', '".$_POST['name']."')");
<form method="post">
 
<p>
Логин: <input type="text" name="login" />
}else{
</p>
echo "Ошибка регистрации. Возможно, пароли не совпадают! <br> <a href=\"http://deskside/main.php?page=register\">Пройти регистрацию заново</a>";
<p>
 
Пароль: <input type="password" name="password">
}
</p>
}
<p>
}
Пароль еще раз: <input type="password" name="second_password" />
 
</p>
if($_POST['register']){
<p>
 
E-mail: <input type="email" name="e-mail" />
//Если пользователь уже нажал кнопку РЕГИСТРАЦИЯ, то зачем ему заново показывать форму????
</p>
 
<p>
}else{
Ваше имя: <input type="text" name="name" />
 
</p>
//Если он уже кликнул, то мы не показываем форму, а выводим либо сообщение о подтверждении, либо об ошибке
<input type="submit" name="register" value="Зарегестрироваться">
 
</form>
echo '
';
<div style="margin-left:20px">
}
<form method="post">
Логин: <input type="text" name="login"> <br>
Пароль: <input type="password" name="password"> <br>
Пароль еще раз: <input type="password" name="second_password"> <br>
E-Mail Адрес: <input type="text" name="e-mail"> <br>
Ваше имя: <input type="text" name="name"> <br>
<input type="submit" name="register" value="Зарегестрироваться">
</form>
</div>
';
}
?>
</source>
<source lang="html5">
</body>
</html>
</source>
 
Строка 820 ⟶ 861 :
[[Файл:Алгоритм_входа_пользователя.png|thumbnail|180px|Алгоритм авторизации пользователя]]
Вход пользователя будет производиться по следующему алгоритму:
# Пользователь заполняет форму: Логин, Пароль.
# Данные запоминаются в переменной '''$_POST''', после чего будут обрабатываться на сессии<ref>Приемущество сессий в том, что обычный пользователь даже не заметит, как его перенаправили на другую страницу, а значит будет сложнее взломать PHP код. На странице входа отображается только перенаправление на session.php и форма входа. Если конечно не посмотрит внимательно на HTML код, но это ему ничего не даст, по скольку он не сможет взять из файла session.php сам PHP код</ref>.
# Уже в сессии хэшируется введенный пользователем пароль алгоритмом [[w:MD5|MD5]].
# Подключение к базе данных SQL и импорт данных со строки пользователя (Допустим, пользователь ввел имя пользователя admin) ''admin'', затем запись всей строки в массив '''$table''' - такой вариант поможет сократить много нервов и строк.
# Сравнение зашифрованного пароля, который в базе данных с зашифрованным, введенным пользователем.
# Если пароли совпадают, записываются COOKIE с информацией о авторизации пользователя. ("user_enter" & "user_login").
# Закрытие сессии методом перенаправления на другую страницу. - ''header (Location: ...);''
===== '''Форма входа''' =====
<source lang=php></source>
<source lang="php">
<?php
session_start();
#Этот шаблон можно вставлять в любую часть сайта, он будет работать в любом случае.
/*
 
Этот шаблон можно вставлять в любую часть сайта, она будет работать в любом случае.
 
*/
 
?>