PHP: различия между версиями
Содержимое удалено Содержимое добавлено
Nikolice (обсуждение | вклад) мНет описания правки |
Nikolice (обсуждение | вклад) мНет описания правки |
||
Строка 659:
</source>
Где «3» — точка отсчёта, а «7» — длина изымаемой строки. Если же требуется вести отсчёт от конца строки — используйте отрицательное значение.
'''Пример'''
Строка 683:
<code>int strpos (string haystack, string needle [, int offset])</code>
Возвращает позицию первого вхождения подстроки <code>needle</code> (в переводе с английского — «иголка») в строку <code>haystack</code> (в переводе с английского, как вы уже догадались, — «стог сена»). Необязательный аргумент <code>offset</code> позволяет указать, с какого по
Если подстрока <code>needle</code> не найдена
'''Пример:'''
Строка 706:
==== 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> не найдена
'''Пример:'''
Эта функция достаёт из [[w:URL|URL]] имя файла ('''только пример;'''
<source lang="php">
function getfname($url)
{
$filename = ''; // Переменная для хранения результата обработки.
// Ведём поиск первого слеша,
// отделяющего путь к файлу
// от имени домена:
$pos = strrpos($url, '/', 8); // Начинаем с 8 символа (после "http://").
if ($pos === false) {
return false; // Ошибка
} else {
$filename = substr($url, $pos + 1); // Выделяем часть URL после слеша.
}
return $filename; // Возвращаем: или результат обработки, или ''.
}
</source>
Строка 738 ⟶ 742 :
<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
?>
</source>
Для работы с разными кодировками используются функции:
Строка 757:
<code>string mb_stristr (string $haystack , string $needle [, bool $before_needle = false [, string $encoding ]])</code>
где параметр <code>encoding</code>
==== strchr() ====
Строка 767:
<code>string strrchr (string $haystack, char $needle)</code>
Возвращает подстроку строки <code>haystack</code>: начиная с ''последнего'' вхождения <code>needle</code> — до конца строки.
Если подстрока <code>needle</code> не найдена
Если <code>needle</code> состоит более чем из одного символа
Если <code>needle</code> не является строкой
'''Пример:'''
<source lang="php">
<?php
?>
</source>
==== substr_count() ====
Строка 792 ⟶ 788 :
Возвращает число вхождений подстроки <code>needle</code> в строку <code>haystack</code>.
Можно использовать или текст в кавычках (или апострофах), или переменные.
'''Пример:'''
<source lang="php">
<?php
print substr_count('www.wikibooks.org', 'o'); // Результат: "3".
?>
</source>
==== strspn() ====
<code>int strspn (string $str1, string $str2)</code>
Возвращает длину начального сегмента <code>$str1</code>, состоящего полностью из символов строки <code>$str2</code>.
'''Пример:'''
<source lang="php">
<?php
"1234567890"); // Результат: "2".
// (Т. к. в начале первой строки-аргумента
// самым длинным сегментом,
// состоящим только из символов, содержащихся во втором аргументе,
// является сегмент "42", -- длиной в 2 символа.)
?>
</source>
==== strcspn() ====
Обратная к функции
Определяет отсутствие начальных символов в строке.
== Система пользователей ==
=== Регистрация ===
Алгоритм регистрации
# Введённые пользователем данные; # <source lang="html5">
<!DOCTYPE html>
Строка 844:
<source lang="php">
<?php
//
// Подключение к "MySQL"-серверу
// (с выводом ошибки в случае неудачи):
mysql_connect("localhost", "root", "") or die(mysql_error);
// Подключение к базе данных "deskside"
// (с выводом ошибки в случае неудачи):
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);
// Получение списка пользователей из таблицы "users",
// чьи логины совпадают со значением, полученным в "POST"-запросе:
$find_names = mysql_query("SELECT * FROM users "
."WHERE login='"
.$_POST['login']."'");
$find_row = mysql_num_rows($find_names);
$id_counter = 1;
// Вычисление последнего ID:
while ($find_id_row = mysql_fetch_assoc($find_id_sql)){
$id_counter += 1;
}
$user_already = false; // Булевская переменная для сохранения результатов
// проверки: есть ли уже такой пользователь,
// с данным "login".
if ($_POST['register']) // Если дан запрос именно что на регистрацию.
{
while($find_row == mysql_fetch_assoc($find_names))
{
// Поиск пользователя с данным "login".
if ($find_row['login'] == $_POST['login']){ // Если нашёлся...
$user_already = true; //
break; // ...и выходим из цикла.
}
}
// Если пользователь с таким "login" уже есть.
if($user_already){ // Уведомляем отправителя запроса об этом.
echo "
<p>
Такой пользователь уже есть. <br />
<a href=\"http://localhost/register.htm\"> Пройти регистрацию заново... </
";
}
else
{
// Если
// то регистрируем данный "login" для нового пользователя.
// Проверка совпадения паролей:
if ($_POST['password'] == $_POST['second_password'])
{
//
// 1. Хэширование пароля для базы данных.
$md5_password = md5($_POST['password']);
// 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>
Ошибка регистрации
<a href=\"http://localhost/register.htm\"> Пройти регистрацию заново </
";
}
}
}
if ($_POST['register']) {
// Если пользователь уже нажал кнопку "РЕГИСТРАЦИЯ",
// то зачем ему заново показывать форму?! }
else
{
// Если он уже кликнул, то мы не показываем форму,
// а выводим либо сообщение о подтверждении, либо об ошибке: echo '
<form method=\"post\">
Строка 913 ⟶ 967 :
</p>
<p>
Пароль
</p>
<p>
Строка 921 ⟶ 975 :
Ваше имя: <input type=\"text\" name=\"name\" />
</p>
<input type=\"submit\" name=\"register\" value=\"
</form>
';
Строка 935 ⟶ 989 :
[[Файл:Алгоритм_входа_пользователя.png|thumbnail|180px|Алгоритм авторизации пользователя]]
Вход пользователя будет производиться по следующему алгоритму:
#Пользователь заполняет форму: «Логин», «Пароль
#Данные запоминаются в переменной '''$_POST''', после чего будут обрабатываться на сессии<ref>Приемущество сессий в том, что обычный пользователь даже не заметит, как его перенаправили на другую страницу, а значит будет сложнее взломать PHP код. На странице входа отображается только перенаправление на session.php и форма входа. Если конечно не посмотрит внимательно на HTML код, но это ему ничего не даст, по скольку он не сможет взять из файла session.php сам PHP код</ref>
#Уже в сессии
#Подключение к базе данных «SQL» и импорт данных со строки пользователя ''admin'' (
#Сравнение зашифрованного пароля, который в базе данных, — с зашифрованным,
#Если пароли совпадают, записываются «COOKIE» с информацией о авторизации пользователя. ("user_enter" & "user_login")
#Закрытие сессии методом перенаправления на другую страницу. - ''header (Location: ...);''
===== '''Форма входа''' =====
Строка 946 ⟶ 1000 :
<?php
session_start();
# Этот шаблон можно вставлять в любую часть сайта
# он будет работать в любом случае. ?>
</source>
Строка 962 ⟶ 1017 :
====='''Сессия (session.php)'''=====
<source lang="php">
<?php
// Заметьте
// эту команду можно использовать // только после того, как отправились все "куки". //
// P.S.: Если на странице используются "куки" --
// лучше не использовать кодировку "UTF-8".
session_start();
// Если пользователь кликнул "Выход":
if ($_POST['exit']){
// о его авторизации и логине:
unset($_COOKIE['user_enter']);
unset($_COOKIE['user_login']);
}
// Подключение к "MySQL"-серверу:
// если тот запущен на локальном компьютере;
// root - логин для пользователя "MySQL";
// 1234 - пароль для пользователя "MySQL".
mysql_connect("localhost", "root", "1234") or die(mysql_error);
// Подключение к базе данных:
mysql_select_db("base") or die(mysql_error);
$check_password = mysql_query("SELECT * FROM `base`.`users`"
."WHERE (login='" .$_POST['login'] ."')"); // "SQL $row_check_password = mysql_num_rows($check_password);
while($row_check_password = mysql_fetch_assoc($check_password)){
// ID пользователя:
$table['
// Логин пользователя: $table['
// Пароль (в зашифрованном виде) пользователя:
$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']){
// Пользователь вошёл в систему:
setcookie("user_enter", true); // "Кука": пользователь авторизировался.
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');
?>
</source>
=== Вывод данных пользователя ===
Для вывода данных пользователя будут использоваться куки, но поскольку они могут содержать только латинские буквы и цифры
''«Возможно, Ему будет гораздо приятнее, если ему выведут сообщение с возможным полем опечатки и самой опечаткой. Но в нашем варианте будет рассматриваться только вариант с логином и паролем. Естественно невозможно использовать один и тот-же текст для вывода разной информации. Всего их три, если пользователь авторизировался, если пароли не совпадают и если пользователь ещё не авторизировался и хочет ввести свои данные. Проще всего будет просто выводить шаблон на страницу ('''$login_form''')<br /> ====='''Пользователь авторизировался'''=====
<source lang=php>
|