Дело было ночью, делать было нечего... Решил написать мануал, который думаю поможе каждому начинающему программисту, который хочет познакомиться с mysql.
Этот краткий мануал поможет начинающим программистам, которые хотят научиться писать подобные системы, а так же обучиться основам синтаксиса и использования mysql в php. Я не буду углубляться в тонкости php и mysql, я всего лиш попытаюсь дать вам базовые знания используя их вы со временем уже сами сможете усовершенствовать свои знания.
Внимание! Мануал предназначен только для ознакомления с mysql и помогает новичкам понять алгоритм построения систем управления пользователями. Использовать его в рабочих проектах крайне не рекомендуется
Итак, чтобы вы поняли основу построения сиетем управления пользователями и получили базовые знания mysql, я на примерах расскажу вам как реализовать следующии функции:
- Регистрация пользоваталей (добавление данных в таблицу)
- Авторизация пользователей (выборочное получение данных с таблицы, использование сессий)
- Получение списка всех пользователей (массовое получение данных из таблицы, сортировка и вывод на экран)
- Поиск пользователей (поиск по базе)
- Редактирование/удаление профиля (редактирование/удаление полей в таблице)
Для начала, советую вам ознакомиться с функциями, которые будут использованы в данном мануале при работе с mysql:
mysql_connect()
mysql_select_db()
mysql_query()
mysql_num_rows()
mysql_fetch_assoc()
mysql_error()
Первое что нужно сделать - это подключиться к базе данных (в дальнейшем БД) и создать таблицу пользователей с определённой структурой.
Для этого создадим 2 файла:
config.php и
create_table.php
файл config.php будет служить нам для подключения к БД и хранения данных для подключения.
Текст файла
config.php:
Скрытый текст:
PHP код:
<?php
$db_server = "localhost"; // сервер mysql (в 90% случаев это localhost)
$db_user = "root"; // пользователь бд
$db_password = ""; // пароль этого пользователя
$db_name = "test"; // название бд
mysql_connect($db_server, $db_user, $db_password) or die(mysql_error()); // подключаемся к бд с нашим именем пользователя и паролем, или выводим ошибку в случае неудачи
mysql_select_db($db_name) or die(mysql_error()); // выбираем бд для дальнейшей работы с ней, или выводим ошибку в случае неудачи
?>
Если всё сделано правильно, то, запустив этот скрипт в браузере, вы должны получить чистую страницу.
Теперь создадим в нашей базе таблицу users. Для этого нам нужно выполнить mysql запрос. Синтаксис создания таблицы имеет примерно такой вид:
CREATE TABLE `имя_таблицы` (
`поле 1` параметры поля,
`поле 2` параметры поля,
`поле 3` параметры поля,
параметры таблицы);
Для выполнений mysql запросов в php используется функция mysql_query().
Итак, текст файла
create_table.php:
Скрытый текст:
PHP код:
<?php
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
// Заносим в переменную $query текст запроса
$query = "CREATE TABLE `users` (
`id` INT(11) NOT NULL auto_increment,
`login` VARCHAR(15) NOT NULL default '',
`password` VARCHAR(32) NOT NULL default '',
`info` TEXT NOT NULL default '',
PRIMARY KEY (`id`)
);";
mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи
echo "Table created successful!"; // Если таблица была успешно создана выводим надпись Table created successful!
?>
Объясню назначения параметров, использующихся при создании данного запроса.
INT, VARCHAR, TEXT - тип поля (цифра в скобках после типа определяет максимальную длину поля)
NOT NULL - не является неопределённостью.
default - стандартное значение поля (в данном случае все поля изначально пустые)
auto_increment - автоматическое заполнение поля. При каждом заполнении таблицы значение этого поля будет увеличиваться на 1
PRIMARY KEY - первичный ключ. Первичный ключ определяет уникальность строки, и препятствует вводу повторяющихся данных в это поле. В данном случае, это поле `id`.
Теперь запустите скрипт через браузер. Если всё сделано правильно вы должны увидеть на экране Table created successful!
Теперь, когда таблица создана, можем перейти к основной части.
Сейчас попытаемся сделать регистрацию пользователей. Для начала создадим файл
reg.php. Теперь мысленно представим себе структуру скрипта:
1) рисуем ХТМЛ форму.
2) если форма была заполнена и отправлена на сервер, проверяем введённые данные на валидность.
3) если ошибок не обнаружено, заполняем таблицу users используя полученные данные, в противном случае выводим сообщение об ошибке.
Сразу скажу, что пароли в таблице в открытом виде храниться не будут. В таблице будет храниться мд5 хеш пароля.
Синтаксис запроса для занесения данных в таблицу имеет несколько видов. Я советую пользоваться вам вот таким:
INSERT INTO `имя таблицы` (
`поле 1`, `поле 2`, `поле 3`
) VALUES (
'значение поля 1', 'значение поля 2', 'значение поля 3')
Текст файла
reg.php:
Скрытый текст:
PHP код:
<?php
require_once 'config.php'; // Присоединям файл config.php для подключения к БД
$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успешной регистрации
// Если на сервер переданы POST переменные, обрабатываем их
if ($_POST['register'] == "1")
{
if ( ($_POST['login'] == "") || ($_POST['password'] == "")) || ($_POST['info'] == "") ) // проверяем заполнены ли все поля
{
$result = "Заполните все поля";
}
else if ( (strlen($_POST['login']) < 3) || (strlen($_POST['login']) > 15) ) // проверяем длину поля login
{
$result = "Длина логина не должна быть меньше 3 и больше 15 символов";
}
else if ( (strlen($_POST['password']) < 5) || (strlen($_POST['password']) > 15) ) // проверяем длину поля password
{
$result = "Длина логина не должна быть меньше 5 и больше 15 символов";
}
else
{
// для удобства объявляем переменные $login $password и $info и присваиваем им полученные значения.
$login = $_POST['login'];
$password = md5($_POST['password']); // Присвояем переменной $password мд5 хеш поля password
$info = $_POST['info'];
// Заносим в переменную $query текст запроса
$query = "INSERT INTO `users` (
`login`, `password`, `info`
) VALUES (
'$login', '$password', '$info')";
mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи
$result = "Пользователь зарегистрирован успешно!"; // присваиваем переменной $result сообщение об успешной регистрации
unset($_POST); // Обнуляем массив $_POST
}
}
// Рисуем HTML форму.
?>
<html>
<head>
<title></title>
</head>
<body>
<?=$result ?> <br>
<form method=post>
<input type="hidden" name="register" value="1">
Имя <input type="text" name="login" value="<?=$_POST['login'] ?>"><br>
Пароль <input type="text" name="password" value="<?=$_POST['password'] ?>"><br>
Ифно <textarea name=info wrap=soft><?=$_POST['info'] ?></textarea><br>
<input type="submit" name="" value="Зарегистрироваться"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
Тестируем, смотрим таблицу через, например, майадмин. Если юзер появился - всё сделано правильно.
Следующий шаг - авторизация пользователей. Для этого создадим файл
index.php. Логика скрипта очень простая:
1) Если есть пост данные ищем пользователя в таблице с таким же именем и паролем. Если он обнаружен - объявляем новую сессионную переменную и в качестве значения присваеваем ей id этого пользователя и редиректим на тот же index.php.
2) Если пользователь не обнаружен, выводим сообщение о неудачной авторизации.
3) Если же пост данных нет, просто чекаем наличие сессии. Если сессия есть - Показываем закрытую страницу. Если же нет - рисуем форму авторизации.
Запрос выбора данных строится так:
SELECT `имя поля` FROM `имя таблицы` WHERE `поле 1`='значение 1' and `поле 2`='поле 2' LIMIT 1
- знак * после слова SELECT означает что нужно выбрать все поля
- в sql запросах можно использовать только словесные обозначения AND и OR. Знаки &&(и) и ||(или) здесь работать не будут
- При сравнении могут использоваться следующие операторы: = (равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), < > (больше или меньше (оператор != в sql запросах не используется))
- LIMIT 1 означает что результат нужно ограничить лиш одной строкой
Текст файла
index.php:
Скрытый текст:
PHP код:
<?php
session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успешной авторизации
if ($_POST['auth'] == 1) // Если на сервер переданы данные с формы
{
$login = $_POST['login']; // переменной $login присваивам значение полученного логина.
$password = md5($_POST['password']); // переменной $password присваивам значение мд5 хеша полученного пароля.
// Строим запрос, в котором нужно в таблицы users найти пользователя с таким же логином и паролем.
// Заносим в переменную $query текст запроса
$query = "SELECT * FROM `users` WHERE `login`='$login' and `password`='$password' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.
if ($num == 1) // Если mysql вернул 1 строку, что означает что пользователь с таким логином и паролем найден
{
$row = array(); // Объявляем массив $row...
$row = mysql_fetch_assoc($result_query); // и заполняем его данными, полученными их таблицы.
$_SESSION['user_id'] = $row['id']; // объявляем новую сессионную переменную и в качестве значения присваеваем ей id этого пользователя...
header("Location: index.php"); // и редиректим его на тот же index.php
}
else
{
$result = "Неверное имя пользователя или пароль"; // Присваиваем переменной $result сообщение об ошибке
}
}
if (isset($_SESSION['user_id'])) // Если сессия есть, что означает что пользователь авторизирован, выводим закрытую страницу
{
$result = $_SESSION['user_id']; // Присваиваем переменной $result значение сессии user_id которая содержит id пользователя
?>
<html>
<head>
<title></title>
</head>
<body>
Привет! Твой id - <?=$result ?>! <br>
<a href="list.php">Список пользователей</a> <br>
<a href="search.php">Поиск пользователей</a> <br>
<a href="edit.php">Изменить данные</a> <br>
<a href="delete.php">Удалить себя :)</a> <br>
<a href="logout.php">Выйти</a> <br>
</body>
</html>
<?php
}
else // А если сессии нет, рисуем форму авторизации
{
?>
<html>
<head>
<title></title>
</head>
<body>
<?=$result ?><br>
<form method=post>
<input type="hidden" name="auth" value="1">
Имя <input type="text" name="login" value="<?=$_POST['login'] ?>"><br>
Пароль <input type="password" name="password" value="<?=$_POST['password'] ?>"><br>
<input type="submit" name="" value="Войти"><br>
</form>
<a href="reg.php">Регистрация</a>
</body>
</html>
<?php
}
?>
Теперь, что бы сделать выход пользователя, создайте файл
logout.php. Файл очень простой - удаляем сессию, редиректим на index.php
Текст файла
logout.php:
Скрытый текст:
PHP код:
<?php
session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.
session_destroy(); // Удаляем все сессии
header("Location: index.php"); // и редиректим пользователя на страницу авторизации index.php
?>
Осталось реализовать изменение и удаление данных, массовый вывод информации из таблицы и поиск по бд.
Сначала сделаем самое простое - поиск пользователей по логину. Создайте файл
search.php Запрос поиска формируется так:
SELECT `имя поля` FROM `имя таблицы` WHERE `имя поля` LIKE '%значение%'
- Знак % означает любой символ
тут всё просто:
1) проверяем, есть ли ПОСТ-данные
2) если есть, ищем в таблице users
3) рисуем форму поиска
текст файла
search.php:
Скрытый текст:
PHP код:
<?php
session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.
if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
if ($_POST['search'] == 1) // Если на сервер переданы данные с формы
{
$login = $_POST['login']; // переменной $login присваивам значение полученного логина.
// Строим запрос, в котором нужно в таблице users найти строку, в котором часть поля login совпадает с полученными данными
// Заносим в переменную $query текст запроса
$query = "SELECT * FROM `users` WHERE `login` LIKE '%$login%'";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.
if ($num > 0) // Если найдено больше нуля записей
{
// Теперь нам нужно в один массив занести несколько массивов с полученными записями из таблицы
$row = array(); // Объявляем массив $row в котором будут храниться массивы с данными конкретной записи
$rows = array(); // Объявляем массив $rows в котором будут храниться массивы со всеми записями
// С помощью цикла заносим в массив $row даные данной записи, после чего добавляем этот массив к массиву $rows
while ($row = mysql_fetch_assoc($result_query))
{
$rows[]= $row;
}
// Выводим результат на экран с помощью цикла foreach
?>
<html>
<head>
<title></title>
</head>
<body>
Всего найдено <?=$num ?> записей! <br>
<table border=1>
<?php foreach ($rows as $row) { ?>
<tr>
<td><?=$row['login'] ?></td>
</tr>
<?php } ?>
<table><br>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}
else // Если поиск результатов не дал, выводим сообщение об ошибке
{
?>
<html>
<head>
<title></title>
</head>
<body>
Ничего не найдено<br>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}
}
else // если нет переданных на сервер данных, рисуем пустую форму
{
?>
<html>
<head>
<title></title>
</head>
<body>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}
?>
Теперь создадим файл
list.php в котором будет выводиться список всех пользователей.
Структура скрипта не сильно отличается от скрипта поиска, поэтуму, думаю, пояснять тут нечего.
Текст файла
list.php:
Скрытый текст:
PHP код:
<?php
session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.
if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
// Строим запрос, в котором нужно в таблицы users выбрать все записи
// Заносим в переменную $query текст запроса
$query = "SELECT * FROM `users`";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.
if ($num > 0) // Если найдено больше нуля записей
{
// Теперь нам нужно в один массив занести несколько массивов с полученными записями из таблицы
$row = array(); // Объявляем массив $row в котором будут храниться массивы с данными конкретной записи
$rows = array(); // Объявляем массив $rows в котором будут храниться массивы со всеми записями
// С помощью цикла заносим в массив $row даные данной записи, после чего добавляем этот массив к массиву $rows
while ($row = mysql_fetch_assoc($result_query))
{
$rows[]= $row;
}
// Выводим результат на экран с помощью цикла foreach
?>
<html>
<head>
<title></title>
</head>
<body>
Всего в таблице <?=$num ?> записей! <br>
<table border=1>
<?php foreach ($rows as $row) { ?>
<tr>
<td><?=$row['login'] ?></td>
</tr>
<?php } ?>
<table><br>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}
else // Если mysql_num_rows вернул 0 лаписей, что означает что пользователей в таблице нет - выводим сообщение об ошибке
{
?>
<html>
<head>
<title></title>
</head>
<body>
Пользователей в таблице не обнаружено<br>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}
?>
Следующий, предпоследний шаг - изменение данных в таблице. Точнее, мы будем изменять логин и пароль пользователей. Создадим файл
edit.php
Запрос изменения данных в таблице выглядит так:
UPDATE `имя таблицы` SET `поле 1`='значение 1', `поле 2`='значение 2' WHERE `поле 3`='значение 3'
Логика скрипта простая:
1) проверяем, есть ли ПОСТ-данные
2) изменяем значения полей в таблице
3) рисуем форму
Тут тоже, надеюсь, всё понятно.
Текст файла
edit.php:
Скрытый текст:
PHP код:
<?php
session_start();
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации
$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успем изменении
// Если на сервер переданы POST переменные, обрабатываем их
// Получаем данные пользователя из базы
// Строим запрос, в котором нужно в таблице users найти пользователя, id которого равен сессии user_id (тоесть того пользователя, который сейчас находится на сайте)
// Заносим в переменную $query текст запроса
$query = "SELECT * FROM `users` WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$row = array(); // Объявляем массив $row...
$row = mysql_fetch_assoc($result_query); // и заполняем его данными, полученными их таблицы.
if ($_POST['edit'] == "1")
{
if ( ($_POST['login'] == "") || ($_POST['info'] == "") ) // проверяем заполнены ли все поля
{
$result = "Заполните все поля";
}
else if ( (strlen($_POST['login']) < 3) || (strlen($_POST['login']) > 15) ) // проверяем длину поля login
{
$result = "Длина логина не должна быть меньше 3 и больше 15 символов";
}
else
{
// для удобства объявляем переменные $login и $info и присваиваем им полученные значения.
$login = $_POST['login'];
$info = $_POST['info'];
// Заносим в переменную $query текст запроса
$query = "UPDATE `users` SET `login`='$login', `info`='$info' WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";
mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи
$result = "Данные успешно изменены! (что бы увидеть результат, обновите страницу)"; // присваиваем переменной $result сообщение об успешнои изменении данных
}
}
// Рисуем HTML форму.
?>
<html>
<head>
<title></title>
</head>
<body>
<?=$result ?> <br>
<form method=post>
<input type="hidden" name="edit" value="1">
Имя <input type="text" name="login" value="<?=$row['login'] ?>"><br>
Ифно <textarea name=info wrap=soft><?=$row['info'] ?></textarea><br>
<input type="submit" name="" value="Изменить"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
Ну и наконец создаём последний файл
delete.php.
Наверное это самый лёгкий скрипт из всех
Структура запроса удаления записи в таблице:
DELETE FROM `имя таблицы` WHERE `поле 1`='значение 1'
Логика скрипта:
1) удаляем пользователя
2) Уничтожаем все сессии и выводим на экран сообщение об удачном удалении пользователя.
Текст файла
delete.php:
Скрытый текст:
PHP код:
<?php
session_start();
require_once 'config.php'; // Присоеденям файл config.php для подключания к БД
if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации
// Строим запрос, в котором нужно в таблице users удалить запись, id которого равен сессии user_id (тоесть того пользователя, который сейчас находится на сайте)
// Заносим в переменную $query текст запроса
$query = "DELETE FROM `users` WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
// Так как пользователя теперь нет, сессия ему уже не понадобится :)
session_destroy(); // Удаляем все сессии
// И выводим на экран сообщение об успешном удалении пользователя с сылкой на страницу авторизации index.php
?>
<html>
<head>
<title></title>
</head>
<body>
Пользователь успешно удалён!<br>
<a href="index.php">На страницу авторизации</a>
</body>
</html>
Поздравляю! Вы освоили построение базовых sql запросов, которые вам будут нужны на протяжении всей вашей крьере программиста.
Всем спасибо. Надеюсь, этот мануал действительно кому-то поможет
Искрене ваш, Hast.
ЧаВо:
Скрытый текст:
В: Что такое sql-инъекция:
О: Материал из Википедии — свободной энциклопедии
Цитата:
Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.
Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.
|
подробнее
здесь
В: Как защититься от sql-инъекций?
О: Нужно экранировать спец символы в полученных данных. Для этого существуют функции
mysql_escape_string(),
addslashes() и другие.
В: А как быть если в настройках сервера включена опция magic quotes gpc? Ведь получится двойное экранирование
О: Существует 3 способа:
1) Проверять текущее состояние magic quotes функицей
get_magic_quotes_gpc() и в зависимости от результата валидировать или не валидировать данные
2) Вырубать magic quotes с помощью ini_set('magic_quotes_gpc', 0); Но такое решение работает только в том случае, если в настройках сервера включена возможность изменять настройки с помощью скриптов.
3) Жестоко вырубать magic quotes в .htaccess'e:
php_flag magic_quotes_gpc off
В: Как организовать поиск не по точному совпадению строки $string, а по её вхождению в таблице?
О: Вот так:
PHP код:
"SELECT * FROM `table_one` WHERE `field_one` LIKE '%".$string."%'"
где % - любой(ые) символ(ы)
В: Как с помощью одного запроса выбрать данные из нескольких таблиц?
О: Вот так:
PHP код:
SELECT t1.*, t2.* FROM `table1` AS t1, `table2` AS t2
В: А что если в обоих таблицах есть колонка с одинаковым названием, и значение обоих колонок мне нужно получить?
О: Нужно насильно задать уникальное имя колонки при выборке:
PHP код:
SELECT t1.name AS t1_name, t2.name AS t2_name FROM `table1` AS t1, `table2` AS t2
UPDATE: Мануал обновил, учёл все замечания и пожелания.
По всем вопросам и предложениям по улучшению мануала или фака — ко мне в ЛС.