Проблема
Пусть у нас имеется некий сайт в Инете, и мы захотели сделать авторизацию, т.е., чтобы посетители смогли попасть на наш сайт, только после того как введут логин и пароль. Допустим данные будут представлять собой строки такого вида: логин, пароль, email. Вопрос. А где хранить данные
и как с ними работать?
Решение №1
Эти данные можно хранить в обычном текстовом файле.
||login1|
||login2|
...
Чтобы найти нужные данные необходимо проверять каждую строчку по порядку, да и строк может быть миллион, поэтому это не очень хорошее решение, но применить можно.
Решение №2
Самое лучшее решение - хранить данные в базе данных(БД). Строки в БД в отличие от файлов не находятся по порядку, а проиндексированы, поэтому поиск информации происходит очень быстро. PHP поддерживает MySQL - это быстрая база данных, за одно и бесплатная. SQL - это язык запросов для систем управления БД. Зная язык SQL можно создавать или удалять базы данных, в них создавать-удалять таблицы и работать с этими таблицами: например, добавлять новые строки с данными, искать любые данные, просмотреть всю таблицу или частично, в зависимости от того что мы хотим увидеть, добавлять новые столбцы.
Создаем пользователя MySQL
Запускаем Денвер. Открываем браузер. Вводим адресную строку: http://localhost. Ждем пока загрузится страничка. В меню находим утилиты. Кликаем туда, потом кликаем по ссылке Заведение новых БД и пользователей MySQL. Если мы не меняли пароль админа, то оставляем его пустым. Итак, вводим: имя базы данных: "new", логин пользователя: "new", придумаем пароль; пусть будет тоже: "new", чтоб не забыть. Все! Теперь у нас есть пользователь, который может пользоваться только своей БД "new" (как будто, хостинг выделил в наше распоряжение базу данных и логин). Ну и на последок, чтоб удостовериться, идем в утилиты/phpMyAdmin - администрирование СУБД MySQL и смотрим (на левой панели, где написано "выберите БД"), появилась ли наша БД с именем "new". Если да, то все OK!.
Кстати, СУБД - расшифровывается как Система Управления Базами Данных; phpMyAdmin
представляет собой коллекцию PHP скриптов, которые генерируют SQL команды через
web интерфейс и возвращают результаты
Создаем таблицу
Сейчас мы должны находиться в phpMyAdmin, и БД с именем "new" должна существовать. Только мы сейчас админим БД с помощью супер пользователя "root", а не с помощью нашего пользователя "new". Пользователь "root", как вы догадались, имеет неограниченные права. Так как мы еще не знаем языка SQL, то для начала создадим простенькую учебную таблицу с помощью phpMyAdmin.(чтобы научиться извлекать информацию из нее при помощи PHP. Нас ведь это интересует?) phpMyAdmin тоже можно считать за СУБД, которая написана на языке PHP.
Итак, выбираем нашу БД "new" в левой панели (или кликаем Базы данных, а потом в списке находим new и кликаем по этой ссылке). Видим, что в нашей БД таблиц не обнаружено. Оно то верно, мы же только недавно создали эту базу данных. Ну а теперь создаем таблицу. Имя таблицы пусть будет: "devki" - короткое и легко запоминается (таблица будет содержать имена, телефоны и дни рождения - больше мне в голову ничего не пришло). Указываем количество полей: 4. Кстати, в СУБД поле - это тоже самое, что и столбец. Ну, просто, принято называть столбец полем, так что привыкайте. Дальше нажимаем на кнопку "Пошел".
На следующей странице надо дать имена четырем полям и указать их тип и длину. Кстати, поля расположены здесь горизонтально а не вертикально как столбцы, так что не зря их называют полями.
Коротко о типах
INT - это обычные целые числа
FLOAT - числа с плавающей точкой (типа: 3.1416)
VARCHAR - строка
CHAR - строка максимальной длиной 255
TEXT - строка максимальной длиной 65535
DATE - дата в формате ГГГГ-ММ-ДД
TIME - время в формате ЧЧ-ММ-СС
- Вводим: название первого поля: "imya", тип VARCHAR, длина: 14.
- Теперь вводим: название второго поля: "fp" (fp - это поле где будут фамилии или прозвища), тип: VARCHAR, длина: 14.
- третье поле: "tel" (это телефоны), тип VARCHAR, длина: 11.
- четвертое поле: "dr" (это дни рождения), тип DATE.
Вот и все... Нажимаем "сохранить". На следующей странице мы должны увидеть, что таблица "devki" была создана. А еще мы должны увидеть SQL-запрос:
CREATE TABLE devki
( imya VARCHAR( 14 ) NOT NULL ,
fp VARCHAR( 14 ) NOT NULL ,
tel VARCHAR( 11 ) NOT NULL ,
dr DATE NOT NULL
)
Вот такой язык мы должны знать, чтоб могли работать с БД через PHP или точнее, чтоб наш сайт мог работать с БД.
Конечно, мы могли бы ввести этот запрос напрямую через окно запроса (в phpMyAdmine - это кнопка SQL). Или через командную строку (запустив программу, которая должна быть по адресу: Z:\\usr\local\mysql4\bin\mysql_run_to_import_dumps.exe), но там вечная проблема с кодировкой (т.е. с отображением русских букв); и привыкать к этой консоли совсем не хочется, т.к. мы изучаем SQL для применения в PHP. Только надо сначала выбрать БД (запрос: use new;). Но я предполагаю, что мы пока не знаем SQL и вышеописанный способ будет легче.
Добавляем строки в таблицу
Кстати, строки принято называть рядами. Еще раз повторю: столбцы - это поля, а строки - это ряды. Давайте попробуем вставить в нашу таблицу несколько рядов. Сейчас мы должны находиться в phpMyAdmin. Кликаем: структура. Видим нашу таблицу "devki", она должна быть одна, потому что мы кроме нее ничего не создавали. В столбце "действие" кликаем на кнопу вставить. На следующей странице вводим данные:
imya - Маша
fp - Иванова
tel - 999999
dr - 1987-01-01
Нажимаем кнопку "пошел" и видим что ряд добавлен. Добавляем следующие строки таким же способом:
imya - Света
fp - Лучик
tel - 555555
dr - оставляем пустым
imya - Маша
fp - Солнышко
tel - 81234567890
dr - 1986-01-02
Я думаю три ряда пока хватит. Нажимаем в меню кнопку обзор и видим нашу таблицу полностью.
Как работать с MySQL в PHP
Сейчас мы работали с MySQL через phpMyAdmin, а как я уже говорил phpMyAdmin написан на PHP, и я думаю, что это очень хороший пример того, как PHP может работать с MySQL. Дальше мы узнаем, как сделать так, чтоб наша страничка подключалась к MySQL, выбирала базу данных, посылала SQL запрос, принимала его и отключалась от MySQL.
mysql_connect("хост", "логин", "пароль"); - эта функция устанавливает связь с сервером MySQL.
mysql_select_db("имя_базы_данных"); - функция выбирает базу данных.
mysql_close(); - закрывает соединение с MySQL.
Ну а теперь давайте создадим папку с названием "sql", например, в C:\WebServers\home\localhost\www\. Дальше, в папке "sql" создаем файл "index.php"; открываем его с помощью блокнота и пишем туда такой PHP код:
@mysql_connect("localhost","new","new") or die("ошибка подключения к серверу MySQL");
@mysql_select_db("new") or die("ошибка подключения к базе данных");
echo"Ура!! мы подключились к базе данных new...";
mysql_close(); ?>
Всем понятно, что мы сделали? Если нет, то объясняю:
- В первой строчке мы подключились к MySQL или если подключение неудачно, то скрипт заканчивает работу с выводом нашего сообщения об ошибке.("localhost" - это имя нашего компьютера, потому что MySQL находится у нас на компьютере, а для нашего сайта в Интернете мы будем указывать такой хост, какой даст наш хостинг, имя пользователя у нас, если помните - "new" и пароль тоже - "new"),
- Вторая строчка: мы выбираем нашу базу данных - "new" или выводим сообщение об ошибке. Как вы догадались, у пользователя "new" есть только одна база данных - "new".
- Третья строчка: если все Ok, то выводим сообщение, что все работает...
- Четвертая строчка: закрываем соединение.
Теперь, давайте сохраним файл "index.php" (проверим: работает ли денвер )и запустим наш файл через браузер: в адресной строке набираем: http://localhost/sql/ . Ну как, работает? Дальше давайте учиться писать простенькие SQL запросы:
Команда SELECT
Сейчас мы снова отставляем PHP в покое и переходим к SQL запросам. Чтобы извлечь данные из таблицы используется команда SELECT. Вспоминаем... Таблица, которую мы создали называлась "devki", столбцы были такие: "imya", "fp", "tel", "dr". Пример запроса:
SELECT *
FROM devki;
Этот запрос выводит все данные из нашей таблицы.
- Обратите внимание, что запрос заканчивается точкой с запятой ";".
- Ключевое слово "SELECT" говорит MySQL что мы запрашиваем информацию.
- Слово "FROM" указывает, какую таблицу, нужно использовать.
- Звездочка указывает на то что, нужно вывести все столбцы. Конечно вместо нее мы могли бы написать:
SELECT imya, fp, tel, dr
FROM devki;
А если мы укажем столбцы в другом порядке, то мы получим таблицу со столбцами в том порядке, в котором мы указали. Если мы не хотим выводить все столбцы, а только "imya" и "tel" то запрос должен быть такой:
SELECT imya, tel
FROM devki;
Теперь давайте применять эти простые SQL запросы на практике. Зайдем в phpMyAdmin, выберем нашу базу данных "new". В меню нажмем на кнопку SQL, и в окне запросов введем те запросы о которых я говорил выше (кстати запросы в phpMyAdmine можно вводить без точки с запятой). Ну как работает? Теперь давайте искать информацию в нашей таблице.
SELECT *
FROM devki
WHERE imya = "Маша";
Ключевое WHERE означает, что надо вывести только те ряды таблицы, где в определенном столбце присутствует определенное значение. В данном случае мы получим таблицу, где в столбце "imya" присутствуют только "Маши". Знак "=" в отличие от PHP означает не присваивание, а проверку на равенство. С SQL запросами пока все, а то мозги закипят.
Как работать с MySQL в PHP (продолжение)
Пусть строковая переменная $sql_zap - это какой-нибудь SQL запрос. Пример:
$sql_zap = "
SELECT *
FROM devki
WHERE imya = \"Маша\"
";
Пока мы знаем только запросы с командой SELECT, но скоро мы будем знать другие запросы и уметь применять их в PHP. Сразу прошу заметить, что SQL запрос в PHP скрипте, заключенный в кавычки пишется без точки запятой ";" на конце - это правило! Ну и конечно не надо забывать экранировать кавычки в коде PHP.
$sql_vip = mysql_query($sql_zap); - функция выполняет SQL запрос. Если запрос выполнен, то $sql_vip равен TRUE, иначе FALSE
$row = mysql_fetch_array($sql_vip, [ТИП] ); - эта функция присваивает каждый раз элементам массива $row по ряду (строчке) из результата выполнения начиная с нуля (сложно для понимания, но сейчас мы все поймем на примере). ТИП - это необязательный параметр, который указывает на тип индексов (числовых или ассоциативных). Если:
- мы не указываем ТИП, то мы получим массив с числовыми и ассоциативными индексами,
- ТИП = MYSQL_BOTH, то мы получим массив с числовыми и ассоциативными индексами(значение по-умолчанию),
- ТИП = MYSQL_ASSOC, то мы получим только ассоциативные индексы,
- ТИП = MYSQL_NUM, то мы получим только числовые индексы.
Вспоминаем, что выводится после запроса "SELECT * FROM devki", Правильно! Это вся таблица:
imya | fp | tel | dr |
Маша | Иванова | 999999 | 1987-01-01 |
Света | Лучик | 555555 | 0000-00-00 |
Маша | Солнышко | 81234567890 | 1986-01-01 |
Ну теперь пример: Возьмем нашу страничку index.php и впишем туда такой код:
@mysql_connect("localhost","new","new") or die("ошибка подключения к серверу MySQL");
@mysql_select_db("new") or die("ошибка подключения к базе данных");
echo"Ура!! мы подключились к базе данных new...";
// начинаем от сюда
echo"
";
// создаем SQL запрос, как мы помним этот запрос должен вывести нам таблицу из трех строчек.
$sql_zap = "
SELECT *
FROM devki
";
// выполняем запрос:
$sql_vip = mysql_query($sql_zap);
if ($sql_vip == TRUE){echo "запрос выполнен
";}else{die ("запрос не выполнен
");}
// присваивание
$row = mysql_fetch_array($sql_vip, MYSQL_ASSOC);
// включаем мозги и следим за ходом скрипта, замечаем параметр MYSQL_ASSOC (зачем он нужен?)
// выводим результат:
echo $row["imya"]."|";
// эту вериткальную палочку мы будем использовать как разделитель столбцов, не хочется пока возиться с тегами таблиц
echo $row["fp"]."|";
echo $row["tel"]."|";
echo $row["dr"];
echo "
"; // все !!! хватит стучать пальцами, сохраняем index.php и выполняем
mysql_close();
?>
Вводим в адрес браузера строчку: http://localhost/sql. Ну как, загрузилась без ошибок? Вот нам PHP вывел первую строчку нашей таблицы. Неплохо для начала! Давайте выведем всю таблицу! Конечно код у нас примитивный, но это только для нашего понимания. Помните, я говорил что функция mysql_fetch_array() присваивает каждый раз элементам массива $row по строчке из нашей таблицы. Если применим эту функцию второй раз, то получим вторую строчку нашей таблицы, а если третий раз - то третию строчку нашей таблицы, в четвертый раз мы ничего не получим, потому что эта функция возвратит FALSE,
т.к. наша таблица состоит всего из трех строчек. Приведу фрагмент нашего кода, который должен получиться:
...
// получим первую строчку таблицы
$row = mysql_fetch_array($sql_vip, MYSQL_ASSOC);
echo $row["imya"]."|";
echo $row["fp"]."|";
echo $row["tel"]."|";
echo $row["dr"];
echo "
";
// получим вторую строчку таблицы
$row = mysql_fetch_array($sql_vip, MYSQL_ASSOC);
echo $row["imya"]."|";
echo $row["fp"]."|";
echo $row["tel"]."|";
echo $row["dr"];
echo "
";
// третью
$row = mysql_fetch_array($sql_vip, MYSQL_ASSOC);
echo $row["imya"]."|";
echo $row["fp"]."|";
echo $row["tel"]."|";
echo $row["dr"];
echo "
";
mysql_close();
?>
Мы просто повторили один и тот же код три раза. Теперь ясно как работает функция mysql_fetch_array()? После того как мы все уяснили давайте усовершенствуем PHP код. А то он выводит постоянно три строчки, а нам надо чтобы он выводил результат любого нашего запроса. Сейчас нам нужны только знания PHP. Чтобы не повторять команду mysql_fetch_array() вставим ее в цикл:
...
while($row = mysql_fetch_array($sql_vip, MYSQL_ASSOC))
{
echo $row["imya"]."|";
echo $row["fp"]."|";
echo $row["tel"]."|";
echo $row["dr"];
echo "
";
}
...
Теперь вместо повторений мы можем написать один раз этот цикл. В этом цикле мы присваиваем значения массиву $row и сразу проверяем его на истинность, если все Ok, то выводим результаты; и так до тех пор пока $row не будет равен FALSE. Конечно можно пользоваться циклом for, но этот предпочтительнее, так как верхняя строчка воспринимается как единая конструкция. А теперь идем дальше. Зачем мы постоянно пишем индексы столбцов в ручную??? А вдруг у таблицы будет 5 столбцов вместо 4, тогда нам придестя перелопачивать код. Есть такой хороший цикл, называется foreach, который каждый раз по порядку присваивает значения массива отдельной переменной.
...
echo"
$zn | ";}
...
Вот тут я уже могу использовать теги таблицы. До начала цикла foreach я открываю строку таблицы "
Маша | Иванова | 999999 | 1987-01-01 |
Света | Лучик | 555555 | 0000-00-00 |
Маша | Солнышко | 81234567890 | 1986-01-02 |
Уже неплохо! Только вот у таблицы нет названий столбцов. Не проблема - вставим туда еще цикл foreach, который будет выдавать нам уже не значения массива а его индексы(ведь не зря же мы воспользовались параметром MYSQL_ASSOC), но надо это сделать таким образом, чтоб он сработал только один раз.
...
echo"
$ind | ";} // выводим названия столбцов
$zn | ";}
...
Все. Вот и спрограммировали мы что-то типа "универсального просмоторщика SQL запросов". Давайте напишем страничку, где в верхней части мы будем вводить SQL запрос, а в нижней - наблюдать его результат (прям как у Денвера). "Универсальный просмоторщик" мы уже написали (больше не знаю как его назвать), остается только написать форму на обычном HTML для ввода наших запросов и вставит ее в верх нашей страницы.
<html>
<form action="" method=post>
Выполнить SQL запрос:
<textarea name=sql_zap_text ROWS=5 COLS=50></textarea>
<input type=submit value=Послать>
</form>
/* если мы ввели запрос в форму, то форма пересылает данные сама на себя (т.к. action="") и если данные неложные т.е. если $sql_zap_text существует, то скрипт выполняется, иначе выводится сообщение "введите запрос" */
if (@$sql_zap_text){
// подключение к MySQL
@mysql_connect("localhost","new","new") or die("ошибка подключения к серверу MySQL");
@mysql_select_db("new") or die("ошибка подключения к базе данных");
echo"к БД подключены...
";
// конец подкл
// создаем SQL запрос
(присваиваем данные из формы перменной)
$sql_zap = $sql_zap_text;
// выполняем запрос
$sql_vip=mysql_query($sql_zap);
if ($sql_vip == TRUE){echo "запрос выполнен
";}else{die ("запрос не выполнен
");}
// унив просм
echo"
$ind | ";} // выводим названия столбцов
$zn | ";}
// конец унив просм
// отключение от MySQL
mysql_close();
} else {echo"Введите SQL запрос...";}
?>
</html>
Сейчас мы сделали свою систему управления базой данных. Только SQL запросы надо вводить обязательно без точки с запятой ";", т.к. запрос у нас обрабатывает PHP (если мы хотим, чтоб такое было возможно, нам придется доработать скрипт так, чтоб в нашем запросе происходили поиск ";" и затем удаление этого знака). Согласитесь, все равно приятно пользоваться собственными скриптами, чем чужими. Мы можем поставить его на свой сайт и админить свою БД, или работать с собственного компьютера (только не забудьте поменять логиг, пароль и имя своей БД).
Другие SQL команды
Давайте продолжать учить язык SQL, пользуясь своей системой управления БД (т.е. давайте вводить SQL команды в нашу форму и смотреть результат с помощью "универсального просмоторщика").
CREATE TABLE - эта команда создает новую таблицу в нашей БД "new". Синтаксис:
CREATE TABLE <имя таблицы>
(<имя поля> <тип данных>[(длина)],
<имя поля> <тип данных> [(длина)] ...);
Давайте создадим такую таблицу:
CREATE TABLE loginy
(login CHAR (14),
parol CHAR (25)
);
Наш скрипт отвечает, что запрос выполнен! Давайте посмотрим список таблиц.
SHOW TABLES - эта команда выдает нам список всех таблиц в нашей БД. Синтаксис:
SHOW TABLES;
DESCRIBE - команда показывает структуру таблицы. Синтаксис:
DESCRIBE <имя таблицы>;
DESCRIBE loginy;
ALTER TABLE - добавление и удаление полей (столбцов) таблицы. Синтксис:
добавление нового столбца
ALTER TABLE <имя таблицы>
ADD <имя поля> <тип данных> [(длина)];
удаление столбца
ALTER TABLE <имя таблицы>
DROP <имя поля>;
Давайте создадим новый столбец "email":
ALTER TABLE loginy
ADD email CHAR (50);
DROP TABLE -команда удаляет всю таблицу. Синтаксис:
DROB TABLE <имя таблицы>;
INSERT INTO…VALUES - команда вставляет новые записи (ряды) в таблицу. Синтаксис:
INSERT INTO <имя таблицы>
VALUES ("<значение1>", "<значение2>"…);
Значения необходимо писать в том порядке, в каком расположены поля таблицы. Если мы хотим оставить ячейку пустой, то в кавычках ничего не пишем. Давайте вставим 2 записи в нашу таблицу:
INSERT INTO loginy
VALUES ("rio", "123456", "rio@mail.ru");
INSERT INTO loginy
VALUES ("yaryj", "parol", "");
DELETE - удаляет записи из таблицы. Синтаксис:
DELETE
FROM <имя таблицы>
[WHERE <условие>];
Если не указывать необязательное слово WHERE вместе с условием, то удаляются все записи из таблицы. Давайте удалим из нашей таблицы пользователя "rio":
DELETE
FROM loginy
WHERE login = "rio";
Источник: http://webstudent.ru
Комментариев нет:
Отправить комментарий