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

2863 байта добавлено ,  5 лет назад
м
Нет описания правки
м
м
</source>
 
Где «3» — точка отсчёта, а «7» — длина изымаемой строки. Если же требуется вести отсчёт от конца строки — используйте отрицательное значение.
 
'''Пример'''
<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>'''.
 
'''Пример:'''
 
==== strrpos() ====
Возвращает позицию последнего вхождения символа:
 
<code>int strrpos (string haystack, string needle [, int offset])</code>
 
Возвращает позицию последнего вхождения <code>needle</code> в строку <code>haystack</code>. В «'''PHP 4»''' используется только первый символ строки <code>needle</code>.
 
Начиная с «'''PHP 5»''' необязательный аргумент <code>offset</code> позволяет указать, с какого по счету символа строки <code>haystack</code> начинать поиск. Отрицательное значение предписывает прекратить поиск при достижении определенной позиции до конца строки.
 
Если подстрока <code>needle</code> не найдена, возвращает <code>FALSE</code>.
 
'''Пример:'''
 
Эта функция достаёт из [[w:URL|URL]] имя файла ('''только пример;''', в жизни, можно использовать функцию <code>basename()</code>):
<source lang="php">
function getfname($url)
{
$filename = ''; // Переменная для хранения результата обработки.
$pos = strrpos($url, '/', 8); // начиная с 8 символа, т.к. в "http://" искать не нужно
$filename = '';
// Ведём поиск первого слеша,
// отделяющего путь к файлу
// от имени домена:
$pos = strrpos($url, '/', 8); // Начинаем с 8 символа (после "http://").
if ($pos === false) {
return false; // Ошибка,: неподходящий urlURL задан(нет невернослеша).
return false;
} else {
$filename = substr($url, $pos + 1); // Выделяем часть URL после слеша.
}
return $filename;
return $filename; // Возвращаем: или результат обработки, или ''.
}
</source>
<code>string strstr (string $haystack, string $needle [, bool $before_needle = false ])</code>
 
Возвращает подстроку строки <code>haystack</code>: начиная с индекса ''первого'' вхождения подстроки <code>needle</code> до конца строки. Функция <code>stristr()</code> выполняет ту же функцию, но не чувствительна к регистру.
 
'''Пример:'''
<source lang="php">
<?php
$text = print strstr('www.wikibooks.org', '.'); // Результат: ".wikibooks.org".
$strstr = strstr($text, '.');
print $strstr;
?>
</source>
 
Данный пример выведет «.wikibooks.org».
 
Для работы с разными кодировками используются функции:
<code>string mb_stristr (string $haystack , string $needle [, bool $before_needle = false [, string $encoding ]])</code>
 
где параметр <code>encoding</code> - название используемой кодировки символов (например «'''UTF-8»''').; Еслиесли этот параметр опущен, используется внутренняя кодировка.
 
==== strchr() ====
<code>string strrchr (string $haystack, char $needle)</code>
 
Возвращает подстроку строки <code>haystack</code>: начиная с ''последнего'' вхождения <code>needle</code> до конца строки.
 
Если подстрока <code>needle</code> не найдена, возвращает <code>FALSE</code>.
 
Если <code>needle</code> состоит более чем из одного символа, используется только первый символ.
 
Если <code>needle</code> не является строкой, он приводится к целому и трактуется как код символа.
 
'''Пример:'''
<source lang="php">
<?php
$text print = strrchr('www.wikibooks.org', '.'); // Результат: ".org".
$strrchr = strrchr($text, '.');
print $strrchr;
?>
</source>
 
Данный пример выведет «.org».
 
==== substr_count() ====
Возвращает число вхождений подстроки <code>needle</code> в строку <code>haystack</code>.
 
Можно использовать или текст в кавычках (или апострофах), или переменные.
 
'''Пример:'''
<source lang="php">
<?php
print substr_count('www.wikibooks.org', 'o'); // Результат: "3".
?>
</source>
 
Данный пример выведет «3».
 
==== strspn() ====
strspn - находитНаходит длину начального сегмента маски.
 
<code>int strspn (string $str1, string $str2)</code>
 
Возвращает длину начального сегмента <code>$str1</code>, состоящего полностью из символов строки <code>$str2</code>.
 
'''Пример:'''
<source lang="php">
<?php
$var = return strspn("42 is the answer,; what is the question ...?", "1234567890");
"1234567890");
 
// Результат: "2".
// (Т. к. в начале первой строки-аргумента
// самым длинным сегментом,
// состоящим только из символов, содержащихся во втором аргументе,
// является сегмент "42", -- длиной в 2 символа.)
?>
</source>
 
присваивает 2 переменной $var, поскольку строка "42" будет самым длинным сегментом, содержащим символы из "1234567890".
 
==== strcspn() ====
Обратная к функции '''<code>strspn()'''</code>.
 
Функция '''strcspn()''' Определяет отсутствие начальных символов в строке.
Определяет отсутствие начальных символов в строке.
 
Функция''' strcspn()''' возвращаетВозвращает длину начального фрагмента строки <code>$str1</code>, состоящего полностью '''не''' из символов, которые есть в строке <code>$str2</code>.
 
== Система пользователей ==
'''Алгоритмы системы пользователей''' — В этой статье будет описаны алгоритмы системы пользователей и их коды на языке '''PHP'''.
 
=== Регистрация ===
Алгоритм регистрации пожалуй самый простой из тех, что мы будем здесь использовать. Серверу просто предстоит запись введённые пользователем данные и записать: результата хэш-функции от пароля.
# Введённые пользователем данные;
# Результат хэш-функции от пароля.
<source lang="html5">
<!DOCTYPE html>
<source lang="php">
<?php
//register Register
//Подключение к MySQL
// Подключение к "MySQL"-серверу
// (с выводом ошибки в случае неудачи):
mysql_connect("localhost", "root", "") or die(mysql_error);
//Подключение к базе данных deskside
// Подключение к базе данных "deskside"
mysql_select_db("deskside") or die(mysql_error);
// (с выводом ошибки в случае неудачи):
$find_id_sql = mysql_query("SELECT * FROM users ORDER BY id ASC");
mysql_select_db("deskside") or die(mysql_error);
// Запрос на получение списка всех пользователей из таблицы "users",
// упорядоченного по возрастанию значений поля "id":
$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']."'");
// Получение списка пользователей из таблицы "users",
// чьи логины совпадают со значением, полученным в "POST"-запросе:
$find_names = mysql_query("SELECT * FROM users "
."WHERE login='"
.$_POST['login']."'");
$find_row = mysql_num_rows($find_names);
$id_counter = 1;
 
//Вычисление последнего ID
// Вычисление последнего ID:
while ($find_id_row = mysql_fetch_assoc($find_id_sql)){
$id_counter += 1;
}
$user_already = false; //Проверка, есть ли уже такой пользователь
$user_already = false; // Булевская переменная для сохранения результатов
if ($_POST['register'])
// проверки: есть ли уже такой пользователь,
// с данным "login".
if ($_POST['register']) // Если дан запрос именно что на регистрацию.
{
while($find_row == mysql_fetch_assoc($find_names))
{
// Поиск пользователя с данным "login".
//Проверка, есть ли уже такой пользователь
if ($find_row['login'] == $_POST['login']){ // Если нашёлся...
$user_already = true; //Если есть, ...то такотмечаем это икак пишемрезультат
break; // ...и выходим из цикла.
}
}
if($user_already){
// Если пользователь с таким "login" уже есть.
if($user_already){ // Уведомляем отправителя запроса об этом.
echo "
<p>
Такой пользователь уже есть. <br /> <a href=\"http://localhost/register.htm\">Пройти регистрацию заново... </a>
<a href=\"http://localhost/register.htm\">
</p>
Пройти регистрацию заново...
";
</a>
</p>
";
}
else
{
// Если такого пользователя с таким "login" всё-таки нет, то регистрируем нового пользователя с таким именем
// то регистрируем данный "login" для нового пользователя.
// Проверка совпадения паролей:
if ($_POST['password'] == $_POST['second_password'])
{
//Проверка совпаденийЕсли совпали: паролей
//Совпали:
// 1. Хэширование пароля для базы данных.
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']."')");
// 2. Запрос "MySQL"-серверу на сохранение регистрационных данных
// в соответствующую таблицу ("users"):
mysql_query("INSERT INTO users "
."(`id`, `login`, `password`, `e-mail`, `name`) "
."VALUES ('"
.$id_counter
."', '"
.$_POST['login']
."', '"
.$md5_password
."', '"
.$_POST['e-mail']
."', '"
.$_POST['name']
."')");
// 3. Уведомляем отправителя запроса:
echo "Регистрация проведена успешно.";
}
else
{
echo "
<p>
Ошибка регистрации. Возможно,: пароли не совпадают! <br /> <a href=\"http://localhost/register.htm\">Пройти регистрацию заново</a>
<a href=\"http://localhost/register.htm\">
</p>
Пройти регистрацию заново...
";
</a>
</p>
";
 
}
}
}
if($_POST['register'])
if ($_POST['register'])
{
// Если пользователь уже нажал кнопку "РЕГИСТРАЦИЯ", то зачем ему заново показывать форму?!
// то зачем ему заново показывать форму?!
}
else
{
// Если он уже кликнул, то мы не показываем форму, а выводим либо сообщение о подтверждении, либо об ошибке
// а выводим либо сообщение о подтверждении, либо об ошибке:
echo '
<form method=\"post\">
</p>
<p>
Пароль ещеещё раз: <input type=\"password\" name=\"second_password\" />
</p>
<p>
Ваше имя: <input type=\"text\" name=\"name\" />
</p>
<input type=\"submit\" name=\"register\" value=\"ЗарегестрироватьсяЗарегистрироваться\">
</form>
';
[[Файл:Алгоритм_входа_пользователя.png|thumbnail|180px|Алгоритм авторизации пользователя]]
Вход пользователя будет производиться по следующему алгоритму:
#Пользователь заполняет форму: «Логин», «Пароль.»;
#Данные запоминаются в переменной '''$_POST''', после чего будут обрабатываться на сессии<ref>Приемущество сессий в том, что обычный пользователь даже не заметит, как его перенаправили на другую страницу, а значит будет сложнее взломать PHP код. На странице входа отображается только перенаправление на session.php и форма входа. Если конечно не посмотрит внимательно на HTML код, но это ему ничего не даст, по скольку он не сможет взять из файла session.php сам PHP код</ref>.;
#Уже в сессии хэшируетсяхешируется введенныйвведённый пользователем пароль, алгоритмом [[w:MD5|MD5]].;
#Подключение к базе данных «SQL» и импорт данных со строки пользователя ''admin'' (Допустимдопустим, пользователь ввелввёл имя пользователя admin) ''admin'',). затемЗатем запись всей строки в массив '''$table''' - такой вариант поможет сократить много нервов и строк.;
#Сравнение зашифрованного пароля, который в базе данных, — с зашифрованным, введеннымвведённым пользователем.;
#Если пароли совпадают, записываются «COOKIE» с информацией о авторизации пользователя. ("user_enter" & "user_login").;
#Закрытие сессии методом перенаправления на другую страницу. - ''header (Location: ...);''
===== '''Форма входа''' =====
<?php
session_start();
# Этот шаблон можно вставлять в любую часть сайта, он будет работать в любом случае.;
# он будет работать в любом случае.
?>
</source>
 
====='''Сессия (session.php)'''=====
<source lang="php">
<?php
 
// Заметьте,: нетНет команд "echo" - эту команду можно использовать только после того, как отправились все куки -
// эту команду можно использовать
// P.S. Если на странице используются куки, лучше не использовать кодировку UTF-8
// только после того, как отправились все "куки".
//
// P.S.: Если на странице используются "куки" --
// лучше не использовать кодировку "UTF-8".
 
session_start();
// Если пользователь кликнул "Выход":
 
if ($_POST['exit']){ //Если пользователь кликнул "Выход"
// Чистим...то чистим "куки" о его авторизации и логине
// о его авторизации и логине:
 
unset($_COOKIE['user_enter']);
unset($_COOKIE['user_login']);
}
 
// Подключение к "MySQL"-серверу:
mysql_connect("localhost",// "root", "1234") orlocalhost die(mysql_error); // localhost - стандартный серверадрес сервера баз данных, | root - логин MySQL | 1234 - Пароль для пользователя MySQL
// если тот запущен на локальном компьютере;
// root - логин для пользователя "MySQL";
// 1234 - пароль для пользователя "MySQL".
mysql_connect("localhost", "root", "1234") or die(mysql_error);
 
// Подключение к базе данных:
mysql_select_db("base") or die(mysql_error); // где "base" - имя базы данных.
 
$check_password = mysql_query("SELECT * FROM `base`.`users` WHERE (login='".$_POST['login']."')"); // SQL Запрос для проверки пароля
."WHERE (login='"
.$_POST['login']
."')"); // "SQL"-запрос для проверки пароля.
$row_check_password = mysql_num_rows($check_password);
 
while($row_check_password = mysql_fetch_assoc($check_password)){ // Получение данных о пользователе:
while($row_check_password = mysql_fetch_assoc($check_password)){
 
// ID пользователя:
$table['id'] = $row_check_password['id']; // ID Пользователя
$table['loginid'] = $row_check_password['loginid']; // Логин пользователя
$table['password'] = $row_check_password['password']; //Пароль пользователя в зашифрованном виде
$table['blog_name'] = $row_check_password['blog_name']; //Имя блогаЛогин пользователя:
$table['login'] = $row_check_password['login'];
// Пароль (в зашифрованном виде) пользователя:
$table['password'] = $row_check_password['password'];
// Имя блога пользователя:
$table['blog_name'] = $row_check_password['blog_name'];
}
 
// Проверка паролей:
 
if ($_POST['enter']){
// Хеширование пользовательского пароля:
 
$md5_password = md5($_POST['password']); //хэширование пользовательского пароля
 
// Если хеш пароля, введённого пользователем, и логин
if ($md5_password == $table['password'] && $_POST['login'] == $table['login']){ //Если хэш пароля пользователя и логин совпадают с хэшем пароля и логином из базы данных
// совпадают с хешем пароля и с логином из базы данных:
 
if ($md5_password == $table['password']
//Пользователь вошёл в систему
&& $_POST['login'] == $table['login']){
setcookie("user_enter", true); //кука - пользователь авторизировался
// Пользователь вошёл в систему:
setcookie("user_login", $_POST['login']); //кука - логин пользователя
setcookie("user_enter", true); // "Кука": пользователь авторизировался.
setcookie("user_blog", $table['blog_name']); //кука - имя блога пользователя
setcookie("user_login", $_POST['login']); // "Кука": логин.
 
setcookie("user_blog", $table['blog_name']); // "Кука": имя блога.
}else{
// Пароль не подтвердился:
setcookie("user_login", "no_enter"); // кука - логин"Кука": пользователяЛогин "не вошёл".
setcookie("user_enter", false); // кука -"Кука": пользовательПользователь не вошёл.
 
}
}
 
header('Location: http: //deskside/main.php?page=home'); //Перенаправление на главную страницу:
header('Location: http://deskside/main.php?page=home');
?>
</source>
 
=== Вывод данных пользователя ===
Для вывода данных пользователя будут использоваться куки, но поскольку они могут содержать только латинские буквы и цифры, они будут использоваться только как идентификатор имени пользователя и подтверждения его авторизации. Пользователю нужно выводить максимум информации о его ошибках,; если вашВаш проект будет очень большим и пользователь при входе будет вводить не только логин и пароль, а ещё 20 полей, то пользователю будет не очень удобно при опечатке смотреть на такое сообщение: "Возможно вы ошиблись при заполнении данных, попробуйте ещё раз". Ему будет гораздо приятнее, если ему выведут сообщение с возможным полем опечатки и самой опечаткой. Но в нашем варианте будет рассматриваться только вариант с логином и паролем. Естественно невозможно использовать один и тот-же текст для вывода разной информации. Всего их три, если пользователь авторизировался, если пароли не совпадают и если пользователь ещё не авторизировался и хочет ввести свои данные. Проще всего будет просто выводить шаблон на страницу ('''$login_form''')<br />
 
''«Возможно, Вы ошиблись при заполнении данных... Попробуйте ещё раз».''
 
Ему будет гораздо приятнее, если ему выведут сообщение с возможным полем опечатки и самой опечаткой. Но в нашем варианте будет рассматриваться только вариант с логином и паролем. Естественно невозможно использовать один и тот-же текст для вывода разной информации. Всего их три, если пользователь авторизировался, если пароли не совпадают и если пользователь ещё не авторизировался и хочет ввести свои данные. Проще всего будет просто выводить шаблон на страницу ('''$login_form''')<br />
====='''Пользователь авторизировался'''=====
<source lang=php>
11

правок