Php руководство по рнр 3 0 функции mysql
Рассмотрим основные функции PHP, применяемые для работы с MySQL сервером.
Функции соединения с сервером MySQL
Основной функцией для соединения с сервером MySQL является mysql_connect(), которая подключает скрипт к серверу баз данных MySQL и выполяет авторизацию пользователя базой данных. Синтаксис у данной функции такой:
mysql_connect ([string $hostname] [, string $user] [, sting $password]);
Как вы наверно заметили, все параметры данной функции являются необязательными, поскольку значения по умолчанию можно прописать в конфигурационном файле php.ini. Если вы хотите указать другие имя MySQL-хоста, пользователя и пароль, вы всегда можете это сделать. Параметр $hostname может быть указан в виде: хост:порт.
Функция возвращает идентификатор (типа int) соединения, вся дальнейщая работа осуществляется только через этот идентификатор. При следующем вызове функции mysql_connect() с теми же параметрами новое соединение не будет открыто, а функция возвратит идентификатор существующего соединения.
Для закрытия соединения предназначена функция mysql_close(int $connection_id).
Вообще, соединение можно и не закрывать — оно будет закрыто автоматически при завершении работы PHP скрипта. Если вы используете более одного соединения, при вызове mysql_close() нужно указать идентификатор соединения, которое вы хотите закрыть. Вообще не закрывать соединения — плохой стиль, лучше закрывать соединения с MySQL самостоятельно, а не надеясь на автоматизм PHP, хотя это ваше право.
Если вы будете использовать только одно соединение с базой данных MySQL за все время работы сценария, можно не сохранять его идентификатор и не указывать идентификатор при вызове остальных функций.
Функция mysql_connect() устанавливает обыкновенное соединение с MySQL. Однако, PHP поддерживает постоянные соединения — для этого используйте функцию mysql_pconnect(). Аргументы этой функции такие же, как и у mysql_connect().
В чем разница между постоянным соединением и обыкновенным соединением с MySQL? Постоянное соединение не закрывается после завершения работы скрипта, даже если скрипт вызвал функцию mysql_close(). Соединение привязывается к PID потомка веб сервера Apache (от имени которого он и работает) и закрывается лишь тогда, когда удаляется процесс-владелец (например, при завершении работы или перезагрузке веб-сервера Apache).
PHP работает с постоянными соединениями примерно так: при вызове функции mysql_pconnect() PHP проверяет, было ли ранее установлено соединение. Если да, то возвращается его идентификатор, а если нет, то открывается новое соединение и возвращается идентификатор.
Постоянные соединения позволяют значительно снизить нагрузку на сервер, а также повысить скорость работы PHP скриптов, использующих базы данных.
При работе с постоянными соединениями нужно следить, чтобы максимальное число клиентов Apache не преывшало максимального числа клиентов MySQL, то есть параметр MaxClient (в конфигурационном файле Apache — httpd.conf) должен быть меньше или равен параметру max_user_connection (параметр MySQL).
Функция выбора базы данных
Функция mysql_select_db (string $db [, int $id]) выбирает базу данных, с которой будет работать PHP скрипт. Если открыто не более одного соединения, можно не указывать параметр $id.
// Попытка установить соединение с MySQL:
if (!mysql_connect($server, $user, $ password)) <
echo «Ошибка подключения к серверу MySQL»;
exit;
>
// Соединились, теперь выбираем базу данных:
mysql_select_db($db);
Функции обработки ошибок
Если произойдет ошибка соединения с MySQL, то вы получите соответствующее сообщение и скрипт завершит свою работу. Это не всегда бывает удобно, прежде всего, при отладке скриптов. Поэтому, в PHP есть следующие две функции:
Первая функция возвращает номер ошибки, а вторая — сообщение об ошибке. В результате мы можем использовать следующее:
echo «ERROR «.mysql_errno().» «.mysql_error().»\n»;
Теперь вы будете знать, из-за чего произошла ошибка — вы увидите соответствующим образом оформленное сообщение.
Функции выполнения запросов к серверу баз данных
Все запросы к текущей базе данных отправляются функцией mysql_query(). Этой функции нужно передать один параметр — текст запроса. Текст запроса модет содержать пробельные символы и символы новой строки (\n). Текст должен быть составлен по правилам синтаксиса SQL. Пример запроса:
$q = mysql_query(«SELECT * FROM mytable»);
Приведенный запрос должен вернуть содержимое таблицы mytable. Результат запроса присваивается переменной $q. Результат — это набор данных, который после выполнения запроса нужно обработать определенным образом.
Функции обработки результатов запроса
Если запрос, выполненный с помощью функции mysql_query() успешно выполнился, то в результате клиент получит набор записей, который может быть обработан следующими функциями PHP:
Также можно определить количество содержащихся записей и полей в результате запроса. Функция mysql_num_rows() позволяет узнать, сколько записей содержит результат запроса:
$q = mysql_query(«SELECT * FROM mytable»);
echo «В таблице mytable «.mysql_num_rows($q).» записей»;
Запись состоит из полей (колонок). С помощью функции mysql_num_fields() можно узнать, сколько полей содержит каждая запись результата:
$q = mysql_query(«SELECT * FROM mytable»);
echo «В таблице mytable «.mysql_num_fields($q).» полей «;
У нас также есть возможность узнать значение каждого поля. Это можно сделать с помощью следующей функции:
Параметр функции $row задает номер записи, а параметр $field — имя или порядковый номер поля.
Предположим, SQL-запрос вернул следующий набор данных:
Email Name Last_Name
————————————
ivanov@mail.ru Ivan Ivanov
petrov@mail.ru Petr Petrov
Вывести это в браузер можно следующим образом:
$rows = mysql_num_rows($q);
$fields = mysql_num_fields($q);
Следует отметить, что функция mysql_result() универсальна: зная количество записей и количество полей, можно «обойти» весь результат, но в тоже время, скорость работы данной функции достаточно низка. Поэтому, для обработки больших наборов записей рекомендуется использовать функции mysql_fecth_row(), mysql_fecth_array(), и.т.д.
Функция mysql_fecth_row(int $res) получает сразу всю строку, соответствующую текущей записи результата $res. Каждый следующий вызов функции перемещает указатель запроса на следующую позицию (как при работе с файлами) и получает следующую запись. Если более нет записей, то функция возвращает FALSE. Пример использования данной функции:
$q = mysql_query(«SELECT * FROM mytable WHERE month=\»$db_m\» AND day=\»$db_d\»);
for ($c=0; $c
Использовать функцию mysql_fecth_row() не всегда удобно, так как значения всех полей одной записи находятся все в одной строке. Удобнее использовать функцию mysql_fetch_array(), которая возвращает ассоциативный массив, ключами которого будут имена полей.
Функция mysql_fecth_array(int $res [, int $result_type]) возвращает не ассоциативный массив, а массив, заданный необязательным параметром $result_type, который может принимать следующие значения:
- MYSQL_ASSOC — возвращает ассоциативный массив;
- MYSQL_NUM -возвращает массив с числовыми индексами, как в функции mysql_fecth_row();
- MYSQL_BOTH — возвращает массив с двойными индексами, то есть вы можете работать с ним, как с ассоциативным массивом и как со списком (MYSQL_BOTH — это значение по умолчанию для параметра $result_type.
В PHP есть функция, возвращающая ассоциативный массив с одним индексом:
mysql_fetch_assoc(int $res);
Фактически, данная функция является синонимом для mysql_fetch_array($res, MYSQL_ASSOC);
Пример использования функции mysql_fecth_array():
$q = mysql_query(«SELECT * FROM mytable WHERE month=\»$db_m\» AND day=\»$db_d\»);
for ($c=0; $c
Как видно, использовать функцию mysql_fetch_array() намного удобнее, чем mysql_fetch_row().
Функции получения информации о результатах SQL-запросов
PHP предоставляет еще несколько полезных функций, которые позволяют узнать информацию о результах SQL-запросов.
- Функция mysql_field_name(int $result, int $offset) возвращает имя поля, находящегося в результате $result с номером $offset (нумерация начинается с 0). Другими словами, функция возвращает имя поля с номером $offset.
- Функция mysql_field_type(int $result, int $offset) возвращает тип поля с номером $offset в результате $result (номер задается относительно результата, а не таблицы);
- Функция mysql_field_flags(int $result, int $offset) возвращает пречисленные через пробел флаги (модификаторы), которые имеются у поля с номером $offset. Перечислим все поддерживаемые MySQL флаги:
id | name | age | salary |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Итак, у нас есть таблица с работниками фирмы, в которой указаны их имена, возрасты и зарплаты (в $). Далее мы будем работать с этой таблицей.
Тестируем работоспособность
Прежде чем начать работу, следует протестировать работоспособность — попробуем сделать какой-нибудь запрос к нашей базе.
Просто скопируйте этот код и запустите его у себя:
Если var_dump($result) вернет resource, то все работает, если же null – то возникли какие-то проблемы. в новых версиях PHP в $result будет лежать объект с данными (всегда будет непустой). Если обработать его через mysqli_fetch_assoc будет или результат или null (про mysqli_fetch_assoc см ниже или видео https://youtu.be/J8GFuyA_k_8 , которое уже было выше в пункте «Устанавливаем соединение»)
В таком случае проверьте все еще раз, уберите последовательно все ошибки PHP, если таковые есть.
Как достать результат
После того, как мы сделали запрос к базе, в переменной $result будет лежать результат этого действия.
Однако лежит он не в той форме, которая нам нужна в PHP, а в той форме, в которой его прислала нам база.
Достать результат в нормальном виде (в массиве) можно с помощью следующего кода:
Как работает последняя строка?
Функция mysqli_fetch_assoc считывает последовательно каждую строку результата, который прислала нам база.
В цикле for мы считываем построчно результат из базы.
Когда цикл дойдет до последней строки — mysqli_fetch_assoc вернет false и цикл for закончит свою работу.
А результат из БД будет лежать в нормальном виде в массиве $data.
Стандартные функции PHP для работы с MySQL
Читайте также:
- I период работы 1 страница
- I период работы 2 страница
- I. 5. СТРУКТУРА МЕТОДИЧЕСКИХ РЕКОМЕНДАЦИЙ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ПОД РУКОВОДСТВОМ ПРЕПОДАВАТЕЛЯ
- I. Лабораторные работы по базе данных Access
- I. Общие принципы подготовки и требования к оформлению курсовой работы
- I. Понятие, структура и функции религии. Социологические теории религии.
- I. Структура курсовой работы
- II. Алгоритмы выполнения внеаудиторной самостоятельной работы.
- II. Выполнение дипломной работы
- II. Порядок выполнения курсовой работы
- II. ПОРЯДОК ПОДГОТОВКИ КУРСОВОЙ РАБОТЫ
- II. Ход работы.
Настройка MySQL
После успешной установки сервер MySQL необходимо настроить. Процесс настройки в основном состоит из создания новых баз данных и редактирования таблиц привилегий MySQL. Таблицы привилегий управляют доступом к базам данных MySQL. Правильная настройка таблиц играет чрезвычайно важную роль в безопасности ваших баз данных, поэтому перед запуском сайта в рабочем режиме необходимо полностью освоить систему привилегий.
На первый взгляд, таблицы привилегий MySQL выглядят устрашающе, но если в них как следует разобраться, дальнейшее сопровождение становится очень простой задачей. Полное описание таблиц привилегий выходит за рамки этой книги. Впрочем, в Web существует немало ресурсов, предназначенных для помощи начинающим пользователям MySQL. За дополнительной информацией обращайтесь на сайт MySQL ( http://www.mysql.com ).
После успешной установки и настройки пакета MySQL можно начинать эксперименты с базами данных в среде Web! Именно этой теме и посвящен следующий раздел. Начнем с изучения поддержки MySQL в PHP.
Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции PHP, при помощи которых вы сможете легко организовать взаимодействие сценариев PHP с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:
- Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.
- Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.
- Обработать запросы к выбранной базе (или базам).
- После завершения обработки запросов закрыть соединение с сервером баз данных.
В примерах этого раздела используются таблицы products, customers и orders (см. рис. 11.1). Если вы захотите самостоятельно проверить все примеры, создайте эти таблицы или скопируйте страницу с описанием структуры, чтобы вам не приходилось постоянно листать книгу.
Итак, начнем с самого начала — то есть с подключения к серверу MySQL.
mysql_connect()
Функция mysql_connect( ) устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect( ):
int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль])
В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры — номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.
Пример открытия соединения с MySQL:
@mysql_connect(» local host», «web», «4tf9zzzf») or die(«Could not connect to MySQL server!»);
В данном примере localhost — имя компьютера, web— имя пользователя, а 4tf9zzzf — пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, — они заменяются сообщением, указанным при вызове die( ). Обратите внимание: значение, возвращаемое при вызове rnysql_connect( ), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect( ), чтобы адресовать последующие команды нужному серверу MySQL. Пример:
Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения.
Функция mysql_pconnect( ) обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect( ) вместо mysql_connect( ) для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect( ) в точности совпадает c mysql_connect( ).
mysql_select_db( )
После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db( ). Синтаксис функции mysql_select_db( ):
int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения])
Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор
которой возвращается функцией mysql_select_db( ). Обратите внимание: параметр
идентификатор_соединения необязателен лишь при одном открытом соединении с
сервером MySQL. При наличии нескольких открытых соединений этот параметр
должен указываться. Пример выбора базы данных функцией mysql_select_db( ):
Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняявыбранная база данных.
mysql_close( )
После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close( ):
int mysql_close ([int идентификатор_соединения])
Пример использования mysql_close( ):
В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова mysql_close( ) существует лишь одно открытое соединение с сервером.
Соединения, открытые функцией mysql_pconnect( ), закрывать не обязательно.
mysql_query( )
Функция mysql_query( ) обеспечивает интерфейс для обращения с запросами к базам
данных. Синтаксис функции mysql_query( ):
int mysql_query (string запрос [, int идентификатор_соединения])
Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соедине-ния, либо, при отсутствии параметра, последнему открытому соединению.
Неопытные программисты часто ошибочно думают, что функция mysql_query( ) возвращает результаты обработки запроса. Это не так — в зависимости от типа запроса вызов mysql_query( ) может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result( ) для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE. Функция mysql_result( ) описана в одном из следующих разделов. Количество записей, участвующих в запросе, определяется при помощи функции mysql_num_rows( ). Эта функция также описана далее.
Учитывая сказанное, я приведу примеры использования mysql_query( ) лишь после описания функций mysql_result( ) и mysql_affected_rows( ).
Если вас беспокоит то, что при обработке запросов расходуется слишком много памя-ти, вызовите стандартную функцию PHP mysql_free_result. При вызове ей передается идентификатор результата, возвращаемый mysql_query( ). Функция mysql_free_result( ) освобождает всю память, связанную с данным запросом.
mysqLaff ected_rows ( )
Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows( ). Синтаксис функции:
int mysql_affected_rows ([int идентификатор_соединения])
Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws( ) пытается использовать последнее открытое соединение. Пример:
// Выполнить запрос $result = mysql_query($query);
// Определить количество обновленных записей
print «Total row updated; «.mysql_affected_rows( );
При выполнении этого фрагмента будет выведен следующий результат:
Total row updated: 1
Функция mysql_affected_rows( ) не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows( ), описанная в следующем разделе.
В одной специфической ситуации функция mysql_affected_rows( ) работает с ошибкой. При выполнении команды DELETE без секции WHEREmysql_affected_rows( ) всегда возвращает 0.
mysql_num_rows( )
Функция mysql_num_rows( ) определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows( ):
int mysql_num_rows(int результат)
Пример использования mysql_num_rows( ):
Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:
Total rows selected: 1
mysql_result( )
Функция mysql_result() используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():
int mysql_result (int идентификатор_результата, int запись [. mixed поле»]’)
В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. Наконец, в необязательном параметре поле могут передаваться:
- смещение поля в таблице;
- имя поля;
- имя поля в формате имя_поля_имя_тдблицы.
В листинге 11.1 используется база данных, изображенная на рис. 11.1.
Листинг 11.1. Выборка и форматирование данных в базе данных MySQL
В результате выполнения этого примера с данными, изображенными на рис. 11.1, будет получен следующий результат:
Листинг 11.2. Результат выполнения листинга 11.1
Функция mysql_result( ) удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, — а именно, функции mysql_fetch_row( ) и mysql_fetch_array( ). Эти функции описаны в следующих разделах.
mysql_fetch_row()
Обычно гораздо удобнее сразу присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0), нежели многократно вызывать mysql_result( ) для получения отдельных полей. Задача решается функцией mysql_fetch_row( ), имеющей следующий синтаксис:
array mysql_fetch_row (int результат)
Использование функции list( ) в сочетании с mysql_fetch_row( ) позволяет сэкономить несколько команд, необходимых при использовании mysql_result( ). В листинге 11.3 приведен код листинга 11.1, переписанный с использованием list( ) и mysql_fetch_row( ).
Листинг 11.3. Выборка данных функцией mysql_fetch_row( )
Листинг 11.3 выдает тот же результат, что и листинг 11.1, но использует при этом меньшее количество команд.
my sq l_f etch_array ( )
Функция mysql_fetch_array( ) аналогична mysql_fetch_row( ), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве. Впрочем, вы можете выбрать тип индексации (ассоциативная, числовая или комбинированная). Синтаксис функции mysql_fetch_array( ):
array mysql_fetch_array (int идентификатор результата [, тип_индексации])
В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Необязательный параметр тип_индексации принимает одно из следующих значений:
- MYSQL_ASSOC — функция mysql_fetch_array( ) возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;
- MYSQL_NUM — функция mysql_fetch_array( ) возвращает массив с числовой индексацией;
- MYSQL_BOTH — к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.
Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array( ), возвращающая ассоциативный массив полей.
Листинг 11.4. Выборка данных функцией mysql_fetch_array( )
Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3.
Того, что сейчас вы знаете о функциональных возможностях MySQL в PHP, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы.
Дата добавления: 2015-05-10 ; Просмотров: 352 ; Нарушение авторских прав? ;
Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет
p0vidl0.info
Кодинг, админинг и прочие развлечения
PHP PDO — работаем с базами данных правильно
Термин PDO является сокращением понятия PHP Data Objects. Как можно судить по названию, эта технология позволяет работать с содержимым базы данных через объекты.
Почему не myqli или mysql?
Чаще всего, в отношении новых технологий, встает вопрос их преимуществ перед старыми-добрыми и проверенными инструментами, а также, перевода на них текущих и старых проектов.
Объектная ориентированность PDO
PHP развивается очень активно и стремится стать одним из лучших инструментов для быстрой разработки веб приложений как массового, так и корпоративного уровня.
Говоря о PHP, будем подразумевать современный объектно-ориентированный PHP, позволяющий писать универсальный код, удобный для тестирования и повторного использования.
Использование PDO позволяет вынести работу с базой данных на объектно-ориентированный уровень и улучшить переносимость кода. На самом деле, использование PDO не так сложно, как можно было бы подумать.
Абстракция
Представим, что мы уже продолжительное время разрабатываем приложение, с использованием MySQL. И вот, в один прекрасный момент, появляется необходимость заменить MySQL на PostgreSQL.
Как минимум, нам придется заменить все вызовы mysqli_connect() (mysql_connect()) на pg_connect() и, по аналогии, другие функции, используемые для запроса и обработки данных.
При использовании PDO, мы ограничимся изменением нескольких параметров в файлах конфигурации.
Связывание параметров
Использование связанных параметров предоставляет большую гибкость в составлении запросов и позволяет улучшить защиту от SQL инъекций.
Получение данных в виде объектов
Те, кто уже использует ORM (object-relational mapping — объектно-реляционное отображение данных), например, Doctrine, знают удобство представления данных из таблиц БД в виде объектов. PDO позволяет получать данные в виде объектов и без использования ORM.
Расширение mysql больше не поддерживается
Поддержка расширения mysql окончательно удалена из нового PHP 7. Если вы планируете переносить проект на новую версию PHP, уже сейчас следует использовать в нем, как минимум, mysqli. Конечно же, лучше начинать использовать PDO, если вы еще не сделали этого.
Мне кажется, что этих причин достаточно для склонения весов в сторону использования PDO. Тем более, не нужно ничего дополнительно устанавливать.
Проверяем наличие PDO в системе
Версии PHP 5.5 и выше, чаще всего, уже содержать расширение для работы с PDO. Для проверки достаточно выполнить в консоли простую команду:
Либо найти информацию в выводе встроенной PHP функции phpinfo() . Создадим для этого простой скрипт:
Теперь откроем его в любом браузере и найдем нужные данные поиском по строке PDO.
Знакомимся с PDO
Процесс работы с PDO не слишком отличается от традиционного. В общем случае, процесс использования PDO выглядит так:
- Подключение к базе данных;
- По необходимости, подготовка запроса и связывание параметров;
- Выполнение запроса.
Подключение к базе данных
Для подключения к базе данных нужно создать новый объект PDO и передать ему имя источника данных, так же известного как DSN.
В общем случае, DSN состоит из имени драйвера, отделенного двоеточием от строки подключения, специфичной для каждого драйвера PDO.
Для MySQL, подключение выполняется так:
В данном случае, DSN содержит имя драйвера mysql, указание хоста (возможен формат host=ИМЯ_ХОСТА:ПОРТ), имя базы данных, кодировка, имя пользователя MySQL и его пароль.
Запросы
В отличие от mysqli_query(), в PDO есть два типа запросов:
- Возвращающие результат (select, show);
- Не возвращающие результат (insert, detele и другие).
Первым делом, рассмотрим второй вариант.
Выполнение запросов
Рассмотрим пример выполнения запроса на примере insert.
Конечно же, данный запрос возвращает количество затронутых строк и увидеть его можно следующим образом.
Получение результатов запроса
В случае использования mysqli_query() , код мог бы быть следующим.
Для PDO, код будет проще и лаконичнее.
Режимы получения данных
Как и в mysqli, PDO позволяет получать данные в разных режимах. Для определения режима, класс PDO содержит соответствующие константы.
- PDO::FETCH_ASSOC — возвращает массив, индексированный по имени столбца в таблице базы данных;
- PDO::FETCH_NUM — возвращает массив, индексированный по номеру столбца;
- PDO::FETCH_OBJ — возвращает анонимный объект с именами свойств, соответствующими именам столбцов. Например, $row-> >PDO::FETCH_CLASS — возвращает новый экземпляр класса, со значениями свойств, соответствующими данным из строки таблицы. В случае, если указан параметр PDO::FETCH_CLASSTYPE (например PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE ), имя класса будет определено из значения первого столбца.
Примечание: это не полный список, все возможные константы и варианты их комбинации доступны в документации.
Пример получения ассоциативного массива:
Примечание: Рекомендуется всегда указывать режим выборки, так как режим PDO::FETCH_BOTH потребует вдвое больше памяти — фактически, будут созданы два массива, ассоциативный и обычный.
Рассмотрим использование режима выборки PDO::FETCH_CLASS . Создадим класс User :
Теперь выберем данные и отобразим данные при помощи методов класса:
Подготовленные запросы и связывание параметров
Для понимания сути и всех преимуществ связывания параметров нужно более подробно рассмотреть механизмы PDO. При вызове $statement->query() в коде выше, PDO подготовит запрос, выполнит его и вернет результат.
При вызове $connection->prepare() создается подготовленный запрос. Подготовленные запросы — это способность системы управления базами данных получить шаблон запроса, скомпилировать его и выполнить после получения значений переменных, использованных в шаблоне. Похожим образом работают шаблонизаторы Smarty и Twig.
При вызове $statement->execute() передаются значения для подстановки в шаблон запроса и СУБД выполняет запрос. Это действие аналогично вызову функции шаблонизатора render() .
Пример использования подготовленных запросов в PHP PDO:
В коде выше подготовлен запрос выборки записи с полем id равным значению, которое будет подставлено вместо :id . На данном этапе СУБД выполнит анализ и компиляцию запроса, возможно с использованием кеширования (зависит от настроек).
Теперь нужно передать недостающий параметр и выполнить запрос:
И получить данные:
Преимущества использования связанных параметров
Возможно, после рассмотрения механизма работы подготовленных запросов и связанных параметров, преимущества их использования стали очевидными.
PDO предоставляет удобную возможность экранирования пользовательских данных, например, такой код больше не нужен:
Вместо этого, теперь целесообразно делать так:
Можно, даже, еще укоротить код, используя нумерованные параметры вместо именованных:
В тоже время, использование подготовленных запросов позволяет улучшить производительность при многократном использовании запроса по одному шаблону. Пример выборки пяти случайных пользователей из базы данных:
При вызове метода prepare() , СУБД проведет анализ и скомпилирует запрос, при необходимости использует кеширование. Позже, в цикле for , происходит только выборка данных с указанным параметром. Такой подход позволяет быстрее получить данные, уменьшив время работы приложения.
При получении общего количества пользователей в базе данных был использован метод fetchColumn() . Этот метод позволяет получить значение одного столбца и является полезным при получении скалярных значений, таких как количество, сумма, максимально или минимальное значения.
Связанные значения и оператор IN
Часто, при начале работы с PDO, возникают трудности с оператором IN . Например, представим, что пользователь вводит несколько имен, разделенных запятыми. Пользовательский ввод хранится в переменной $names :
НЕ корректный код:
Этот код не будет работать потому, что параметр в шаблоне представлен скалярным значением (например, целое число или строка).
Правильным подходом будет создание специальной строки:
Как видно из код, в строке 2 создаем массив размером как $names и заполняем его символами ? , а затем, формируем из него строку, содержащую элементы массива, разделенные запятыми. В результате получается строка наподобие . . При передаче массива $names в методе execute() , первый элемент массива будет сопоставлен первому знаку вопроса, второй второму и так далее.
Типизированные связанные параметры
Рассмотренные выше примеры были намеренно упрощены и не содержали указания типов параметров. Однако, в реальном коде лучше использовать указание типов.
- Читабельность. Для читающих код проще будет его понять;
- Обслуживаемость. Знание типов передаваемых параметров упрощает отладку кода. Например, при передаче строкового значения в параметр, который ожидает целое число, вызовет соответствующую ошибку;
- Ускорение. Явное указание типа параметра избавляет СУБД от необходимости приведения типов.
Для явного указания типов параметров лучше использовать метод bindValue() . Например,
В коде выше параметр определен в вызове метода bindValue() , а метод execute() вызывается без параметров.
Примечание: В примере выше, первым параметром метода bindValue() , является 1 . При использовании именованных параметров, первым параметром передается соответствующее имя переменной в шаблоне. В противном случае. первым параметром передается порядковый номер переменной в шаблоне. Обратите внимание, что нумерация начинается с 1, а не с !
Заключение
PHP развивается, программисты не должны отставать. Использование расширения PDO позволяет писать более краткий, лаконичный, быстрый и безопасный код. Почему бы не начать использовать его уже сейчас?
CakePHP 3.0 — Использование функций MySQL в объектах
У меня возникли проблемы с использованием функций MySQL с объектами базы данных CakePHP. Несколько упоминаний, которые я нашел в моих поисках, были только для предыдущих версий CakePHP и больше не работают.
Кроме того, использование функций PHP для генерации даты не является вариантом. Это должно быть сделано на сервере MySQL.
Вот пример моего кода:
Это приводит к значению datetime по умолчанию 0000-00-00 00:00:00 в поле updated_on в строке в моей базе данных вместо того, чтобы заполнять текущую временную метку.
Бонусные баллы. Если бы я хотел добавить поле created_on , как бы я обрабатывал это с Entities? Как я могу установить created_on только один раз, когда запись сначала вставлена, а не на каждое обновление?
Как всегда, я очень ценю каждый комментарий и ответ!
Надлежащая архитектура
Во-первых, я бы не делал никаких бизнес-логических операций внутри объекта. Особенно не помещая код внутри объекта. Если вы действительно думаете, что вы должны сделать это там, тогда вызовите хотя бы просто метод таблицы и инкапсулируйте туда логику. Сущность, как полагают, является объектом данных, не более того. Таким образом, операции сохранения внутри объекта инвертируют архитектуру. Это должно быть сделано внутри обратного вызова beforeSave() модели.
Почему требуется NOW() vs phps date()?
Кроме того, использование функций PHP для генерации даты не является вариантом. Это должно быть сделано на сервере MySQL.
Зачем? Я не вижу причины не делать этого. Различные настройки часового пояса или что-то еще? Представление? СЕЙЧАС(), вероятно, медленнее, если у вас много записей. Ну, просто сделайте свой часовой пояс по умолчанию для php, независимо от того, что использует БД? Затем вы можете просто использовать поведение Timestamp. Я рад узнать что-то новое о том, что вы не используете NOW() и используете date(), но до сих пор я абсолютно не хочу использовать NOW().
Использование NOW() с CakePHP 3 ORM
Если бы вы прочитали руководство, вы наверняка заметили бы это:
CakePHPs ORM предлагает абстракцию для некоторых часто используемых функций SQL. Использование абстракции позволяет ORM выбирать специфичную для платформы реализацию функции, которую вы хотите. Например, concat реализуется по-разному в MySQL, PostgreSQL и SQL Server. Использование абстракции позволяет переносить ваш код:
В документации также есть пример:
Далее следуют список поддерживаемых функций, которые включают:
now() Выберите «время» или «дату» в качестве аргумента, позволяющего получить либо текущее время, либо текущую дату.
Если вы продолжаете читать, это скажет вам
В дополнение к вышеуказанным функциям метод func() может использоваться для создания любой общей функции SQL, такой как year, date_format, convert и т.д. Например:
Мне еще не нужно было использовать сейчас(), но, основываясь на приведенной выше информации, я предполагаю, что это будет:
Затем просто сохраните это значение в БД. Я думаю, что в модульных тестах рамки будет показан пример того, как ее использовать.
Установка даты для создания
Бонусные баллы. Если бы я хотел добавить поле created_on, как бы я обрабатывал это с Entities? Как я могу установить created_on только один раз, когда запись сначала вставлена, а не на каждое обновление?
$entity->isNew() позволит вам проверить, является ли объект новым или нет, и действовать соответствующим образом. Если новый, установите метку времени.
Нижняя линия
Вы повторно изобретаете поведение Timestamp в архитектурно неправильном месте. Это зависит от вас, чтобы сделать это правильно или нет.
PHP и MySQL
Основы MySQL: часть 1.
Что такое MySQL
MySQL — это один из типов реляционных баз данных. MySQL представляет собой сервер, к которому могут подключаться различные пользователи.
Вы когда к интернету подключаетесь, вы же вводите логин и пароль, а также имя сервера к которому подключаетесь? При работе с MySQL используется такая же система.
Ещё один момент: что такое реляционная база данных? Реляционная — значит основанная на таблицах. Знаменитый редактор электронных таблиц Excel от Microsoft фактически является редактором реляционных баз данных.
Подключение к серверу MySQL
Для подключения к серверу MySQL в PHP используется функция mysqli_connect() . Данная функция получает три аргумента: имя сервера, имя пользователя и пароль.
Функция mysqli_connect() возвращает идентификатор подключения, его сохраняют в переменной и в дальнейшем используют для работы с базами данных.
Код подключения к серверу MySQL:
В данном случае я работаю на локальном компьютере на Denwere, поэтому имя хоста localhost, имя пользователя root, а пароля нет.
Соединение также нужно закрыть, после завершения работы с MySQL. Для закрытия соединения используется функция mysqli_close() . Расширяем пример:
Тут мы проверели идентификатор подключения на истинность, если с нашим подключением что-то не так, то и программа выполняться не будет, функция die() остановит её выполнение и выведет в браузер сообщение об ошибке.
Ошибки подключения
Для проверки подключения используются следующие функции:
- mysqli_connect_errno() — возвращает код ошибки последней попытки соединения. При отсутствие ошибок возвращает ноль.
- mysqli_connect_error() — возвращает описание последней ошибки подключения к серверу MySQL.
Функция mysqli_get_host_info() возвращает строку, содержащую тип используемого соединения.
Также обратите внимание, при помощи команды define я все параметры подключения сохранил в константах. Когда вы будете писать большие проекты, и подключатся к серверу MySQL будут много файлов, то удобно хранить параметры соединения в отдельном файле и вставлять его при помощи функции include или require .
Выбор базы данных
На сервере MySQL может быть несколько баз данных. Первым делом нам нужно выбрать для работы нужную нам базу. В PHP для этого в функции mysqli_connect() есть ещё один параметр — имя базы данных.
Я создал у себя на компьютере через phpMyAdmin с именем tester. Подключаемся к ней:
Итак, мы выбрали для работы базу данных. Но как нам известно, реляционная база данных состоит из таблиц, а в нашей базе данных таблиц пока что нет. База данных создаётся пустая, без таблиц. Таблицы в неё нужно добавить отдельно. Вот давайте добавим в неё таблицу средствами PHP.
Создаём таблицу
В названии баз данных MySQL часть SQL обозначает Structured Query Language, что переводится как структурированный язык запросов. На языке SQL мы будем писать запросы и из программы PHP посылать их серверу MySQL.
Чтобы создать таблицу нам просто нужно указать команду CREATE TABLE . Давайте создадим таблицу с именем users в столбцах которой будут храниться логины (столбец login) и пароли (столбец password) пользователей.
В этом коде мы присвоили переменной $query строку текста, которая представляет собой запрос SQL. Мы создаём таблицу с именем users, которая содержит два столбца login и password, у обоих тип данных VARCHAR(20). О типах данных мы поговорим позже, сейчас только отмечу, что VARCHAR(20) — это строка максимальной длины 20 символов.
Чтобы отправить наш запрос на сервер MySQL мы используем PHP функцию mysqli_query() . Эта функция возвращает положительное число, если операция прошла успешно и false, если произошла ошибка (синтаксис запроса ошибочный или у программы нет прав на выполнение запроса).
Запрос SQL не обязательно записывать в переменную, его можно сразу записать как аргумент функции mysql_query() . Просто так код выллядит читабельней.
У этого скрипта есть один недостаток — он ничего не выводит в браузер. Давайте добавим сообщение:
Если мы повторно запустим этот скрипт на выполнение, то увидим в браузере сообщение: «Таблица не создана». Дело в том, что таблица была создана при первом запуске, а повторно невозможно создать таблицу с таким же именем. Мы столкнулись с ситуацией возникновения ошибки, значит настало время поговорить об обработке ошибок при работе с MySQL.
Обработка ошибок
При отладке программы нам может понадобиться точная информация о ошибке. Когда в MySQL происходит ошибка, то сервер базы данных устанавливает номер ошибки и строку с её описанием. Для доступа к этим данным в PHP есть специальные функции.
- mysqli_errno() — возвращает номер ошибки.
- mysqli_error() — возвращает строку с описанием ошибки.
Теперь давайте добавим функцию mysql_error() в наш скрипт:
Теперь наш скрипт вернёт в браузер строку: «Таблица не создана: Table ‘users’ already exists».
Удаление таблицы
Итак, мы сейчас имеем не нужную нам таблицу. Пришло время научиться удалять таблицы из базы данных.
Для удаления таблицы используется команда DROP TABLE , за которой следует имя таблицы.
Итоги
Итак, мы освоили основы MySQL. Что мы научились делать:
- Подключаться к базе данных MySQL при помощи функции mysqli_connect() .
- Закрывать соединение с сервером MySQL при помощи функции mysqli_close() .
- Отправлять SQL запросы серверу MySQL при помощи функции mysqli_query() .
- Мы узнали SQL запрос создания таблицы: create table.
- Мы узнали SQL запрос удаления таблицы: drop table.
- Мы узнали как обрабатывать ошибки при помощи функций mysqli_errno() и mysqli_error() .
Теперь нужно идти дальше. В следующем уроке мы будем расширять наши знания в области запросов к MySQL. Мы научимся добавлять строки в таблицу, обновлять данные в уже существующих строках и проводить ещё некоторые операции.
Потом мы подробно рассмотрим типы данных MySQL.
Далее мы научимся извлекать данные из таблиц MySQL, это важный урок, но не спешите его читать, сначала освойте все предыдущие уроки.