• strict warning: Non-static method view::load() should not be called statically in /var/www/codeacademy/sites/all/modules/views/views.module on line 1113.
  • strict warning: Declaration of views_handler_field::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_field.inc on line 0.
  • strict warning: Declaration of content_handler_field::element_type() should be compatible with views_handler_field::element_type($none_supported = false, $default_empty = false, $inline = false) in /var/www/codeacademy/sites/all/modules/cck/includes/views/handlers/content_handler_field.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_sort::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_sort.inc on line 0.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter::query() should be compatible with views_handler::query($group_by = false) in /var/www/codeacademy/sites/all/modules/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_plugin_query::options_submit() should be compatible with views_plugin::options_submit($form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_query.inc on line 0.
  • strict warning: Declaration of views_plugin_style_default::options() should be compatible with views_object::options() in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /var/www/codeacademy/sites/all/modules/views/plugins/views_plugin_row.inc on line 0.

Основные методы работы с таблицей базы данных MySQL

На предыдущем уроке вы научились проектировать базу данных с помощью приложения phpMyAdmin, создавать таблицы и заполнять их данными. Эта статья поможет вам разобраться, каким образом такую базу данных можно обрабатывать с помощью php-скрипта – вносить новые данные, обрабатывать их, производить поиск и удаление записей.

<?php
  $mydb = new mysqli  ( 'localhost ', 'root ', ' ', 'mydb');
?>

В настоящем уроке мы будет использовать уже созданную на первом уроке базу данных mydb. Если такой базы данных у вас нет, то создайте ее, руководствуясь материалом предыдущей статьи.

Итак, в нашей базе данных пока что одна таблица "users" и содержит она примерно такие поля и записи:

У вас, конечно, записей может быть и больше, главное – не нарушать саму структуру таблицы.

Создайте в папке home директории Денвера (почитать про Денвер можно здесь) новую папку my_project, в ней – подпапку www, где и будет находиться наш основной файл index.php:

Z:
denwer
home
my_project
www
index.php
tmp
usr

(Не забудьте после создания новой папки-проекта перезагрузить Денвер!)

Здесь и далее мы будем работать с расширенным классом mysqli, который предоставляет огромный арсенал методов для работы с базами данных MySQL. Даже если вы еще никогда не слышали про такой тип данных как класс, ничего страшного – это абсолютно не помешает научиться работать с mysqli и изучить основные его методы и свойства.

Для того, чтобы php-скрипт имел доступ к нашей БД mydb в первую очередь необходимо создать подключение к серверу БД. Для этого нужно инициализировать экземпляр класса mysqli с параметрами:

"имя_хоста","имя_пользователя", "пароль", "название_базы_данных".
$object = new mysqli ("host", "user" , "password", "db_name") .

Это теория. На практике все намного легче.
Имя хоста у нас – localhost (потому что работаем мы на локальном сервере), имя пользователя в Денвере по умолчанию всегда root, пароля по умолчанию вообще нет, а имя нашей базы данных – mydb, поэтому в нашем случае подключаться мы будем следующим образом:

$mydb = new mysqli ( 'localhost' , 'root' , '', 'mydb');

Обратите внимание, пароль – это просто две рядом стоящие одинарные кавычки, никакого пробела быть не должно!
(Имя переменной $mydb придумано из соображений логической взаимосвязи, на самом деле оно может быть абсолютно любым).

После обработки такой строки php-скрипт создаст объект $mydb, который будет содержать ссылку на всю нашу базу данных!

Итак, файл index.php:

<?php
$mydb = new mysqli ( 'localhost ', 'root ', ' ', 'mydb');
?>

Сохраните файл и перейдите по адресу в браузере http://my_project. Если вы видите на экране пустую белую страницу – это очень хорошо! Значит, скрипт сработал правильно – создал соединение с БД mydb и прекратил свою работу. Если вы видите сообщение об ошибке, внимательно проверьте свою БД и php-скрипт на наличие каких-либо несоответствий.

Для манипуляций с таблицами БД существует множество методов, и начнем мы с самого простого и необходимого – научимся извлекать записи из таблицы. Для такого действия существует sql-оператор SELECT:

SELECT имя_поля1, имя_поля2, … FROM имя_таблицы

Оператор SELECT извлекает из таблицы перечисленные поля всех записей. Если необходимо извлечь все поля (все данные), то вместо перечисления полей используется символ "*" (звездочка).

Класс mysqli имеет важный метод query, который осуществляет запрос к БД, а результат запроса помещает в переменную (объект). Дополним файл index.php:

<?php
$mydb = new mysqli('localhost' , 'root' , '' , 'mydb');
$result = $mydb->query ( "SELECT * FROM users" );
?>

После работы такого скрипта переменная $result будет содержать все записи таблицы users. (Строго говоря, эта не переменная, а объект класса mysqli и содержит он не сами данные, а ссылки на эти данные).

Метод num_rows позволяет получить количество записей. Попробуйте написать так:

$mydb = new mysqli('localhost' , 'root' , '' , 'mydb');
$result = $mydb->query("SELECT * FROM users");
echo $result->num_rows;

Скрипт выведет на экран количество записей из таблицы users. У меня их всего две, у вас может быть и больше.

Выводим данные на экран

Метод fetch_row() заносит все поля одной записи в массив. Проверим это, изменив файл index.php:

$result = $mydb->query("SELECT * FROM users");
$row = $result->fetch_row();
echo $row[0] . " , " . $row[1] . " , " . $row[2] . " , " . $row[3] . " , " . $row[4];

У меня результатом была строка:
1 , Коля , kolya , kl9903 , 1990-09-27
То есть на экран вывелись данные самой первой записи из таблицы users.
При повторном вызове метода fetch_row() будет взята следующая строка и т.д. Естественно, если записей больше одной, будет уместным использовать циклы, с которыми вы познакомились в предыдущих статьях.
Окончательный вид index.php:

<?php
$mydb = new mysqli('localhost' , 'root' , '' , 'mydb');
$query = "SELECT * FROM users";
$result = $mydb->query($query);
while($row = $result->fetch_row()){
echo "id пользователя: " . $row[0] . ", имя: " . $row[1] . ", логин: " . $row[2]
. ", пароль: " . $row[3] . ", дата рождения: " . $row[4] . "<hr />";
}
?>

На экране вы должны увидеть все записи таблицы user. У меня это:

Здесь цикл while пробегает все значения объекта $result, которые по очереди заносятся в массив $row и выводятся на экран. После того, как метод fetch->row() перестает что-либо возвращать (поля закончились), оператор while прекращает свою работу.

Метод fetch->assoc() извлекает ряд (запись) в виде ассоциативного массива. Весьма полезный метод, ведь в числовых индексах массива можно легко запутаться, а в ключах – нет. Видоизменяем наш скрипт:

$result = $mydb->query($query);
while($row = $result->fetch_assoc()){
echo "id пользователя: " . $row['user_id'] . ", имя: " . $row['name'] . ", логин: " . $row['login']
. ", пароль: " . $row['password'] . ", дата рождения: " . $row['date_of_birth'] . "<hr />";
}

Результат работы аналогичен предыдущему, а вот манипулировать элементами стало намного проще.
Обратите внимание: ключи массива должны иметь точно такие же имена, как и имена полей в таблице!

Что еще может оператор SELECT ? Выбирать не все поля записей, а лишь некоторые:

$query = "SELECT name, date_of_birth FROM users";
$result = $mydb->query($query);
while($row = $result->fetch_assoc()){
echo "Пользователь " . $row['name'] . " родился в " . $row['date_of_birth'] . "<hr />";
}

Теперь из всех записей таблицы будут выбраны только два поля – имя и дата рождения.

Оператор WHEREсовместно с SELECT позволяет извлекать поля с определенными условиями, например:
$result = $mydb->query(= "SELECT name, date_of_birth FROM users WHERE login='kolya' ");

Результатом такого запроса будет лишь одна запись с данными пользователя под логином kolya.
О более сложных запросах SELECT поговорим позже.

Добавление записей в таблицу users

Для добавления записей существует оператор INSERT с таким синтаксисом:

INSERT INTO имя_таблицы VALUES ( value1, value2, …)
Добавим в нашу таблицу нового пользователя:

<?php
$mydb = new mysqli('localhost' , 'root' , '' , 'mydb');

$query = "INSERT INTO users VALUES(0,'Виталий','vit07','qwerty','1987-03-12')";
$mydb->query($query);

$query = "SELECT * FROM users";
$result = $mydb->query($query);
while($row = $result->fetch_assoc()){
echo "id пользователя: " . $row['user_id'] . ", имя: " . $row['name'] . ", логин: " . $row['login']
. ", пароль: " . $row['password'] . ", дата рождения: " . $row['date_of_birth'] . "<hr />";
}
?>

При правильной работе скрипта в таблице users появится еще один пользователь и его данные вместе с предыдущими пользователями будут выведены на экран. То, что запись действительно добавилась, подтвердит ее наличие в вашей физической базе данных – войдите в phpMyAdmin (http://localhost/Tools/phpMyAdmin)(!!!внимание ссылка работает только после запуска Денвера), выберите БД mydb и посмотрите на ее содержимое.

На что следует обратить внимание при работе с оператором INSERT:
1. первый параметр имеет значение "0", потому что в таблице users первое поле user_id имеет атрибут auto_increment, а значит, значение поля при каждом добавлении записи будет само каждый раз увеличиваться на единицу. Если вы укажите значение, например, "1", то запись с таким user_id просто перезапишется на нового пользователя!

2. количество параметров оператора VALUES должно в точности соответствовать фактическому количеству полей той или иной таблицы. Если вы укажите хотя бы на одно значение больше или меньше, это вызовет фатальную ошибку php-скрипта!

Изменение записи в таблице.

Оператор UPDATE изменяет (обновляет) запись (записи) и имеет синтаксис:

UPDATE имя_таблицы SET имя_столбца1=значение1, имя_столбца2=значение2, … WHERE…

Изменим дату рождения пользователя с логином kolya:
$query = "UPDATE users SET date_of_birth='1800-01-01' WHERE login='kolya' ";
$mydb->query($query);
Если после работы скрипта посмотреть листинг БД, то можно убедиться, что дата рождения у пользователя Коля изменилась.
Оператор UPDATE позволяет изменить сразу несколько записей (строк) в таблице – достаточно указать определенное условие WHERE

Удаление записи

Опасный и бескомпромиссный оператор DELETE уничтожает одну, несколько (или даже все!!!) записи из таблицы. Синтаксис:

DELETE FROM таблица WHERE условие
К примеру, если наш новый пользователь Виталий начал спамить на сайте, и мы решили его удалить из БД, то достаточно запустить такой скрипт:
$query = "DELETE FROM users WHERE login='vit07' ";
$mydb->query($query);

Не знаю как у вас, а у меня после обновления страницы my_project/ все данные о Виталике безвозвратно исчезли.
Если вообще не использовать оператор WHERE, то из таблицы будут удалены все записи. Будьте внимательны!

Что ж, мы научились с помощью php-скрипта подключаться к базе данных и проводить основные манипуляции с записями. Этих знаний уже будет достаточно для написания простого работающего приложения, чем мы и займемся на следующих уроках.