Этот урок ориентирован на тех, кто совсем немного знаком с PHP и Объектно-Ориентированным Программированием (ООП) и хотят создать простое веб приложение. Для более удобного восприятия материала урок состоит из 3-х частей. Обзор серии уроков Нам необходимо изучить очень много материала. Вот план: Часть №1 - Создаем проект и создаем первый класс - создаем набросок проекта - создаем файлы и папки - создаем класс для операций с базой данной: DB.class.php Часть №2 - Доделываем серверную чаcть - Создаем класс для пользователей (User) - Создаем класс UserTools - Регистрация \ Логин \ Выход Часть №3 - Создаем внешний интерфейс - Формы - Обработка форм - Отображение информации сессий Начинаем наш проект! Создаем план действий Всегда важно представлять конечный результат. Прежде чем начать с кодом необходимо задать цели, представить весь проект и решить какой будет структура папок и какие файлы Вам понадобятся. Цель данного проекта очень простая: создать простое приложение на PHP с возможностью регистрации пользователей, входа и выхода, а также с возможностью пользователям менять собственные настройки. Структура Файлов и Папок ООП PHP программирование использует классы и объекты для выполнения необходимых для приложения операций. При планировке Вам необходимо подумать о том, какие классы Вам понадобятся. Для данного проекта мы создадим 3 класса. Первый класс - User (будет содержать информацию о пользователе с функцией простого сохранения save()), второй - UserTools (будет содержать функции, которые необходимы пользователям, такие как login(), logout() и другие...), третий - класс БД (он будет выполнять роль связующего звена - подсоединение к БД, внесение изменений, вставка новых рядов, и многое другое). Кроме классов, мы также будем использовать файл с названием global.inc.php. Этот файл будет вызываться с каждой страницы и выполнять обычные операции, которые нам понадобятся. К примеру, в этом файле мы будем выполнять подключение к БД на каждой странице. Другие файлы - это страницы для пользователей: index.php, register.php, login.php, logout.php, settings.php и welcome.php. Общая структура у нас будет выглядеть так: Создание Базы Данных и таблицы users На Вашем сервере должен быть установлен MySQL. Для начала необходимо создать новую базу данных для Вашего приложения. В этой БД создайте таблицу users, которую мы будем использовать для этого урока. Можете использовать следующий код SQL: CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `join_date` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Код CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `join_date` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Первичным ключом у нас выступает поле “id”, и именно его мы будем использовать для идентификации наших пользователей. Уникальным полем у нас также будет “username”. Другие необходимые поля “password”, “email”, и “join_date”. Создаем класс DB.class.php Цель данного класса очень проста: как можно больше уменьшить использование SQL при обращении к БД, а также организовать данные в удобный для нас формат. Ниже приведен код: <?php //DB.class.php class DB { protected $db_name = 'yourdatabasename'; protected $db_user = 'databaseusername'; protected $db_pass = 'databasepassword'; protected $db_host = 'localhost'; // Открывает соединение к БД. Убедитесь, что // эта функция вызывается на каждой странице public function connect() { $connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass); mysql_select_db($this->db_name); return true; } // Берет ряд mysql и возвращает ассоциативный массив, в котором // названия колонок являются ключами массива. Если singleRow - true, // тогда выводится только один ряд public function processRowSet($rowSet, $singleRow=false) { $resultArray = array(); while($row = mysql_fetch_assoc($rowSet)) { array_push($resultArray, $row); } if($singleRow === true) return $resultArray[0]; return $resultArray; } //Выбирает ряды из БД //Выводит полный ряд или ряды из $table используя $where public function select($table, $where) { $sql = "SELECT * FROM $table WHERE $where"; $result = mysql_query($sql); if(mysql_num_rows($result) == 1) return $this->processRowSet($result, true); return $this->processRowSet($result); } //Вносит изменения в БД public function update($data, $table, $where) { foreach ($data as $column => $value) { $sql = "UPDATE $table SET $column = $value WHERE $where"; mysql_query($sql) or die(mysql_error()); } return true; } //Вставляет новый ряд в таблицу public function insert($data, $table) { $columns = ""; $values = ""; foreach ($data as $column => $value) { $columns .= ($columns == "") ? "" : ", "; $columns .= $column; $values .= ($values == "") ? "" : ", "; $values .= $value; } $sql = "insert into $table ($columns) values ($values)"; mysql_query($sql) or die(mysql_error()); //Выводит ID пользователя в БД. return mysql_insert_id(); } } ?> Код <?php //DB.class.php class DB { protected $db_name = 'yourdatabasename'; protected $db_user = 'databaseusername'; protected $db_pass = 'databasepassword'; protected $db_host = 'localhost'; // Открывает соединение к БД. Убедитесь, что // эта функция вызывается на каждой странице public function connect() { $connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass); mysql_select_db($this->db_name); return true; } // Берет ряд mysql и возвращает ассоциативный массив, в котором // названия колонок являются ключами массива. Если singleRow - true, // тогда выводится только один ряд public function processRowSet($rowSet, $singleRow=false) { $resultArray = array(); while($row = mysql_fetch_assoc($rowSet)) { array_push($resultArray, $row); } if($singleRow === true) return $resultArray[0]; return $resultArray; } //Выбирает ряды из БД //Выводит полный ряд или ряды из $table используя $where public function select($table, $where) { $sql = "SELECT * FROM $table WHERE $where"; $result = mysql_query($sql); if(mysql_num_rows($result) == 1) return $this->processRowSet($result, true); return $this->processRowSet($result); } //Вносит изменения в БД public function update($data, $table, $where) { foreach ($data as $column => $value) { $sql = "UPDATE $table SET $column = $value WHERE $where"; mysql_query($sql) or die(mysql_error()); } return true; } //Вставляет новый ряд в таблицу public function insert($data, $table) { $columns = ""; $values = ""; foreach ($data as $column => $value) { $columns .= ($columns == "") ? "" : ", "; $columns .= $column; $values .= ($values == "") ? "" : ", "; $values .= $value; } $sql = "insert into $table ($columns) values ($values)"; mysql_query($sql) or die(mysql_error()); //Выводит ID пользователя в БД. return mysql_insert_id(); } } ?> Объяснение кода После создания класса Вы видите 4 переменные: $db_name, $db_user, $db_pass, и $db_host. В них необходимо внести данные для подключения к БД. $db_host обычно localhost. Перед этими переменными указано "protected" - это означает, что они будут не доступны вне этого класса. Внутри же класса их можно выводить используя $this->db_name, $this->db_user, и т.д. Первая функция называется connect(). Эта функция содержит защищенные значения для соединения с БД. Это соединение будет открыто для использования в любом месте текущей страницы (не только внутри класса). Вот пример использования этой функции вне класса: $db = new DB(); $db->connect(); Код $db = new DB(); $db->connect(); Вторая функция называется processRowSet(). Цель данной функции - взять объект результата mysql и конвертировать его в ассоциативный массив, в котором ключами являются название колонок. Функция проходит по каждому ряду и функция mysql_fetch_assoc() преобразовывает каждый ряд в массив. Ряд далее передается массиву и возвращается с помощью функции. Существует второй аргумент $singleRow, который содержит значение по умолчанию. Если значение true, выводится только один ряд вместо массива. Это очень полезно, если Вы ожидаете получить один результат (например, при выборе юзера из БД используя уникальный id). Последние 3 функции выполняют простые функции MySQL: select, insert, update. Цель данных функций минимизировать количество SQL кода, который необходимо использовать где-либо в другом месте приложения. Каждая функция создает SQL запрос на основе переданного значения и выполняет этот запрос. В случае select(), результаты форматируются и выводятся. В случае update(), выводится true при успешном выполнении. В случае insert(), выводится id нового ряда. Вот пример как Вы можете изменить данные пользователя в БД используя функцию update(): $db = new DB(); $data = array( "username" => "'johndoe'", "email" => "'johndoe@email.com'" ); //Найти юзера с id = 3 в БД и внести изменения в ряд //username - johndoe и e-mail - johndoe@email.com $db->update($data, 'users', 'id = 3'); Код $db = new DB(); $data = array( "username" => "'johndoe'", "email" => "'johndoe@email.com'" ); //Найти юзера с id = 3 в БД и внести изменения в ряд //username - johndoe и e-mail - johndoe@email.com $db->update($data, 'users', 'id = 3'); На этом первая часть подошла к концу!