 | Взаимодействие с базой данных MySQL
Создание базы
Сначала выполним необходимые подготовительные действия непосредственно в MySQL. Мы должны создать базу данных, добавить в нее таблицу и создать нового пользователя, который будет иметь доступ к базе.
Находясь в консоли MySQL, наберите следующие команды:
create database workflow;
use workflow;
create table users (id int auto_increment primary key, username
varchar(50), email varchar(255), password varchar(50));
show tables; |
Итак, мы создали базу данных, добавили в нее таблицу users и попросили показать все таблицы нашей базы, вывод последней команды будет выглядеть так:
+--------------------+
| Tables_in_workflow |
+--------------------+
| users |
+--------------------+
1 row in set (0.00 sec) |
Наконец, создадим пользователя wfuser с паролем wfpass:
GRANT ALL PRIVILEGES ON *.* TO 'wfuser'@'localhost'
IDENTIFIED BY 'wfpass' WITH GRANT OPTION; |
Теперь мы можем перейти к использованию базы с PHP.
Соединение с базой данных MySQL
Практически невозможно создать серьезное Web-приложение без обращения к той или иной базе данных. В нашем учебном приложении мы будем использовать базу данных MySQL для хранения имени пользователя и пароля. В этом разделе мы научимся соединяться с базой данных, принимать данные со страницы регистрации, проверять, уникально ли переданное имя пользователя и добавлять данные в базу, также вы увидите, каким образом можно вывести на страницу информацию из базы данных.
Начнем с установки соединения. В PHP существует ряд функций, предназначенных для работы с MySQL, в этом разделе мы рассмотрим некоторые их них.
Прежде всего, введем функцию, которая будет устанавливать соединение с базой данных, которую мы только что
создали:
...
return $message;
}
function db_connect($user='wfuser',
$password='wfpass', $db='workflow'){
mysql_connect('localhost', $user, $password)
or die('I cannot connect to db: ' . mysql_error());
}
foreach ($_POST as $key=>$value) {
echo "<p>".$key." = " . $value . "</p>";
}
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
} else {
echo "<p>There was a problem with your registration:</p>";
...
|
Итак, у нас теперь есть функция db_connect(), которая будет пытаться установить соединение между PHP и базой данных MySQL. Обратите внимание на то, что в определение функции включены не только имена, но и значения аргументов. Эти значения будут значениями "по умолчанию", они будут использоваться в том случае, если при вызове этой функции не будут определены имя пользователя, пароль или имя базы данных. Воспользовавшись этой возможностью, в нашем примере мы вызвали функцию вообще без аргументов.
Вы могли заметить, что наша функция пытается открыть соединение с базой на локальной машине, об этом говорит параметр localhost. Надо иметь в виду, что машина является локальной по отношению к PHP, то есть, к Web-серверу, а не к клиенту.
Если установить соединение с базой не удалось, то процесс останавливается (для этого служит опция dies) и PHP выводит текстовое сообщение об ошибке.
Если все пошло успешно, то соединение с базой будет оставаться открытым до тех пор, пока вы не закроете его, или до того, когда будет закрыта страница. Все остальные команды обращения к базе данных будут ссылаться на это соединение.
Последний выделенный оператор и есть, собственно, вызов нашей функции.
Выбор базы данных
Поскольку один сервер может поддерживать несколько баз данных, то следующим шагом после открытия соединения нужно выбрать, с какой именно базой данных мы будем работать:
...
function db_connect($user='wfuser',
$password='wfpass', $db='workflow'){
mysql_connect('localhost', $user, $password)
or die('I cannot connect to db: ' . mysql_error());
mysql_select_db($db);
}
...
|
Функцию выбора базы данных можно использовать повторно для выбора другой базы того же сервера. Следует заметить, что наши дальнейшие действия будут в известном смысле независимы от выбранной базы. Написанная нами только что функция будет единственным местом, где нужно будет внести изменения, если потребуется работать с другой базой.
Теперь мы готовы к тому, чтобы добавить данные в нашу базу.
Добавление записей в базу
Для того чтобы вставить запись в таблицу базы данных, нужно сначала написать соответствующий SQL-запрос, а затем выполнить его.
Запрос будет иметь следующую форму:
insert into users (username, email, password) values
('roadnick', 'ibmquestions@nicholaschase.com', 'supersecretpassword')
|
Вы могли заметить, что в этом запросе использованы не все поля таблицы users, поле с именем id пропущено. Дело в том, что это поле имело атрибут AUTO_INCREMENT, в том случае, если его значение пропущено в запросе, MySQL подставляет первое свободное целое число. Теперь попытаемся поместить в базу данных реальные данные из нашей формы регистрации, то есть, выполнить запрос:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "insert into users (username, email, password) values
('".$_POST["name"]."', '".$_POST["email"]."', \
'".$passwords[0]."')";
$result = mysql_query($sql);
if ($result){
echo "It's entered!";
} else {
echo "There's been a problem: ".mysql_error();
}
} else {
echo "<p>There was a problem with your registration:</p>";
...
|
Обратите внимание на то, что функция, которая выполняет запрос, mysql_query(), возвращает значение логического типа, которое записывается в переменную
$result. Если запрос отработал успешно, то значение будет "истина" (TRUE), а если возникли те или иные проблемы, то значение будет "ложь" (FALSE). Это значение можно затем использовать в условных операторах if-then, для того чтобы предпринять те или иные действия.
Если возникли какие-либо проблемы, MySQL передаст сообщение об ошибке в функцию mysql_error() и это сообщение можно будет вывести на странице.
Посмотрим теперь, как извлекается информация из базы данных.
Выбор записей из базы
Итак, мы умеем записывать наши данные в базу. Но как мы можем узнать, уникально ли предложенное имя пользователя? Посмотрим, как можно проверить имя, прежде чем добавлять данные:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "select * from users where username='".$_POST["name"]."'";
$result = mysql_query($sql);
if (!$result) {
$sql = "insert into users (username, email, password) values
('".$_POST["name"]."', '".$_POST["email"]."', '".$passwords[0]."')";
$result = mysql_query($sql);
if ($result){
echo "It's entered!";
} else {
echo "There's been a problem: ".mysql_error();
}
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users";
$resultsAll = mysql_query($sqlAll);
}
} else {
echo "<p>There was a problem with your registration:</p>";
...
|
Первый SQL-запрос выбирает из базы все записи, у которых значение поля username совпадает с именем пользователя, которое мы планируем вставить. Если такие записи были найдены, то функция mysql_query() возвращает TRUE, а если нет – то FALSE.
Поскольку мы хотим вставлять только уникальные имена, то для нас желательным значением переменной $result
будет FALSE. Но условный оператор выполняет первый сегмент кода в том случае, если значение условного выражения равно TRUE. Конечно, мы могли бы поместить вставку записи в базу данных после ключевого слова else
но для того, чтобы сделать нашу программу изящнее, мы применили к переменной $result оператор инверсии (представленный восклицательным знаком), которой меняет логическое значение на противоположное.
Что произойдет, если совпадающее значение будет найдено и переменная $result будет иметь значение TRUE? Тогда значение выражения !$result будет FALSE, и программа перейдет к выполнению сегмента else. Мы сообщим пользователю о том, что введенное имя уже существует и выполним SQL-запрос, который выбирает все данные из нашей таблицы.
Получение данных из базы
Безусловно, в реальных условиях никому не придет в голову в подобной ситуации показать все записи таблицы. Мы выведем данные только в качестве тренировки, чтобы вы посмотрели, как это делается.
Выше мы создали и выполнили SQL-запрос, который выбирает все записи из таблицы users
и записали результат в переменную $resultsAll. Очевидно, что эта переменная имеет сложную структуру. Посмотрим, как извлечь из нее данные:
...
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users";
$resultsAll = mysql_query($sqlAll);
$row = mysql_fetch_array($resultsAll);
echo $row["username"]." -- ".$row["email"]."<br />";
}
...
|
Итак, для извлечения данных из переменной $resultsAll была использована функция mysql_fetch_array(),
эта функция возвращает ассоциативный массив, соответствующий набору данных одной записи в таблице. Ключами массива являются имена полей таблицы. Запишем этот массив в переменную $row и затем извлечем из нее значения по ключам.
Да, но такой способ позволяет работать только с одной строкой таблицы. Каким образом получить доступ ко всем данным?
Просмотр результатов: цикл while
Если в результате выполнения запроса была выбрана хотя бы одна строка, то логическое значение переменной $row будет TRUE. Это обстоятельство можно использовать в условных операторах if-then или в циклах while. На первом шаге цикла значение условного выражения в скобках будет TRUE, поэтому начнет выполняться блок операторов. Данные массива отображаются на странице, затем делается попытка получить следующую строку.
...
} else {
echo "There is already a user with that name: <br />";
$sqlAll = "select * from users";
$resultsAll = mysql_query($sqlAll);
$row = mysql_fetch_array($resultsAll);
while ($row) {
echo $row["username"]." -- ".$row["email"]."<br />";
$row = mysql_fetch_array($result);
}
}
...
|
Цикл будет продолжаться до тех пор, пока остаются строки для обработки. После того как обработана последняя строка, функция mysql_fetch_array() вернет FALSE, цикл прервется и начнут выполняться операторы, стоящие после цикла.
Будьте внимательны. Если вы пропустите последний шаг в цикле, то есть не извлечете следующую строку, то значение условного выражения всегда будет истинным и ваш цикл станет бесконечным. Хорошим правилом при написании циклов
while будет вставлять операторы обновления условия в тело цикла в первую очередь.
Закрыть соединение с базой данных
Прежде чем двигаться дальше, закроем соединение с нашей базой данных:
...
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
db_connect();
$sql = "select * from users where username='".$_POST["name"]."'";
$result = mysql_query($sql);
if (!$result) {
...
}
mysql_close();
} else {
...
|
Теперь настало время навести порядок в структуре наших файлов.
|  |