IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Open source  >

Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных

developerWorks
На предыдущую страницуСтраница 5 из 10 На предыдущую страницу

Опции документа

Обсудить


Выскажите мнение об этом учебном пособии

Помогите нам улучшить содержание


Взаимодействие с базой данных 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 {
...

Теперь настало время навести порядок в структуре наших файлов.



В начало



На предыдущую страницуСтраница 5 из 10 На предыдущую страницу
    IBM в России Конфиденциальность Контакты