пятница, 14 августа 2009 г.

MySQL и PHP

В прошлом посте я написал Вам как использовать устанавливать домашний хостинг, теперь мы используем этот хостинг для этого "урока".

Проблема

Пусть у нас имеется некий сайт в Инете, и мы захотели сделать авторизацию, т.е., чтобы посетители смогли попасть на наш сайт, только после того как введут логин и пароль. Допустим данные будут представлять собой строки такого вида: логин, пароль, email. Вопрос. А где хранить данные
и как с ними работать?

Решение №1

Эти данные можно хранить в обычном текстовом файле.



||login1|,email1@mail.ru,
||login2|,email2@mail.ru,
...

Чтобы найти нужные данные необходимо проверять каждую строчку по порядку, да и строк может быть миллион, поэтому это не очень хорошее решение, но применить можно.

Решение №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", Правильно! Это вся таблица:

imyafp tel dr
МашаИванова999999 1987-01-01
СветаЛучик 5555550000-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
"";
while
($row = mysql_fetch_array($sql_vip, MYSQL_ASSOC))
{
echo"";
foreach ($row as $zn){echo"";}
echo"";
}
echo"
$zn
"
;
...

Вот тут я уже могу использовать теги таблицы. До начала цикла foreach я открываю строку таблицы "", после завершения работы цикла закрываю "". Слаженная работа получается у этих двух циклов - цикл while извлекает строки нашей таблицы (), а цикл foreach извлекает ячейки нашей таблицы (). Давайте применим этот более грамотный цикл вместо другого. Теперь наша страничка выдает такой результат:

МашаИванова9999991987-01-01
СветаЛучик5555550000-00-00
МашаСолнышко812345678901986-01-02

Уже неплохо! Только вот у таблицы нет названий столбцов. Не проблема - вставим туда еще цикл foreach, который будет выдавать нам уже не значения массива а его индексы(ведь не зря же мы воспользовались параметром MYSQL_ASSOC), но надо это сделать таким образом, чтоб он сработал только один раз.


...
echo
"";
$p=1;// смысл этой переменной поймете ниже
while
($row = mysql_fetch_array($sql_vip, MYSQL_ASSOC))
{
// вставляем код сюда (потому что здесь же будет верх таблицы, правильно?)
if ($p == 1) {
echo"";
foreach ($row as $ind => $zn){echo"";} // выводим названия столбцов
echo"";
$p=2; // присваиваем переменной $p двойку, чтоб при следующей итерации цикла while не выводились названия столбцов $ind
}
// конец

echo"";
foreach ($row as $zn){echo"";}
echo"";
}
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"";
$p=1;
while
($row = @mysql_fetch_array($sql_vip, MYSQL_ASSOC))
{
if ($p == 1) {
echo"";
foreach ($row as $ind => $zn){echo"";} // выводим названия столбцов
echo"";
$p=2;
}
echo"";
foreach ($row as $zn){echo"";}
echo"";
}
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

Комментариев нет:

Отправить комментарий