Мы научились подключаться серверу MySQL, выбирать базу данных для работы, узнали PHP-функцию отправки запросов серверу MySQL, узнали два простейших запроса (создание и удаление таблицы), ну и узнали как закрывать соединение.
Теперь мы будем более глубоко изучать запросы MySQL. Итак, приступим!
Создание таблицы - CREATE TABLEСейчас у нас пустая база данных, в ней нет таблиц. Поэтому сначала создадим таблицу. Мы уже знаем как это делать из первой части.
Вот код скрипта, который создаст нужную нам табличку:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "CREATE TABLE users(login VARCHAR(20), password VARCHAR(20))"; if (mysqli_query($link, $query)) echo "Таблица создана."; else echo "Таблица не создана: ".mysqli_error(); mysqli_close($link);
В нашей таблице только два поля: логин и пароль. Пока что нам больше не нужно, не будем усложнять процесс.
Итак, таблица создана.
Добавление строк (записей) в таблицу - INSERTДобавить новую строку в таблицу можно при помощи SQL команды insert. Вот пример:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "INSERT INTO users (login, password) VALUE ("zeus", "pass123")"; if (mysqli_query($link, $query)) echo "Пользователь добавлен."; else echo "Пользователь не добавлен: " . mysqli_error(); mysqli_close($link);
SQL запрос состоит из команды INSERT INTO , имени базы данных users, затем в скобках идут имена полей, потом слово VALUE , после которого в скобках следуют добавляемые значения. Значения берутся в кавычки.
Синтаксис запроса выглядит так:
INSERT INTO имя_таблицы (столбец1, столбец2) VALUE ("х1", "х2")
Кавычки во вторых скобках обязательны.
На месте значений могут быть переменные. Вот пример:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $login = "zeus"; $password = "pass123"; $query = "INSERT INTO users (login, password) VALUE ("$login", "$password")"; if (mysqli_query($link, $query)) echo "Пользователь добавлен."; else echo "Пользователь не добавлен: " . mysqli_error(); mysqli_close($link);
Конечно, в этом примере мало смысла. Возможно, новичкам будет полезно услышать, что так в базу данных записываются логины и пароли, которые сообщают пользователи при регистрации. Эти данные хранятся в переменных, потом, после проверки, записываются в базу.
Существует быстрый способ вставки нескольких строк одним запросом INSERT:
INSERT INTO users (login, password) VALUE ("bob", "eee333"), ("Rooki", "12345"), ("magy", "olol88e8")
Как видим, перечисляемые данные просто отделены запятыми.
Итак, при помощи команды INSERT мы научились добавлять записи в таблицу. Идём дальше.
Просмотр таблицы: команда SELECTТеперь у нас есть таблица users, в которой есть строки. Прошлый скрипт можно запустить несколько раз, и каждый раз он будет добавлять строку в таблицу. Теперь мы можем не знать, сколько у нас строк в таблице. А хочется знать что у нас в ней записано.
Для получения данных из таблицы используется SQL-команда SELECT . Знак * обозначает что мы запрашиваем все данные, затем после слова FROM пишем имя таблицы, из которой хотим получить данные.
Запросим все данные из таблицы users:
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены"; mysqli_close($link);
Функция mysqli_query() вернула нам идентификатор результата запроса - мы его помещаем в переменную и в дальнейшем будем работать с ним при помощи других функций PHP.
Число записей в запросеДавайте определим сколько строк в нашем запросе? Я вот запустил скрипт добавления записи в таблицу сам не помню сколько раз и теперь не знаю сколько строк в моей таблице.
Для определения числа строк в результате запроса используют функцию mysqli_num_rows() . Этой функции передаётся идентификатор результата запроса, а вернёт она число записей.
$link = mysqli_connect("localhost", "root", "", "tester"); if (!$link) die("Error"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены"; $count = mysqli_num_rows($result); echo "Всего строк в таблице: $count."; mysqli_close($link);
Если нам нужно узнать число записей в таблице, то приведённый способ не самый подходящий. Тут мы узнали число записей, найденных в запросе, но число записей в таблице ищется по другому.
Число записей в таблице SELECT COUNT(*)Чтобы узнать число записей в таблице можно воспользоваться командой SELECT COUNT(*) FROM имя_таблицы.
$link = mysqli_connect("localhost", "root", ""); if (!$link) die("Error"); mysqli_select_db("tester"); $query = "SELECT * FROM users"; $result = mysqli_query($link, $query); if (!$result) echo "Произошла ошибка: " . mysqli_error(); else echo "Данные получены. "; $count = mysqli_fetch_row($result); echo "Всего строк в таблице: $count."; mysqli_close($link);
Обратите внимание, тут мы использовали новую функцию PHP mysqli_fetch_row() для получения данных. Эта функция возвращает ряд результата запроса в форме простого массива, в нашем случае в ряду одно поле и оно имеет индес 0.
Просмотр результата запроса в циклеПосле выполнения SQL-запроса с командой SELECT и получения идентификатора результата запроса, PHP создаёт в наборе записей результата внутренний указатель. Этот указатель автоматически перемещается на следующую запись, после обращения к текущей записи. Благодаря этому механизму набор результа запроса SELECT очень удобно просматривать в цикле.
В PHP есть несколько функций, при помощи которых можно дла каждой строки результирующего запроса получить массив, состоящий из её полей. Для примера возьмём функцию mysqli_fetch_row() . Этой функции передают идентификатор запроса, а возвращает она массив. Так в цикле просматривается весь результат запроса, по достижению конца результата запроса функция вернёт false .
Итак, запрашиваем все данные из таблицы users (SELECT * FROM users).
";
while ($row = mysqli_fetch_row($result))
{
echo "Логин: $row. Пароль: $row.
";
}
mysqli_close($link);
Функция mysqli_fetch_row() возвращает простой массив. В каждой итерации цикла мы получим массив с строкой из таблицы, доступ к полям которой мы можем получить указав числовой индекс.
То же самое можно сделать используя функцию mysql_fetch_assoc() , она возвращает ассоциативный массив.
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
$result = mysqli_query($link, "SELECT * FROM users");
if (!$result) echo "Произошла ошибка: " . mysqli_error();
else echo "Данные получены.
";
while ($row = mysqli_fetch_assoc($result))
{
echo "Логин: $row. Пароль: $row.
";
}
mysqli_close($link);
Также есть функции mysqli_fetch_array() - возвращает любой тип массива, и mysqli_fetch_object() - возвращает объект.
Запрос SELECT DISTINCT - уникальные значения полейДавайте создадим новую таблицу:
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
// удаляем существующую таблицу
mysqli_query($link, "DROP TABLE users");
// создаём новую таблицу
$query = "CREATE TABLE users(name VARCHAR(20),
surname VARCHAR(20),
age TINYINT UNSIGNED)";
if (mysqli_query($link, $query)) echo "Таблица создана.
";
else echo "Таблица не создана: " . mysqli_error();
// функция для добавления записей в таблицу
function add_new_line($link, $query)
{
if (!mysqli_query($link, $query)) echo "Пользователь не добавлен: " . mysqli_error();
}
// добавляем записи
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Max", "Jayson", "33")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Bob", "Freeman", "26")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Sara", "Lopes", "65")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Serg", "Pupin", "29")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Serg", "Borman", "43")");
add_new_line($link, "INSERT INTO users (name, surname, age) VALUE ("Max", "Lopes", "21")");
// выводим содержание таблицы в браузер
$result = mysqli_query($link, "SELECT * FROM users");
if (!$result) echo "Произошла ошибка: " . mysqli_error();
else echo "Данные получены.
";
while ($row = mysqli_fetch_assoc($result))
{
echo "Имя: $row. Фамилия: $row. Возраст: $row.
";
}
mysqli_close($link);
Итак, мы имеем новую, более сложную таблицу с уникальными записями. Сейчас давайте посмотрим, сколько у нас имён в базе данных.
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
$result = mysqli_query($link, "SELECT DISTINCT name FROM users");
echo "Всего имён: " . mysqli_num_rows($result)."
";
echo "Список имён:
";
while ($name = mysqli_fetch_row($result))
{
echo "$name
";
}
mysqli_close($link);
SQL-запрос " SELECT DISTINCT name FROM users " вернул результат со всеми уникальными именами в нашей таблице. Каждое уникальное имя в новой строке результата запроса.
Сортировка результата - ORDER BYДобавив в SQL-запрос команду ORDER BY мы сортируем результат запроса по возрастанию (цифры и буквы по алфавиту). Вот пример, в котором можно сравнить обычный запрос и отсортированный по возрасту (поле age).
";
}
echo "Сортируем по возрасту:
";
$result = mysqli_query($link, "SELECT * FROM users ORDER BY age");
while ($line = mysqli_fetch_row($result))
{
echo "Имя: $line. Фамилия: $line. Возраст: $line.
";
}
mysqli_close($link);
Можете заменить поле age в команде ORDER BY на поле name и посмотреть результат.
Чтобы сортировать результат запроса в обратном порядке используйте команду ORDER BY age DESC .
Соответствие условию - WHEREДобавив в SQL-запрос команду WHERE мы запросим только те записи, которые соответствуют условию. Например, сделаем запрос на людей младше 30 лет.
Для этого используем SQL-запрос " SELECT * FROM users WHERE age
$link = mysqli_connect("localhost", "root", "");
if (!$link) die("Error");
mysqli_select_db("tester");
echo "Люди младше 30:
";
$result = mysqli_query($link, "SELECT * FROM users WHERE age create database testbase;
После этого следует набрать:
mysql>use testbase;
База данных создана:
1.4 Выбор базы данных. Функция mysql_select_db
До того как послать первый запрос серверу MySQL, необходимо указать, с какой базой данных мы собираемся работать. Для этого предназначена функция mysql_select_db:
bool mysql_select_db(string $database_name [,resource $link_identifier])
Она уведомляет PHP, что в дальнейших операциях с соединением $link_identifier будет использоваться база данных $database_name.
Использование этой функции эквивалентно вызову команды use в SQL-запросе, т. е. функция mysql_select_db выбирает базу данных для дальнейшей работы, и все последующие SQL-запросы применяются к выбранной базе данных. Функция принимает в качестве аргументов название выбираемой базы данных database_name и дескриптор соединения resource. Функция возвращает true при успешном выполнении операции и false - в противном случае:
//Код соединения с базой данных
if (! @mysql_select_db($dbname, $dbcnx))
//Выводим предупреждение
echo("
B настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно. ");
1.5 Обработка ошибок
Если в процессе работы с MySQL возникают ошибки (например, в запросе не сбалансированы скобки или же не хватает параметров), то сообщение об ошибке и ее номер можно получить с помощью описанных далее двух функций.
Важно аккуратно и своевременно использовать эти функции, потому что иначе отладка сценариев может усложниться.
● Функция:
int mysql_errno ()
возвращает номер последней зарегистрированной ошибки. Идентификатор соединения $link_identifier можно не указывать, если за время работы сценария было установлено только одно соединение.
● Функция:
string mysql_error()
возвращает не номер, а строку, содержащую текст сообщения об ошибке. Ее удобно применять в отладочных целях. Обычно mysql_error используют вместе с конструкцией or die (), например:
@mysql_connect("localhost", "user", "password")
or die("Ошибка при подключении к базе данных: ".mysql_error());
Оператор @, как обычно, служит для подавления стандартного предупреждения, которое может возникнуть в случае ошибки.
В последних версиях РНР предупреждения в MySQL-функциях по умолчанию не регистрируются.
1.6 Автоматизация подключения к MySQL. Файл ( config.php )
Обычно на сайте существует сразу несколько скриптов, которым нужен доступ к одной и той же базе данных.
Код, ответственный за подключение к MySQL рекомендуется выделить в отдельный файл, а затем подключать с помощью функции include к нужным скриптам.
Имеет смысл помещать функции для соединения, выбора и создания базы данных в тот же файл (config.php), где объявлены переменные с именем сервера $dblocation, именем пользователя $dbuser, паролем $dbpasswd и именем базы данных $dbname:
Листинг config.php:
//config.php код файла, содержащего параметры соединения с сервером и выбора базы данных
//выводит сообщения об ошибках соединения в браузер
$dblocation = "localhost"; //Имя сервера
$dbname = "вставить имя базы" //Имя базы данных: создаваемой или уже существующей
$dbuser = "root"; //Имя пользователя базы данных
$dbpasswd = ""; //Пароль
//Осуществляем соединение с сервером базы данных
//Подавляем вывод ошибок символом @ перед вызовом функции
$dbcnx=@mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) //Если дескриптор равен 0, соединение с сервером базы данных не установлено
//Выводим предупреждение
echo("
В настоящее время сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.
");//Создаем базу данных $dbname – это может делать только суперпользователь
//Если база данных уже существует, будет некритическая ошибка
@mysql_query("CREATE DATABASE if not exists $dbname’);
//Код соединения с базой данной: осуществляем однозначный выбор только что созданной базы или уже существующей базы данных
//Подавляем вывод ошибок символом @ перед вызовом функции
if(!@mysql_select_db($dbname, $dbcnx)) //Если дескриптор равен 0, соединение с базой данных не установлено
//Выводим предупреждение
echo("
В настоящее время база данных не доступна, поэтому корректное отображение страницы невозможно.
");//Небольшая вспомогательная функция, которая выводит сообщение
//об ошибке в случае ошибки запроса к базе данных
function puterror($message)
echo("");
2. ВЫПОЛНЕНИЕ ЗАПРОСОВ К БАЗЕ ДАННЫХ
2.1 Создание таблицы. Функция CREATE TABLE:
CREATE TABLE Имя Таблицы (ИмяПоля тип, ИмяПоля тип,)
Этой командой в базе данных создается новая таблица с колонками (полями), определяемыми своими именами (ИмяПоля) и указанными типами. После создания таблицы в нее можно будет добавлять записи, состоящие из перечисленных в данной команде полей.
Листинг test_11.php. Программа, создающая новую таблицу в базе данных: