Глава 3. Улучшенное расширение MySQL
Расширение mysqli позволяет вам получать
доступ к функциональности, обеспеченной MySQL 4.1 и выше. Больше информации о
MySQL Database server есть на
http://www.mysql.com/.
Обзор программного обеспечения, доступного для использования MySQL из
PHP есть в разделе 3.1.
Документация для MySQL может быть найдена на
http://dev.mysql.com/doc/.
Части этой документации включены из руководства MySQL с
разрешения Oracle Corporation.
Примеры используют базу данных
world или sakila, которые есть в свободном доступе.
3.1. Обзор
Эта секция обеспечивает введение в варианты, доступные вам, разрабатывая
приложение PHP, которое должно взаимодействовать с базой данных MySQL.
Что такое API?
Application Programming Interface, он же API, определяет классы, методы,
функции и переменные, которые должно будет вызвать ваше приложение, чтобы
выполнить желаемую задачу. В случае приложений PHP, которые должны общаться с
базами данных, необходимый API обычно выставляется через расширения PHP.
API может быть процедурным или объектно-ориентированным.
С процедурным API вы вызываете функции, чтобы выполнить задачи, с
объектно-ориентированным API, вы создаете экземпляр класса
и затем вызываете методы на полученных объектах. Последний вариант обычно
предпочтительный, поскольку это более современно и приводит к
лучше организованному коду.
Сочиняя приложения PHP, которые должны соединиться с сервером MySQL, есть
несколько доступных вариантов API. Этот документ обсуждает то, что доступно и
как выбрать лучшее решение для вашего приложения.
Что такое Connector?
В документации MySQL термин
connector
относится к части программного обеспечения, которое позволяет вашему
приложению соединиться с сервером базы данных MySQL.
MySQL обеспечивает соединители для множества языков, включая PHP.
Если ваше приложение PHP должно общаться с сервером базы данных,
необходимо будет написать код PHP, чтобы выполнить такие действия как
соединение с сервером базы данных, запрос базы данных и другие связанные с
базой данных функции. Требуется программное обеспечение, чтобы обеспечивать
API, который ваше приложение будет использовать, а также обращаться со связью
между вашим приложением и сервером базы данных, возможно пользуясь другими
промежуточными библиотеками в случае необходимости.
Это программное обеспечение известно в общем как соединитель, поскольку оно
позволяет вашему приложению соединяться
с сервером базы данных.
Что такое драйвер?
Драйвер это часть программного обеспечения, разработанного, чтобы общаться
с определенным типом сервера базы данных. Драйвер может также вызвать
библиотеку, такую как MySQL Client Library или MySQL Native Driver.
Эти библиотеки осуществляют протокол низкого уровня, используемый, чтобы
общаться с сервером базы данных MySQL.
Например уровень абстракции базы данных
PHP Data Objects (PDO)
может использовать одного из нескольких определенных для базы данных
драйверов. Один из них является PDO MYSQL driver,
который позволяет ему взаимодействовать с сервером MySQL.
Иногда люди используют термины "соединитель" и "драйвер"
попеременно, это может быть запутывающим. В MySQL-связанной документации
термин драйвер резервируется для программного
обеспечения, которое обеспечивает определенную для базы данных
часть пакета соединителя.
Что такое расширение?
В документации PHP вы столкнетесь с другим термином
"расширение". Код PHP состоит
из ядра с дополнительными расширениями базовой функциональности.
MySQL-связанные расширения PHP, такие как mysqli
и mysql , осуществляются, используя
дополнительную структуру PHP.
Расширение, как правило, выставляет API PHP программисту, чтобы позволить
его средствам использоваться программно. Однако некоторые расширения, которые
используют дополнительную структуру PHP, не выставляют API PHP программисту.
Расширение PDO MySQL, например, не выставляет API PHP программисту, но
предоставляет интерфейс слою PDO выше него.
Термины "API" и "расширение" не должны быть применены, чтобы означать то
же самое, так как расширение может не обязательно выставить API программисту.
Каковы главные предложения API PHP
для использования MySQL?
Есть три главных варианта API, рассматривая соединение с сервером
базы данных MySQL:
Расширение PHP MySQL
Расширение PHP mysqli
PHP Data Objects (PDO)
У каждого есть его собственные преимущества и недостатки.
Следующее обсуждение стремится давать краткое введение в ключевые
аспекты каждого API.
Что такое расширение PHP MySQL?
Это оригинальное расширение, разработанное, чтобы позволить вам
разрабатывать приложения PHP, которые взаимодействуют с базой данных MySQL.
Расширение mysql обеспечивает процедурный
интерфейс и предназначается для использования только с версиями MySQL, более
старыми, чем 4.1.3. Это расширение может использоваться с версиями MySQL
4.1.3 или более новыми, но не все последние особенности сервера
MySQL будут доступны.
При использовании версии MySQL 4.1.3 или позже
строго
рекомендуется, чтобы вы использовали расширение
mysqli .
Исходный код расширения mysql расположен в
дополнительном подкаталоге ext/mysql .
Для получения дополнительной информации о расширении
mysql см.
главу 6.
Что такое расширение PHP mysqli?
Расширение mysqli
или как это иногда известно улучшенное
расширение MySQL, было развито, чтобы использовать новые особенности в
версиях MySQL 4.1.3 и более новых.
Расширение mysqli
включено в версии PHP 5 и позже.
Расширение mysqli
обладает многими преимуществами, ключевыми улучшениями по сравнению с
расширением mysql , включая:
Объектно-ориентированный интерфейс
Поддержка подготовленных запросов
Поддержка мультизапросов
Поддержка транзакций
Расширенные возможности отладки
Поддержка встраиваемого сервера
При использовании версии MySQL 4.1.3 или позже
строго
рекомендуется, чтобы вы использовали это расширение.
Как и объектно-ориентированный интерфейс, расширение также
обеспечивает процедурный интерфейс.
Расширение mysqli строится,
используя дополнительную структуру PHP, исходный код расположен в каталоге
ext/mysqli .
Для получения дополнительной информации о расширении
mysqli см.
главу 3.
Что такое PDO?
PHP Data Objects или PDO являются уровнем абстракции базы данных
определенно для приложений PHP. PDO обеспечивает последовательный API для
вашего приложения PHP, независимо от типа сервера базы данных, с которым
соединится ваше приложение. В теории, если вы используете API PDO, вы могли
бы переключить сервер базы данных, который вы использовали, например, с
Firebird на MySQL, и должны внести только незначительные изменения в
ваш код PHP.
Другие примеры уровней абстракции базы данных включают JDBC для
Java-приложений и DBI для Perl.
В то время как у PDO есть свои преимущества, такие как чистый, простой,
портативный API, его главный недостаток то, что он не позволяет вам
использовать все расширенные функции, которые доступны в последних версиях
сервера MySQL. Например, PDO не позволяет вам использовать поддержку
MySQL Multiple Statements.
PDO осуществляется, используя дополнительную структуру PHP, ее исходный
код расположен в каталоге ext/pdo .
Для получения дополнительной информации о PDO см.
http://www.php.net/book.pdo.
Что такое PDO MYSQL driver?
PDO MYSQL driver это не API по крайней мере с точки зрения
PHP-программиста. На самом деле PDO MYSQL сидит в слое ниже самого PDO и
обеспечивает MySQL-определенную функциональность. Программист все еще
вызывает API PDO, но PDO использует PDO MYSQL, чтобы выполнить
связь с сервером MySQL.
PDO MYSQL является одним из нескольких доступных драйверов PDO.
Другие доступные драйверы PDO включают драйверы для серверов баз данных
Firebird и PostgreSQL.
PDO MYSQL driver осуществляется, используя дополнительную структуру PHP.
Его исходный код расположен в каталоге
ext/pdo_mysql .
Это не выставляет API PHP-программисту.
Для получения дополнительной информации о PDO MYSQL driver, см.
главу 4.
Что такое PHP MySQL Native Driver?
Чтобы общаться с сервером базы данных MySQL, расширения
mysql , mysqli и
PDO MYSQL driver пользуются библиотекой низкого уровня, которая осуществляет
необходимый протокол. В прошлом единственная доступная библиотека была MySQL
Client Library, она же libmysqlclient .
Однако интерфейс, представленный
libmysqlclient ,
не был оптимизирован для связи с PHP, так как
libmysqlclient была первоначально разработана
для C. Поэтому MySQL Native Driver, mysqlnd , был
развит как альтернатива libmysqlclient для PHP.
Расширения mysql ,
mysqli и PDO MySQL driver
могут индивидуально формироваться, чтобы использовать
libmysqlclient или
mysqlnd .
Так как mysqlnd специально разработано, чтобы
быть использованным в системе PHP, у него есть многочисленные преимущества
перед libmysqlclient .
MySQL Native Driver
может использоваться только с версиями сервера MySQL 4.1.3 и позже.
MySQL Native Driver осуществляется, используя дополнительную структуру PHP.
Исходный код расположен в ext/mysqlnd .
Это не выставляет API PHP-программисту.
Сравнение особенностей
Следующая таблица сравнивает функциональность трех основных методов
соединения с MySQL из PHP:
Таблица 3.1. Сравнение возможностей MySQL API для PHP
| PHP mysqli |
PDO (используя PDO MySQL Driver и MySQL Native Driver) |
PHP MySQL |
Версия PHP, в которой внедрено | 5.0 |
5.0 | До 3.0 |
Включено в PHP 5.x | Да | Да |
Да |
Статус разработки MySQL | Активная |
Активная с PHP 5.3 | Только поддержка |
Рекомендуется MySQL для новых проектов |
Да, предпочтительно | Да | Нет |
API поддерживает Charset | Да | Да |
Нет |
API поддерживает server-side Prepared Statements |
Да | Да | Нет |
API поддерживает client-side Prepared Statements |
Нет | Да | Нет |
API поддерживает Stored Procedures | Да |
Да | Нет |
API поддерживает Multiple Statements | Да |
Most | Нет |
API поддерживает всю функциональность MySQL 4.1+ |
Да | Most | Нет |
3.2. Быстрый старт
Это руководство дает обзор расширения mysqli. Примеры кода обеспечиваются
для всех главных аспектов API. Понятия базы данных объяснены в степени,
необходимой для представления понятий, определенных для MySQL.
Требуется: знакомство с языком программирования PHP, языком SQL и
элементарные знания сервера MySQL.
3.2.1. Двойной процедурный и объектно-ориентированный интерфейс
Расширение mysqli имеет двойной интерфейс. Это поддерживает парадигму
процедурного и объектно-ориентированного программирования.
Пользователи, мигрирующие от старого расширения mysql,
могут предпочесть процедурный интерфейс. Процедурный интерфейс подобен
интерфейсу старого расширения mysql. Во многих случаях имена функций
отличаются только префиксом. Некоторые функции mysqli берут дескриптор связи
в качестве своего первого аргумента, тогда как соответствующие функции в
старом интерфейсе берут это как дополнительный последний аргумент.
Пример 3.1. Легкая миграция от старого расширения mysql
<?php
$mysqli = mysqli_connect("example.com", "user", "password", "database");
$res = mysqli_query($mysqli, "SELECT 'Please, do not use ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($res);
echo $row['_msg'];
$mysql = mysql_connect("example.com", "user", "password");
mysql_select_db("test");
$res = mysql_query("SELECT 'the mysql extension for new developments.' AS _msg FROM DUAL", $mysql);
$row = mysql_fetch_assoc($res);
echo $row['_msg'];
?>
Пример выведет следующее:
Please, do not use the mysql extension for new developments.
Объектно-ориентированный интерфейс
В дополнение к классическому процедурному интерфейсу пользователи могут
использовать объектно-ориентированный интерфейс. Документация организована,
используя объектно-ориентированный интерфейс. Объектно-ориентированный
интерфейс показывает функции, сгруппированные их целью, облегчая поиск.
Справочная секция дает примеры для обоих вариантов синтаксиса.
Между двумя интерфейсами нет никаких значительных различий в
производительности. Пользователи могут основывать свой выбор
на личном предпочтении.
Пример 3.2. Объектно-ориентированный и процедурный интерфейсы
<?php
$mysqli = mysqli_connect("example.com", "user", "password", "database");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$res = mysqli_query($mysqli, "SELECT 'A world full of ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($res);
echo $row['_msg'];
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
$res = $mysqli->query("SELECT 'choices to please everybody.' AS _msg FROM DUAL");
$row = $res->fetch_assoc();
echo $row['_msg'];
?>
Вывод этого примера:
A world full of choices to please everybody.
Смешанные стили
Возможно переключиться между стилями в любое время.
Смешивание обоих стилей не рекомендуется для кодовой ясности.
Пример 3.3. Так не надо!
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
$res = mysqli_query($mysqli, "SELECT 'Possible but bad style.' AS _msg FROM DUAL");
if (!$res)
{
echo "Failed to run query: (" . $mysqli->errno . ") " . $mysqli->error;
}
if ($row = $res->fetch_assoc())
{
echo $row['_msg'];
}
?>
Этот пример выведет:
Possible but bad style.
См. также
3.2.2. Связи
Сервер MySQL поддерживает использование различных транспортных уровней для
связей. Связи используют TCP/IP, сокеты Unix или именованные каналы.
Имя хоста localhost
имеет особое значение. Это связано с использованием сокетов Unix.
Невозможно открыть связь TCP/IP, используя имя хоста
localhost , необходимо использовать
127.0.0.1 .
Пример 3.4. Особые значения localhost
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "\n";
$mysqli = new mysqli("127.0.0.1", "user", "password", "database", 3306);
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "\n";
?>
Этот пример выведет:
Localhost via UNIX socket
127.0.0.1 via TCP/IP
Значения по умолчанию параметра связи
В зависимости от функции связи могут быть опущены различные параметры.
Если параметр не обеспечивается, то расширение пытается использовать значения
по умолчанию, которые установлены в конфигурационном файле PHP.
Пример 3.5. Значения по умолчанию
mysqli.default_host=192.168.2.27
mysqli.default_user=root
mysqli.default_pw=""
mysqli.default_port=3306
mysqli.default_socket=/tmp/mysql.sock
Получающиеся значения параметров тогда передаются в библиотеку клиента,
которой пользуется расширение. Если библиотека клиента обнаруживает пустой
или неопределенный параметр, то она может применить свои
значения по умолчанию.
Встроенные умолчания библиотеки связи
Если значение хоста пусто, то библиотека клиента по умолчанию
переходит к сокетному соединению Unix по
localhost . Если сокет не задан,
и сокетное соединение Unix требуется, то применяется связь с
/tmp/mysql.sock .
В Windows имя хоста . понимается
библиотекой клиента как попытка открыть именованный канал Windows.
В этом случае параметр сокета интерпретируется как имя канала. Если не задано
или пусто, то \\.\pipe\MySQL .
Если значение параметра порта не задано, библиотека по умолчанию
использует порт 3306 .
Библиотека mysqlnd
и MySQL Client Library (libmysqlclient) осуществляют ту же самую логику
для определения умолчаний.
Варианты связи
Варианты связи доступны, например, можно задать команды init, которые
выполняются на соединении, или для требования использования определенного
набора символов. Варианты связи должны быть установлены прежде, чем
сетевое соединение устанавливается.
Для урегулирования выбора связи операция должна быть выполнена в три
шага: создание связи с
mysqli_init , урегулирование требуемого использования вариантов
через
mysqli_options и установление сетевого соединения с
mysqli_real_connect .
Объединение связи
Расширение mysqli поддерживает постоянные соединения с базой данных,
которые являются специальным видом объединенных связей. По умолчанию каждое
соединение с базой данных, открытое скриптом, явно закрыто пользователем во
время выполнения или освобождено автоматически в конце скрипта.
Постоянных связей нет. Вместо этого связь помещается в пул для более позднего
повторного использования, если связь с тем же самым сервером, используя то же
самое имя пользователя, пароль, сокет, порт и базу данных по умолчанию
открыта. Повторное использование экономит издержки связи.
Каждый процесс PHP использует свой собственный пул mysqli.
В зависимости от модели развертывания веб-сервера процесс PHP может
обрабатывать один или много запросов. Поэтому объединенная связь может
впоследствии использоваться одним или более скриптами.
Постоянная связь
Если неиспользованная постоянная связь для данной комбинации хоста,
имени пользователя, пароля, сокета, порта и базы данных по умолчанию не может
быть найдена в пуле связи, то mysqli открывает новую связь. Использование
постоянных связей может быть позволено и отключено использование директивы
PHP
mysqli.allow_persistent. Общее количество связей, открытых
скриптом, может быть ограничено
mysqli.max_links.
Максимальное количество постоянных связей на процесс PHP может быть
ограничено
mysqli.max_persistent. Пожалуйста, обратите внимание на то, что
веб-сервер может породить много процессов PHP.
Общая проблема постоянных связей то, что их статус не перезагружается
перед повторным использованием. Например, открытые и незаконченные
транзакции автоматически не отменены. Но также и изменения разрешений,
которые произошли во время между помещением связи в пул и повторным
ее использованием, не отражены. Это может быть рассмотрено как нежелательный
побочный эффект. Наоборот persistent
может быть понято как обещание, что статус сохранен.
Расширение mysqli поддерживает обе интерпретации постоянной связи: статус
сохранен или сброс перед повторным использованием. По умолчанию выполняется
сброс. Прежде чем постоянная связь снова используется, расширение mysqli
неявно вызовет
mysqli_change_user , чтобы сбросить
статус. Постоянная связь выдается пользователю, как будто она была просто
открыта. Никакие последствия от предыдущих использований не видны.
Функция
mysqli_change_user
дорогая операция. Для лучшей работы пользователи могут хотеть повторно
собрать расширение с параметром
MYSQLI_NO_CHANGE_USER_ON_PCONNECT .
Это оставляет пользователю выбор между безопасным поведением и лучшей
работой. Для простоты использования безопасное поведение было сделано
умолчанием за счет максимальной производительности.
См. также
3.2.3. Выполнение запросов
Запросы могут быть выполнены
mysqli_query ,
mysqli_real_query и
mysqli_multi_query .
mysqli_query наиболее распространена и объединяет выполнение
запроса с буферизацией его набора результатов, если таковые имеются.
Запрос
mysqli_query идентичен
mysqli_real_query , сопровождаемому
mysqli_store_result .
Пример 3.6. Соединение с MySQL
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)") ||
!$mysqli->query("INSERT INTO test(id) VALUES (1)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Буферизированные наборы результатов
Результаты выполнения запроса могут быть получены сразу,
чтобы быть буферизованными клиентом, или прочитаны построчно.
Клиентский буферизующий набор результатов позволяет серверу освободить
ресурсы, связанные с результатами запроса как можно раньше.
Вообще говоря, клиенты медлено обрабатывают наборы результатов.
Поэтому рекомендуется использовать буферизованные наборы результатов.
mysqli_query объединяет выполнение запроса и
буферизацию набора результатов.
Приложения PHP могут свободно перемещаться по буферизированным
результатам. Навигация быстра, потому что наборы результатов хранятся в
памяти клиента. Пожалуйста, имейте в виду, что часто легче масштабировать
клиента, чем сервер.
Пример 3.7. Навигация по буферизированным результатам
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)") ||
!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$res = $mysqli->query("SELECT id FROM test ORDER BY id ASC");
echo "Reverse order...\n";
for ($row_no = $res->num_rows - 1; $row_no >= 0; $row_no--)
{
$res->data_seek($row_no);
$row = $res->fetch_assoc();
echo " id = " . $row['id'] . "\n";
}
echo "Result set order...\n";
$res->data_seek(0);
while ($row = $res->fetch_assoc())
{
echo " id = " . $row['id'] . "\n";
}
?>
Этот пример выведет:
Reverse order...
id = 3
id = 2
id = 1
Result set order...
id = 1
id = 2
id = 3
Небуферизированные наборы результатов
Если память клиента маленькая и ресурсы сервера освобождены как можно
раньше, небуферизированные результаты могут использоваться. Просмотр
небуферизированных результатов невозможен прежде, чем все строки прочитаны.
Пример 3.8. Навигация по небуферизированным результатам
<?php
$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$res = $mysqli->use_result();
echo "Result set order...\n";
while ($row = $res->fetch_assoc())
{
echo " id = " . $row['id'] . "\n";
}
?>
Набор результатов и типы данных
mysqli_query ,
mysqli_real_query и
mysqli_multi_query
используются, чтобы выполнить неподготовленные запросы. На уровне протокола
клиент-сервера MySQL команды COM_QUERY
и текстовый протокол используются для выполнения запросов.
С текстовым протоколом сервер MySQL преобразовывает все данные наборы
результатов в строки перед отправкой. Это преобразование сделано независимо
от типа данных колонки набора результатов SQL. Библиотеки клиента получают
все значения столбцов как последовательности. Никакое дальнейшее клиентское
преобразование не сделано, чтобы преобразовать колонки назад в их родные
типы. Вместо этого все значения предоставлены как последовательности PHP.
Пример 3.9. Текстовый протокол возвращает
последовательности по умолчанию
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$res = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $res->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>
Этот пример выведет:
id = 1 (string)
label = a (string)
Возможно преобразовать целое число и колонки float
назад к числам PHP, устанавливая опцию соединения
MYSQLI_OPT_INT_AND_FLOAT_NATIVE ,
пользуясь библиотекой mysqlnd. Если установлено, библиотека mysqlnd проверит
типы столбца метаданных набора результатов и преобразует числовые колонки SQL
в числа PHP, если диапазон значений типа данных PHP будет допускать это.
Так, например, SQL-колонки INT возвращены как целые числа.
Пример 3.10. Типы данных с mysqlnd и опцией связи
<?php
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$res = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $res->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>
Этот пример выведет:
id = 1 (integer)
label = a (string)
См. также
3.2.4. Подготовленные запросы
БД MySQL поддерживает подготовленные запросы. Подготовленный запрос
используется, чтобы неоднократно выполнять то же самый
запрос с высокой эффективностью.
Основной технологический процесс
Выполнение подготовленного запроса
состоит из двух этапов: подготовьте и выполните.
На стадии подготовки шаблон запроса посылают в сервер базы данных.
Сервер выполняет проверку синтаксиса и инициализирует внутренние ресурсы для
более позднего использования.
Сервер MySQL поддерживает использование анонимного позиционного
заполнителя ? .
Пример 3.11. Первая стадия: подготовить
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
/* Non-prepared statement */
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Подготовка сопровождается выполнением. Во время выполнения
клиент связывает значения параметров и посылает их в сервер. Сервер создает
запрос из шаблона запроса и связанных значений, чтобы выполнить его,
используя ранее созданные внутренние ресурсы.
Пример 3.12. Вторая стадия: свяжите и выполните
<?php
/* Prepared statement, stage 2: bind and execute */
$id = 1;
if (!$stmt->bind_param("i", $id))
{
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
?>
Повторное выполнение
Подготовленный запрос может выполняться неоднократно.
После каждого выполнения текущее значение связанной переменной оценено и
послано серверу. Запрос не размечен снова. Шаблон запроса не
передается серверу снова.
Пример 3.13. INSERT подготовлен однажды, выполнен многократно
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
/* Non-prepared statement */
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Prepared statement, stage 2: bind and execute */
$id = 1;
if (!$stmt->bind_param("i", $id))
{
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
/* Prepared statement: repeated execution, only data transferred from client to server */
for ($id = 2; $id < 5; $id++)
{
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
}
/* explicit close recommended */
$stmt->close();
/* Non-prepared statement */
$res = $mysqli->query("SELECT id FROM test");
var_dump($res->fetch_all());
?>
Этот пример выведет:
array(4)
{
[0]=>
array(1)
{
[0]=>
string(1) "1"
}
[1]=>
array(1)
{
[0]=>
string(1) "2"
}
[2]=>
array(1)
{
[0]=>
string(1) "3"
}
[3]=>
array(1)
{
[0]=>
string(1) "4"
}
}
Каждый подготовленный запрос занимает ресурсы сервера.
Запросы должны быть закрыты явно немедленно после использования.
Если это не сделано явно, запрос будет закрыт, когда дескриптор
запроса будет освобожден PHP.
Использование подготовленного запроса не всегда самый эффективный способ
выполнить запрос. Подготовленный запрос, выполненный только однажды,
генерирует много больше трафика client-server, чем неподготовленный запрос.
Именно поэтому в этом примере SELECT
не управляется как подготовленный запрос.
Кроме того, учтите использование MySQL синтаксиса SQL мульти-INSERT для
INSERT. Для примера мульти-INSERT требует меньшего количества обменов данными
между сервером и клиентом, чем подготовленный запрос, показанный выше.
Пример 3.14. Меньше трафика, используя мульти-INSERT SQL
<?php
if (!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3), (4)"))
{
echo "Multi-INSERT failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Набор результатов и типы данных
MySQL Client Server Protocol определяет различные протоколы передачи
данных для подготовленных и неподготовленных запросов. Подготовленные запросы
используют так называемый протокол двоичной синхронной передачи данных.
Сервер MySQL посылает данные о наборе результатов
"как есть" в двоичном формате. Результаты не преобразовываются в
последовательную форму перед отправкой.
Библиотеки клиента не получают только строки. Вместо этого они получат
двоичные данные и предпримут попытку преобразовать значения
в соответствующие типы данных PHP. Например, результаты из столбца SQL
INT будут предоставлены как
целочисленные переменные PHP.
Пример 3.15. Встроенные типы данных
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>
Этот пример выведет:
id = 1 (integer)
label = a (string)
Это поведение отличается от неподготовленных запросов.
По умолчанию неподготовленные запросы возвращают все результаты как
последовательности. Это умолчание может быть изменено, используя выбор связи.
Если выбор связи используется, нет никаких различий.
Установка результатов, используя связанные переменные
Следствия подготовленных запросов могут быть получены, связав выходные
переменные, или запросом объекта mysqli_result .
Выходные переменные должны быть связаны после выполнения запроса.
Одна переменная должна направиться в каждую колонку
набора результатов запроса.
Пример 3.16. Закрепление выходной переменной
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($stmt = $mysqli->prepare("SELECT id, label FROM test")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$out_id= NULL;
$out_label = NULL;
if (!$stmt->bind_result($out_id, $out_label))
{
echo "Binding output parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
while ($stmt->fetch())
{
printf("id = %s (%s), label = %s (%s)\n", $out_id,
gettype($out_id), $out_label, gettype($out_label));
}
?>
Этот пример выведет:
id = 1 (integer), label = a (string)
Подготовленные запросы возвращают небуферизированные наборы результатов по
умолчанию. Результаты запросы неявно не переданы от сервера клиенту для
клиентского буферизования. Набор результатов использует ресурсы сервера, пока
все результаты не были получены клиентом. Таким образом рекомендуется
потреблять результаты своевременно. Если клиент не забирает все результаты
или закрывает запрос прежде, чем получит все данные, они должны быть неявно
получены mysqli .
Также возможно буферизовать результаты подготовленного запроса через
mysqli_stmt_store_result .
Установка результатов, используя
интерфейс mysqli_result
Вместо того, чтобы использовать связанные переменные, результаты могут
также быть получены через интерфейс
mysqli_stmt_get_result .
Он возвращает буферизированный набор результатов.
Пример 3.17. Использование mysqli_result,
чтобы получить результаты
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($stmt = $mysqli->prepare("SELECT id, label FROM test ORDER BY id ASC")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!($res = $stmt->get_result()))
{
echo "Getting result set failed: (" . $stmt->errno . ") " . $stmt->error;
}
var_dump($res->fetch_all());
?>
Этот пример выведет:
array(1)
{
[0]=>
array(2)
{
[0]=>
int(1)
[1]=>
string(1) "a"
}
}
Использование mysqli_result interface
предлагает дополнительную выгоду гибкой клиентской
навигации набора результатов.
Пример 3.18. Буферизирование набора результатов
для гибкой навигации
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") ||
!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a'), (2, 'b'), (3, 'c')"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($stmt = $mysqli->prepare("SELECT id, label FROM test")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!($res = $stmt->get_result()))
{
echo "Getting result set failed: (" . $stmt->errno . ") " . $stmt->error;
}
for ($row_no = ($res->num_rows - 1); $row_no >= 0; $row_no--)
{
$res->data_seek($row_no);
var_dump($res->fetch_assoc());
}
$res->close();
?>
Этот пример выведет:
array(2)
{
["id"]=>
int(3)
["label"]=>
string(1) "c"
}
array(2)
{
["id"]=>
int(2)
["label"]=>
string(1) "b"
}
array(2)
{
["id"]=>
int(1)
["label"]=>
string(1) "a"
}
Возможность экранировки и SQL injection
Связанные переменные посылаются в сервер отдельно от запроса и таким
образом не могут вмешаться в него. Сервер использует эти значения
непосредственно при выполнении, после того, как шаблон запроса будет
разобран. Связанные параметров не должны экранироваться поскольку ими никогда
не заменяют строку запроса непосредственно.
Подсказка должна быть предоставлена серверу для типа связанной переменной,
чтобы создать соответствующее преобразование. Посмотрите функцию
mysqli_stmt_bind_param
для получения дополнительной информации.
Такое разделение, которое, как иногда полагают единственное средство
защиты от SQL injection, но ту же самую степень безопасности, можно
достичь с неподготовленными запросами, если все значения отформатированы
правильно. Нужно отметить, что правильное форматирование не то же самое
как экранирование и включает больше логики, чем простая возможность
экранирования. Таким образом подготовленные запросы это просто более удобный
и меньше подверженный ошибкам подход к этому элементу
безопасности базы данных.
Клиентская эмуляция подготовленного запроса
API не включает эмуляцию для клиентской эмуляции подготовленного запроса.
Сравнение подготовленных и неподготовленных запросов
Приведенная ниже таблица сравнивает серверную сторону
подготовленных и неподготовленных запросов.
Таблица 3.2. Сравнение подготовленных и неподготовленных запросов
| Подготовленные |
Неподготовленные |
Циклы обработки клиент-сервер,
SELECT, единственное выполнение | 2 | 1 |
Последовательность запроса, переданная от клиента серверу
| 1 | 1 |
Циклы обработки клиент-сервер, SELECT,
повторное выполнение (n раз) | 1 + n | n |
Последовательность запроса, переданная от клиента серверу
| 1 шаблон, n раз связанные параметры, если есть |
n раз вместе с параметром, если есть |
Привязка входных параметров API |
Да, автоматическая экранировка ввода |
Нет, ручная экранировка ввода |
Привязка выходных параметров API | Да |
Нет |
Использование поддержки mysqli_result API |
Да через
mysqli_stmt_get_result | Да |
Буферизированные наборы результатов | Да через
mysqli_stmt_get_result или привязка с
mysqli_stmt_store_result |
Да, по умолчанию
mysqli_query |
Небуферизированные наборы результатов |
Да, используйте привязку вывода API |
Да, используйте
mysqli_real_query с
mysqli_use_result |
Протокол передачи MySQL Client Server |
Binary | Text |
Набор результатов задает типы данных SQL |
Сохранены | Преобразованы в последовательность или сохранены |
Поддерживает все SQL-операторы |
Недавние версии MySQL поддерживают больше всего, но не все |
Да |
См. также
3.2.5. Хранимые процедуры
Хранимые процедуры поддерживаются БД MySQL. Хранимая процедура это
подпрограмма, сохраненная в каталоге базы данных. Запросы могут вызвать и
выполнить хранимую процедуру. SQL-запрос CALL
используется, чтобы выполнить хранимую процедуру.
Параметр
Хранимые процедуры могут иметь параметры
IN , INOUT и
OUT в зависимости от версии MySQL.
У интерфейса mysqli нет специального понятия для различных видов параметров.
Параметр IN
Входные параметры обеспечиваются запросом
CALL . Пожалуйста, удостоверьтесь, что
значения экранированы правильно.
Пример 3.19. Запрос хранимой процедуры
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
!$mysqli->query("CREATE PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;"))
{
echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->query("CALL p(1)"))
{
echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($res = $mysqli->query("SELECT id FROM test")))
{
echo "SELECT failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
var_dump($res->fetch_assoc());
?>
Этот пример выведет:
array(1)
{
["id"]=>
string(1) "1"
}
Параметр INOUT/OUT
К параметрам INOUT /OUT
получают доступ, используя переменные сеанса.
Пример 3.20. Использование переменных сеанса
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
!$mysqli->query('CREATE PROCEDURE p(OUT msg VARCHAR(50)) BEGIN SELECT "Hi!" INTO msg; END;'))
{
echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->query("SET @msg = ''") ||
!$mysqli->query("CALL p(@msg)"))
{
echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($res = $mysqli->query("SELECT @msg as _p_out")))
{
echo "Fetch failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$row = $res->fetch_assoc();
echo $row['_p_out'];
?>
Этот пример выведет:
Hi!
Разработчики приложений и инфраструктуры могут быть в состоянии обеспечить
более удобный API, используя соединение переменных сеанса и контроля каталога.
Однако, пожалуйста, отметьте возможное исполнительное воздействие
настраиваемого решения на основе контроля каталога.
Обработка наборов результатов
Хранимые процедуры могут возвратить наборы результатов.
Наборы результатов, возвращенные из хранимой процедуры, не могут быть
получены правильно, используя
mysqli_query . Функция
mysqli_query совмещает
выполнение запроса и получение первого набора результатов в буферизированный
набор результатов, если результаты есть. Однако есть дополнительные наборы
результатов хранимой процедуры, скрытые от пользователя.
Наборы результатов, возвращенные из хранимой процедуры, получены,
используя
mysqli_real_query или
mysqli_multi_query . Обе функции позволяют получать
любое количество наборов результатов, возвращенных запросом, например,
CALL . Отказ получить все наборы результатов,
возвращенные хранимой процедурой, вызывает ошибку.
Пример 3.21. Получение результатов из хранимых процедур
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)") ||
!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
!$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;'))
{
echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->multi_query("CALL p()"))
{
echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
do {
if ($res = $mysqli->store_result())
{
printf("---\n");
var_dump($res->fetch_all());
$res->free();
} else {
if ($mysqli->errno)
{
echo "Store failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
?>
Этот пример выведет:
---
array(3)
{
[0]=>
array(1)
{
[0]=>
string(1) "1"
}
[1]=>
array(1)
{
[0]=>
string(1) "2"
}
[2]=>
array(1)
{
[0]=>
string(1) "3"
}
}
---
array(3)
{
[0]=>
array(1)
{
[0]=>
string(1) "2"
}
[1]=>
array(1)
{
[0]=>
string(1) "3"
}
[2]=>
array(1)
{
[0]=>
string(1) "4"
}
}
Использование подготовленных запросов
Никакая специальная обработка не требуется, используя интерфейс
подготовленных запросов для получения результатов той же самой хранимой
процедуры. Интерфейсы подготовленных и неподготовленных запросов подобны.
Пожалуйста, отметьте, что не каждая версия сервера MYSQL может поддерживать
подготовку запроса CALL .
Пример 3.22. Хранимые процедуры и подготовленные запросы
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)") ||
!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") ||
!$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;'))
{
echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!($stmt = $mysqli->prepare("CALL p()")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
do {
if ($res = $stmt->get_result())
{
printf("---\n");
var_dump(mysqli_fetch_all($res));
mysqli_free_result($res);
} else {
if ($stmt->errno)
{
echo "Store failed: (" . $stmt->errno . ") " . $stmt->error;
}
}
} while ($stmt->more_results() && $stmt->next_result());
?>
Конечно, использование API связывания для получения поддерживается также.
Пример 3.23. Хранимые процедуры и использование подготовленных
запросов с API связывания
<?php
if (!($stmt = $mysqli->prepare("CALL p()")))
{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->execute())
{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
do {
$id_out = NULL;
if (!$stmt->bind_result($id_out))
{
echo "Bind failed: (" . $stmt->errno . ") " . $stmt->error;
}
while ($stmt->fetch())
{
echo "id = $id_out\n";
}
} while ($stmt->more_results() && $stmt->next_result());
?>
См. также
3.2.6. Мультизапросы
MySQL позволяет иметь многочисленные запросы в одной строке запроса.
Отправка многочисленных запросов уменьшает циклы обработки клиент-сервер, но
требует специальной обработки.
Многочисленные запросы должны быть выполнены с
mysqli_multi_query . Отдельные запросы последовательности
отделены точкой с запятой. Затем должны быть получены все наборы результатов,
возвращенные выполненными запросами.
Сервер MySQL позволяет иметь запросы, которые действительно возвращают
наборы результатов и запросы, которые не возвращают наборы
результатов в одном мультизапросе.
Пример 3.24. Мультизапросы
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)"))
{
echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
$sql = "SELECT COUNT(*) AS _num FROM test; ";
$sql.= "INSERT INTO test(id) VALUES (1); ";
$sql.= "SELECT COUNT(*) AS _num FROM test; ";
if (!$mysqli->multi_query($sql))
{
echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
do {
if ($res = $mysqli->store_result())
{
var_dump($res->fetch_all(MYSQLI_ASSOC));
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
?>
Этот пример выведет:
array(1)
{
[0]=>
array(1)
{
["_num"]=>
string(1) "0"
}
}
array(1)
{
[0]=>
array(1)
{
["_num"]=>
string(1) "1"
}
}
Соображения безопасности
Функции API
mysqli_query и
mysqli_real_query не устанавливают флаг связи, необходимый для
активации мультизапросов в сервере. Дополнительный вызов API используется для
этого, чтобы уменьшить вероятность случайных атак с использованием кода на
SQL. Нападавший может попытаться добавить запросы вроде
; DROP DATABASE mysql или
; SELECT SLEEP(999) .
Если нападавший преуспевает в том, чтобы добавить SQL к последовательности,
но mysqli_multi_query не используется,
сервер не выполнит дополнительный злонамеренный SQL-оператор.
Пример 3.25. SQL Injection
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
$res= $mysqli->query("SELECT 1; DROP TABLE mysql.user");
if (!$res)
{
echo "Error executing query: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Этот пример выведет:
Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near 'DROP TABLE mysql.user' at line 1
Подготовленные запросы
Использование мультизапросов с подготовленными
запросами не поддерживается.
См. также
3.2.7. Поддержка API транзакций
Сервер MySQL поддерживает транзакции в зависимости от используемого
механизма хранения. Начиная с MySQL 5.5 механизм хранения по умолчанию
InnoDB. У InnoDB есть полная операционная поддержка ACID.
Транзакциями можно управлять, используя SQL или вызовы API.
Рекомендуется использовать вызовы API.
Пример 3.26. Установка режима autocommit через SQL и API
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
/* Recommended: using API to control transactional settings */
$mysqli->autocommit(false);
/* Won't be monitored and recognized by the replication and the load balancing plugin */
if (!$mysqli->query('SET AUTOCOMMIT = 0'))
{
echo "Query failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Пакеты дополнительных функций, такие как плагин репликации
и выравнивания нагрузки, могут легко контролировать вызовы API. Плагин
репликации предлагает транзакции осведомленное выравнивание нагрузки, если
транзакциями управляют с вызовами API. Осведомленное выравнивание нагрузки
недоступно, если SQL-операторы используются для урегулирования autocommit,
передачи или отката транзакции.
Пример 3.27. Commit и rollback
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query("INSERT INTO test(id) VALUES (1)");
$mysqli->rollback();
$mysqli->query("INSERT INTO test(id) VALUES (2)");
$mysqli->commit();
?>
Пожалуйста, обратите внимание на то, что сервер MySQL не может отменить
все запросы до прежнего уровня. Некоторые запросы неявно передают.
См. также
3.2.8. Метаданные
Набор результатов MySQL содержит метаданные. Метаданные описывают колонки,
найденные в наборе результатов. Все метаданные, посланные MySQL, доступны
через интерфейс mysqli .
Расширение не выполняет изменений информации, которую оно получает.
Различия между версиями сервера MySQL не обрабатываются.
Метаданные доступны через интерфейс mysqli_result .
Пример 3.28. Метаданные набора результатов
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno)
{
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$res = $mysqli->query("SELECT 1 AS _one, 'Hello' AS _two FROM DUAL");
var_dump($res->fetch_fields());
?>
Этот пример выведет:
array(2)
{
[0]=>
object(stdClass)#3 (13)
{
["name"]=>
string(4) "_one"
["orgname"]=>
string(0) ""
["table"]=>
string(0) ""
["orgtable"]=>
string(0) ""
["def"]=>
string(0) ""
["db"]=>
string(0) ""
["catalog"]=>
string(3) "def"
["max_length"]=>
int(1)
["length"]=>
int(1)
["charsetnr"]=>
int(63)
["flags"]=>
int(32897)
["type"]=>
int(8)
["decimals"]=>
int(0)
}
[1]=>
object(stdClass)#4 (13)
{
["name"]=>
string(4) "_two"
["orgname"]=>
string(0) ""
["table"]=>
string(0) ""
["orgtable"]=>
string(0) ""
["def"]=>
string(0) ""
["6db"]=>
string(0) ""
["catalog"]=>
string(3) "def"
["max_length"]=>
int(5)
["length"]=>
int(5)
["charsetnr"]=>
int(8)
["flags"]=>
int(1)
["type"]=>
int(253)
["decimals"]=>
int(31)
}
}
Подготовленные запросы
К метаданным наборов результатов, созданных, используя подготовленные
запросы, получают доступ тем же самым путем. Дескриптор
mysqli_result возвращен
mysqli_stmt_result_metadata .
Пример 3.29. Метаданные подготовленных запросов
<?php
$stmt = $mysqli->prepare("SELECT 1 AS _one, 'Hello' AS _two FROM DUAL");
$stmt->execute();
$res = $stmt->result_metadata();
var_dump($res->fetch_fields());
?>
См. также
3.3. Установка и настройка
3.3.1. Требования
Чтобы иметь эти функции в наличии, необходимо собрать PHP с
поддержкой расширения mysqli.
MySQL 8
Управляя версией PHP до 7.1.16 или PHP 7.2 до 7.2.4, установите плагин
пароля MySQL 8 Server по умолчанию в
mysql_native_password,
иначе вы будете видеть ошибки, подобные
The server requested authentication method unknown
to the client [caching_sha2_password], даже когда не используется
caching_sha2_password.
Это вызвано тем, что по умолчанию MySQL 8 использует
caching_sha2_password, плагин, который не признан более старыми версиями
PHP (mysqlnd). Вместо этого измените его, установив
default_authentication_plugin=mysql_native_password
в файле my.cnf . Плагин
caching_sha2_password
будет поддержан в будущем выпуске PHP. Тем временем расширение
mysql_xdevapi поддерживает его.
3.3.2. Установка
Расширение mysqli
было начато с версии 5.0.0 PHP. MySQL Native Driver был включен в версию PHP
5.3.0.
3.3.2.1. Установка в Linux
Общие дистрибутивы Unix включают версии двоичных файлов PHP, которые могут
быть установлены. Хотя эти версии двоичных файлов, как правило, строятся с
поддержкой расширений MySQL, сами дополнительные библиотеки, возможно, должны
быть установлены, используя дополнительный пакет. Проверьте диспетчер
пакетов, который идет с вашим выбранным дистрибутивом для доступности.
Например, в Ubuntu пакет php5-mysql
устанавливает ext/mysql, ext/mysqli и pdo_mysql PHP. В
CentOS пакет php-mysql
также устанавливает эти три расширения PHP.
Альтернативно, можно собрать это расширение самому.
Сборка PHP из исходных текстов позволяет вам определять расширения MySQL,
которые вы хотите использовать, а также ваш выбор библиотеки клиента
для каждого расширения.
MySQL Native Driver это рекомендуемый выбор библиотеки клиента, поскольку
он приводит к улучшенной работе и предоставляет доступ к особенностям,
недоступным, пользуясь MySQL Client Library. См.
здесь
для краткого обзора преимуществ MySQL Native Driver.
/path/to/mysql_config представляет
местоположение программы mysql_config ,
которая идет с MySQL Server.
Таблица 3.3. Таблица поддержки времени компиляции mysqli
PHP Версия |
Значение по умолчанию |
Опции:
mysqlnd |
Опции: libmysqlclient |
Журнал изменений |
5.4.x и выше | mysqlnd |
--with-mysqli |
--with-mysqli=/path/to/mysql_config |
mysqlnd по умолчанию |
5.3.x | libmysqlclient |
--with-mysqli=mysqlnd |
--with-mysqli=/path/to/mysql_config |
mysqlnd поддерживается |
5.0.x, 5.1.x, 5.2.x | libmysqlclient |
Нет | --with-mysqli=/path/to/mysql_config
| mysqlnd не поддерживается |
Обратите внимание на то, что возможно свободно смешать расширения MySQL и
библиотеки клиента. Например, возможно позволить расширению MySQL
пользоваться MySQL Client Library (libmysqlclient), формируя
расширение mysqli , чтобы использовать
MySQL Native Driver. Однако все перестановки расширения и
библиотеки клиента возможны.
3.3.2.2. Установка в Windows
В Windows PHP обычно устанавливается, используя двоичный инсталлятор.
3.3.2.2.1. PHP 5.3.0 и выше
В Windows для PHP versions 5.3 и новее расширение
mysqli позволено и использует по умолчанию
MySQL Native Driver. Это означает, что вы не должны волноваться о
формировании доступа к libmysql.dll .
3.3.2.2.2. PHP 5.0, 5.1, 5.2
На этих старых неподдерживаемых версиях (PHP 5.2 достиг EOL
'6 Jan 2011'), дополнительные процедуры конфигурации требуются, чтобы
позволять mysqli
и определить библиотеку клиента, которой вы хотите, чтобы он пользовался.
Расширение mysqli
не позволено по умолчанию, таким образом,
php_mysqli.dll DLL должна быть позволена в
php.ini . Чтобы сделать это, необходимо найти
файл php.ini
(обычно он в c:\php ) и
удостовериться, что вы удаляете комментарий (точка с запятой) из начала
строки extension=php_mysqli.dll в секции
[PHP_MYSQLI] .
Кроме того, если вы хотите пользоваться MySQL Client Library с
mysqli , необходимо удостовериться, что PHP может
получить доступ к файлу библиотеки клиента. MySQL Client Library
включена как файл libmysql.dll в дистрибутив
Windows PHP. Этот файл должен быть доступным в системной переменной Windows
PATH , чтобы это могло быть успешно загружено.
Посмотрите FAQ "How do I add my PHP directory to the PATH on Windows".
Копирование libmysql.dll в системный каталог
Windows (обычно это c:\Windows\system )
также работает. Однако, этого лучше избегать.
Как с предоставлением возможности любого расширения PHP (такого, как
php_mysqli.dll ), директива PHP
extension_dir должна быть установлена в каталог,
где расположены расширения PHP. См. также
Manual Windows Installation Instructions. Например, значение
extension_dir для PHP 5 это
c:\php\ext .
Если при запуске веб-сервер происходит ошибка, подобная следующей:
"Unable to load dynamic library './php_mysqli.dll'"
, это потому, что
php_mysqli.dll и/или
libmysql.dll не может быть найден системой.
3.3.3.
Конфигурация во время выполнения
Поведение этих функций затронуто параметрами настройки в
php.ini .
Таблица 3.4. Опции настройки MySQLi
Для получения дальнейшей информации и определения предыдущих констант
PHP_INI_*, см. configuration changes.
Вот короткое объяснение конфигурационных директив.
-
mysqli.allow_local_infile
integer
Позволяет получать доступ, с точки зрения PHP, к локальным
файлам с LOAD DATA.
-
mysqli.allow_persistent
integer
Позволяет создать постоянное использование связей
mysqli_connect .
-
mysqli.max_persistent
integer
Максимум постоянных связей, которые могут
быть установлены. 0 = без ограничений.
-
mysqli.max_links
integer
Максимальное количество подключений mysql для каждого процесса.
-
mysqli.default_port integer
Номер порта TCP по умолчанию, чтобы использовать, соединяясь с
сервером базы данных, если никакой другой порт не определяется. Если никакое
умолчание не будет определено, порт будет получен из переменной окружения
MYSQL_TCP_PORT , записи
mysql-tcp в файле
/etc/services или постоянной
MYSQL_PORT времени компиляции, в этом порядке.
Win32 будет использовать только
MYSQL_PORT .
-
mysqli.default_socket string
Сокет по умолчанию, чтобы использовать, соединяясь с сервером
локальной базы данных, если никакое другое имя не определяется.
-
mysqli.default_host string
Сервер по умолчанию, чтобы использовать, соединяясь с сервером базы
данных, если никакой другой хост не определяется. Не применяется в
safe mode.
-
mysqli.default_user string
Имя пользователя по умолчанию, чтобы использовать, соединяясь с
сервером базы данных, если никакое другое имя не определяется. Не применяется
в safe mode.
-
mysqli.default_pw string
Пароль по умолчанию, чтобы использовать, соединяясь с сервером базы
данных, если никакой другой пароль не определяется. Не применяется в
safe mode.
-
mysqli.reconnect integer
Автоматически снова соединитесь, если связь была потеряна.
Это проигнорировано mysqlnd.
-
mysqli.rollback_on_cached_plink
bool
Если этот выбор будет позволен, то закрытие постоянной связи будет
отменять любые отложенные транзакции этой связи, прежде чем это будет
отложено в постоянный пул связи. Иначе отложенные транзакции будут
откатываться только, когда связь будет снова использована, или когда она на
самом деле закрывается.
Пользователи не могут установить
MYSQL_OPT_READ_TIMEOUT
через вызов API или параметр конфигурации во время выполнения.
Обратите внимание на то, что, если бы это было возможно, были бы различия
между тем, как libmysqlclient
и потоки интерпретировали бы
MYSQL_OPT_READ_TIMEOUT .
3.3.4. Типы ресурсов
У этого расширения нет определенных типов ресурсов.
3.4. Расширение mysqli и постоянные связи
Постоянные соединения были введены в PHP 5.3 для
mysqli . Поддержка уже присутствовала в PDO MYSQL
и ext/mysql. Идея постоянных связей состоит в том, что связь между клиентским
процессом и базой данных может быть снова использована клиентским процессом,
вместо того, чтобы быть созданной и разрушенной многократно. Это уменьшает
накладные расходы создания новых связей каждый раз, когда требуется,
поскольку неиспользованные связи кэшируются
и готовы снова быть использованными.
В отличие от расширения mysql, mysqli не обеспечивает отдельную функцию
для открытия постоянных связей. Чтобы открыть постоянную связь, необходимо
предварительно добавить p:
к имени хоста, соединяясь.
Проблема с постоянными связями состоит в том, что их могут оставить в
непредсказуемых состояниях клиенты. Например, блокировка таблицы могла бы
быть активирована, прежде чем клиент неожиданно заканчивает работу.
Новый клиентский процесс, использующий эту постоянную связь, получит связь
как есть. Любая очистка должна была бы быть
сделана новым клиентским процессом, прежде чем он сможет хорошо использовать
постоянную связь, увеличив нагрузку на программиста.
Постоянная связь расширения mysqli , однако,
предоставляет встроенный код обработки очистки. Очистка, выполненная
mysqli включает:
Активные транзакции отменены.
Закрыты и удалены временные таблицы.
Разблокированы таблицы.
Перезагружены переменные сеанса.
Закрыты подготовленные запросы (всегда происходит с PHP).
Закрыты обработчики.
Сняты блокировки
GET_LOCK .
Это гарантирует, что постоянные связи находятся в чистом статусе
по возвращению из пула связи, прежде чем клиентский процесс
будет использовать их.
Расширение mysqli
делает эту очистку, автоматически вызывая функцию
C API mysql_change_user() .
У автоматической очистки есть преимущества и недостатки.
Преимущество состоит в том, что программист больше не должен волноваться о
коде очистки. Однако недостаток в том, что код может быть
немного медленнее, поскольку код очистки должен отработать каждый раз, когда
связь возвращена из пула.
Возможно выключить автоматический код очистки, собирая PHP с определением
MYSQLI_NO_CHANGE_USER_ON_PCONNECT .
Расширение mysqli
поддерживает постоянные связи, используя MySQL Native Driver или
MySQL Client Library.
3.5. Предопределенные константы
Константы ниже определяются этим расширением и будут доступны только,
когда расширение было собрано в PHP или динамично загружено
во время выполнения.
-
MYSQLI_READ_DEFAULT_GROUP
Прочитайте опции из названной группы в
my.cnf или файла, определенного с помощью
MYSQLI_READ_DEFAULT_FILE .
-
MYSQLI_READ_DEFAULT_FILE
Прочитайте опции из указанного файла вместо
my.cnf .
-
MYSQLI_OPT_CONNECT_TIMEOUT
Тайм-аут соединения в секундах.
-
MYSQLI_OPT_LOCAL_INFILE
Разрешить команду LOAD LOCAL INFILE .
-
MYSQLI_INIT_COMMAND
Команда, чтобы выполнить, соединяясь с сервером MySQL.
Будет автоматически повторно выполнена, соединяясь снова.
-
MYSQLI_CLIENT_SSL
Используйте SSL (зашифрованный протокол). Этот выбор не должен быть
установлен прикладными программами, это установлено внутренне в
библиотеке клиента MySQL.
-
MYSQLI_CLIENT_COMPRESS
Используйте сжатый протокол.
-
MYSQLI_CLIENT_INTERACTIVE
Позволить interactive_timeout секунд
(вместо wait_timeout секунд)
бездеятельности прежде, чем закрыть связь. Переменная сессии клиента
wait_timeout будет установлена в значение
переменной interactive_timeout сессии.
-
MYSQLI_CLIENT_IGNORE_SPACE
Позвольте пробелы после имен функций. Делает все зарезервированные
слова именами функций.
-
MYSQLI_CLIENT_NO_SCHEMA
Не позволяйте синтаксис
db_name.tbl_name.col_name .
-
MYSQLI_CLIENT_MULTI_QUERIES
Позволяет многократные разграниченные точкой с запятой запросы в
одном вызове
mysqli_query .
-
MYSQLI_STORE_RESULT
Для использования буферизированных наборов результатов.
-
MYSQLI_USE_RESULT
Для использования небуферизированных наборов результатов.
-
MYSQLI_ASSOC
Колонки возвращены во множество, имеющее имя поля как индекс массива.
-
MYSQLI_NUM
Колонки возвращены во множество, имеющее перечисленный индекс.
-
MYSQLI_BOTH
Колонки возвращены во множество, имеющее числовой индекс и
имя поля как ассоциативный индекс.
-
MYSQLI_NOT_NULL_FLAG
Указывает, что поле определяется как NOT
NULL .
-
MYSQLI_PRI_KEY_FLAG
Это поле часть основного индекса.
-
MYSQLI_UNIQUE_KEY_FLAG
Это поле часть уникального индекса.
-
MYSQLI_MULTIPLE_KEY_FLAG
Это поле часть индекса.
-
MYSQLI_BLOB_FLAG
Поле определяется как BLOB .
-
MYSQLI_UNSIGNED_FLAG
Поле определяется как UNSIGNED .
-
MYSQLI_ZEROFILL_FLAG
Поле определяется как ZEROFILL .
-
MYSQLI_AUTO_INCREMENT_FLAG
Поле определяется как AUTO_INCREMENT .
-
MYSQLI_TIMESTAMP_FLAG
Поле определяется как TIMESTAMP .
-
MYSQLI_SET_FLAG
Поле определяется как SET .
-
MYSQLI_NUM_FLAG
Поле определяется как NUMERIC .
-
MYSQLI_PART_KEY_FLAG
Это поле часть multi-index.
-
MYSQLI_GROUP_FLAG
Это поле часть GROUP BY .
-
MYSQLI_TYPE_DECIMAL
Поле определяется как DECIMAL .
-
MYSQLI_TYPE_NEWDECIMAL
Точность поля DECIMAL или
NUMERIC (MySQL 5.0.3 и выше).
-
MYSQLI_TYPE_BIT
Поле определяется как BIT
(MySQL 5.0.3 и выше).
-
MYSQLI_TYPE_TINY
Поле определяется как TINYINT .
-
MYSQLI_TYPE_SHORT
Поле определяется как SMALLINT .
-
MYSQLI_TYPE_LONG
Поле определяется как INT .
-
MYSQLI_TYPE_FLOAT
Поле определяется как FLOAT .
-
MYSQLI_TYPE_DOUBLE
Поле определяется как DOUBLE .
-
MYSQLI_TYPE_NULL
Поле определяется как DEFAULT NULL .
-
MYSQLI_TYPE_TIMESTAMP
Поле определяется как TIMESTAMP .
-
MYSQLI_TYPE_LONGLONG
Поле определяется как BIGINT .
-
MYSQLI_TYPE_INT24
Поле определяется как MEDIUMINT .
-
MYSQLI_TYPE_DATE
Поле определяется как DATE .
-
MYSQLI_TYPE_TIME .
Поле определяется как TIME .
-
MYSQLI_TYPE_DATETIME
Поле определяется как DATETIME .
-
MYSQLI_TYPE_YEAR
Поле определяется как YEAR .
-
MYSQLI_TYPE_NEWDATE
Поле определяется как DATE .
-
MYSQLI_TYPE_INTERVAL
Поле определяется как INTERVAL .
-
MYSQLI_TYPE_ENUM
Поле определяется как ENUM .
-
MYSQLI_TYPE_SET
Поле определяется как SET .
-
MYSQLI_TYPE_TINY_BLOB
Поле определяется как TINYBLOB .
-
MYSQLI_TYPE_MEDIUM_BLOB
Поле определяется как MEDIUMBLOB .
-
MYSQLI_TYPE_LONG_BLOB
Поле определяется как LONGBLOB .
-
MYSQLI_TYPE_BLOB
Поле определяется как BLOB .
-
MYSQLI_TYPE_VAR_STRING
Поле определяется как VARCHAR .
-
MYSQLI_TYPE_STRING
Поле определяется как CHAR или
BINARY .
-
MYSQLI_TYPE_CHAR
Поле определяется как TINYINT . Для
CHAR см.
MYSQLI_TYPE_STRING .
-
MYSQLI_TYPE_GEOMETRY
Поле определяется как GEOMETRY .
-
MYSQLI_NEED_DATA
Больше доступных данных для связанной переменной.
-
MYSQLI_NO_DATA
Больше нет доступных данных для связанной переменной.
-
MYSQLI_DATA_TRUNCATED
Усечение данных произошло.
Доступно, начиная с PHP 5.1.0 и MySQL 5.0.5.
-
MYSQLI_ENUM_FLAG
Поле определяется как ENUM .
Доступно, начиная с PHP 5.3.0.
-
MYSQLI_BINARY_FLAG
Поле определяется как BINARY .
Доступно, начиная с PHP 5.3.0.
-
MYSQLI_CURSOR_TYPE_FOR_UPDATE
-
MYSQLI_CURSOR_TYPE_NO_CURSOR
-
MYSQLI_CURSOR_TYPE_READ_ONLY
-
MYSQLI_CURSOR_TYPE_SCROLLABLE
-
MYSQLI_STMT_ATTR_CURSOR_TYPE
-
MYSQLI_STMT_ATTR_PREFETCH_ROWS
-
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
-
MYSQLI_SET_CHARSET_NAME
-
MYSQLI_REPORT_INDEX
Сообщает, если никакой индекс (или плохой индекс)
не использовался в запросе.
-
MYSQLI_REPORT_ERROR
Ошибка из вызова функции mysqli.
-
MYSQLI_REPORT_STRICT
Бросать mysqli_sql_exception
для ошибок вместо предупреждений.
-
MYSQLI_REPORT_ALL
Установить все опции в on.
-
MYSQLI_REPORT_OFF
Выключает сообщение.
-
MYSQLI_DEBUG_TRACE_ENABLED
Установлен в 1, если позволена функциональность
mysqli_debug .
-
MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED
-
MYSQLI_SERVER_QUERY_NO_INDEX_USED
-
MYSQLI_REFRESH_GRANT
Освежает таблицы привилегий.
-
MYSQLI_REFRESH_LOG
Сбросить все журналы, аналогично FLUSH LOGS
.
-
MYSQLI_REFRESH_TABLES
Сбросить все кэши таблиц, аналогично FLUSH
TABLES .
-
MYSQLI_REFRESH_HOSTS
Сбросить все кэши хостов, аналогично FLUSH
HOSTS .
-
MYSQLI_REFRESH_STATUS
Переустановить переменные статуса, аналогично
FLUSH STATUS .
-
MYSQLI_REFRESH_THREADS
Сбросить все кэши потоков.
-
MYSQLI_REFRESH_SLAVE
На подчиненном сервере репликации: перезагружает информацию о главном
сервере и перезапускает подчиненного.
Аналог RESET SLAVE .
-
MYSQLI_REFRESH_MASTER
На главном сервере репликации: удаляет двоичные файлы журнала,
перечисленные в двоичном индексе регистрации, и усекает индексный файл.
Аналог RESET MASTER .
-
MYSQLI_TRANS_COR_AND_CHAIN
Добавить "AND CHAIN" в
mysqli_commit или
mysqli_rollback .
-
MYSQLI_TRANS_COR_AND_NO_CHAIN
Добавить "AND NO CHAIN" в
mysqli_commit или
mysqli_rollback .
-
MYSQLI_TRANS_COR_RELEASE
Добавить "RELEASE" в
mysqli_commit или
mysqli_rollback .
-
MYSQLI_TRANS_COR_NO_RELEASE
Добавить "NO RELEASE" в
mysqli_commit или
mysqli_rollback .
-
MYSQLI_TRANS_START_READ_ONLY
Запустить транзакцию как "START TRANSACTION READ ONLY" с
mysqli_begin_transaction .
-
MYSQLI_TRANS_START_READ_WRITE
Запустить транзакцию как "START TRANSACTION READ WRITE" с
mysqli_begin_transaction .
-
MYSQLI_TRANS_START_CONSISTENT_SNAPSHOT
Запустить транзакцию как "START TRANSACTION WITH CONSISTENT SNAPSHOT"
с
mysqli_begin_transaction .
3.6. Замечания
Некоторые примечания внедрения:
Поддержка была добавлена для
MYSQL_TYPE_GEOMETRY в MySQLi в PHP 5.3.
Обратите внимание на различные внутренние реализации в
libmysqlclient и
mysqlnd для обработки колонок типа
MYSQL_TYPE_GEOMETRY .
Вообще говоря, mysqlnd
ассигнует значительно меньше памяти. Например, если есть столбец
POINT в наборе результатов,
libmysqlclient может предварительно ассигновать
до 4 ГБ RAM, хотя меньше чем 50 байтов необходимы для хранения
POINT в памяти. Выделение памяти будет намного
ниже, меньше 50 байтов, используя mysqlnd .
3.7. Резюме функций расширения MySQLi
Таблица 3.5. Резюме методов mysqli
Класс mysqli |
| |
|
Интерфейс OOP | Процедурный интерфейс |
Псевдоним (не используется) | Описание |
Свойства |
| |
|
$mysqli::affected_rows |
mysqli_affected_rows | N/A |
Получает количество затронутых строк в
предыдущей деятельности MySQL. |
$mysqli::client_info |
mysqli_get_client_info | N/A |
Возвращает версию клиента MySQL как строку. |
$mysqli::client_version |
mysqli_get_client_version | N/A |
Возвращает версию клиента MySQL как integer |
$mysqli::connect_errno |
mysqli_connect_errno | N/A |
Возвращает код ошибки от последнего соединения. |
$mysqli::connect_error |
mysqli_connect_error | N/A |
Возвращается описание последней ошибки соединения. |
$mysqli::errno |
mysqli_errno | N/A |
Возвращает код ошибки для нового вызова функции. |
$mysqli::error |
mysqli_error | N/A |
Возвращает описание последней ошибки. |
$mysqli::field_count |
mysqli_field_count | N/A |
Возвращает количество колонок для нового запроса. |
$mysqli::host_info |
mysqli_get_host_info | N/A |
Возвращает последовательность, представляющую
тип используемой связи. |
$mysqli::protocol_version |
mysqli_get_proto_info | N/A |
Возвращает версию используемого протокола MySQL. |
$mysqli::server_info |
mysqli_get_server_info | N/A |
Возвращает версию сервера MySQL. |
$mysqli::server_version |
mysqli_get_server_version | N/A |
Возвращает версию сервера MySQL как целое число. |
$mysqli::info |
mysqli_info | N/A |
Восстанавливает информацию о последнем выполненном запросе. |
$mysqli::insert_id |
mysqli_insert_id | N/A |
Возвращает id, используемый в последнем запросе. |
$mysqli::sqlstate |
mysqli_sqlstate | N/A |
Возвращает ошибку SQLSTATE из предыдущей деятельности MySQL. |
$mysqli::warning_count |
mysqli_warning_count | N/A |
Возвращает количество предупреждений из последнего запроса
для данной связи. |
Методы |
| |
|
mysqli::autocommit |
mysqli_autocommit | N/A |
Включает или отключает autocommit модификаций базы данных. |
mysqli::change_user |
mysqli_change_user | N/A |
Изменяет пользователя указанного соединения с базой данных. |
mysqli::character_set_name ,
mysqli::client_encoding |
mysqli_character_set_name |
mysqli_client_encoding |
Возвращает набор символов по умолчанию для
соединения с базой данных. |
mysqli::close |
mysqli_close | N/A |
Закрывает ранее открытое соединение с базой данных. |
mysqli::commit |
mysqli_commit | N/A |
Передает текущую транзакцию. |
mysqli::__construct |
mysqli_connect | N/A |
Открывает новую связь с сервером MySQL
[Примечание: статичный (т.е. класс) метод] |
mysqli::debug |
mysqli_debug | N/A |
Выполняет операции по отладке. |
mysqli::dump_debug_info |
mysqli_dump_debug_info | N/A |
Сбрасывает отладочную информацию в журнал. |
mysqli::get_charset |
mysqli_get_charset | N/A |
Возвращает объект набора символов. |
mysqli::get_connection_stats |
mysqli_get_connection_stats |
N/A | Статистика связи клиента. Доступно только с
mysqlnd. |
mysqli::get_client_info |
mysqli_get_client_info | N/A |
Возвращает версию клиента MySQL как последовательность. |
mysqli::get_client_stats |
mysqli_get_client_stats | N/A |
Вернет статистику для каждого процесса. Доступно только с
mysqlnd. |
mysqli::get_cache_stats |
mysqli_get_cache_stats | N/A |
Статистика кэша Zval клиента. Доступно только с
mysqlnd. |
mysqli::get_server_info |
mysqli_get_server_info | N/A |
Возвращает последовательность, представляющую версию сервера MySQL, с
которым связано расширение MySQLi. |
mysqli::get_warnings |
mysqli_get_warnings | N/A |
Недокументировано. |
mysqli::init |
mysqli_init | N/A |
Инициализирует MySQLi и возвращает ресурс для использования с
mysqli_real_connect. Не вызывает объект, поскольку это
возвращает объект $mysqli.] |
mysqli::kill |
mysqli_kill | N/A |
Просит сервер уничтожить поток MySQL. |
mysqli::more_results |
mysqli_more_results | N/A |
Проверяет, есть ли еще результаты из мультизапроса. |
mysqli::multi_query |
mysqli_multi_query | N/A |
Выполняет запрос на базе данных. |
mysqli::next_result |
mysqli_next_result | N/A |
Подготавливает следующий результат из multi_query |
mysqli::options |
mysqli_options |
mysqli_set_opt |
Устанавливает опции. |
mysqli::ping |
mysqli_ping | N/A |
Пингует связь сервера или пытается снова соединиться,
если связь отвалилась. |
mysqli::prepare |
mysqli_prepare | N/A |
Подготавливает SQL-оператор к выполнению. |
mysqli::query |
mysqli_query | N/A |
Выполняет запрос на базе данных. |
mysqli::real_connect |
mysqli_real_connect | N/A |
Открывает связь с сервером. |
mysqli::real_escape_string ,
mysqli::escape_string |
mysqli_real_escape_string |
mysqli_escape_string |
Экранирует специальные символы в последовательности для использования в
SQL-операторе, принимая во внимание текущий набор символов связи. |
mysqli::real_query |
mysqli_real_query | N/A |
Выполнит SQL-запрос. |
mysqli::refresh |
mysqli_refresh | N/A |
Сбрасывает кэши и таблицы или информацию о сервере репликации. |
mysqli::rollback |
mysqli_rollback | N/A |
Отменяет текущую транзакцию. |
mysqli::select_db |
mysqli_select_db | N/A |
Выбирает базу данных по умолчанию для запросов. |
mysqli::set_charset |
mysqli_set_charset | N/A |
Устанавливает набор символов клиента по умолчанию. |
mysqli::set_local_infile_default |
mysqli_set_local_infile_default |
N/A | Отменяет пользовательский обработчик команды
load local infile. |
mysqli::set_local_infile_handler |
mysqli_set_local_infile_handler |
N/A | Установить функцию обратного вызова для команды
LOAD DATA LOCAL INFILE. |
mysqli::ssl_set |
mysqli_ssl_set | N/A |
Используется для установления безопасных
соединений, используя SSL. |
mysqli::stat |
mysqli_stat | N/A |
Получает статус существующей системы. |
mysqli::stmt_init |
mysqli_stmt_init | N/A |
Инициализирует запрос и возвращает объект для использования с
mysqli_stmt_prepare. |
mysqli::store_result |
mysqli_store_result | N/A |
Передает набор результатов последнего запроса. |
mysqli::thread_id |
mysqli_thread_id | N/A |
Возвращает ID потока для текущей связи. |
mysqli::thread_safe |
mysqli_thread_safe | N/A |
Вернет, задана ли потокобезопасность или нет. |
mysqli::use_result |
mysqli_use_result | N/A |
Начинает поиск набора результатов. |
Таблица 3.6. Обзор методов mysqli_stmt
Таблица 3.7. Обзор методов mysqli_result
Таблица 3.8. Обзор методов mysqli_driver
Псевдонимы обеспечиваются только для целей обратной совместимости.
Не используйте их в новых проектах.
3.8. Примеры
3.8.1. Основные примеры MySQLi
Этот пример показывает как соединиться, выполнить запрос, использовать
основную обработку ошибок, напечатать получающиеся строки и отсоединиться от
базы данных MySQL.
Этот пример использует базу данных Sakila в свободном доступе, которая
может быть загружена с
dev.mysql.com. Чтобы заставить этот пример работать,
(a) установите sakila и (b) измените переменные связи
(host, your_user, your_pass).
Пример 3.30. Обзор расширения MySQLi
<?php
// Let's pass in a $_GET variable to our example, in this case
// it's aid for actor_id in our Sakila database. Let's make it
// default to 1, and cast it to an integer as to avoid SQL injection
// and/or related security problems. Handling all of this goes beyond
// the scope of this simple example. Example:
// http://example.org/script.php?aid=42
if (isset($_GET['aid']) && is_numeric($_GET['aid']))
{
$aid = (int) $_GET['aid'];
} else {
$aid = 1;
}
// Connecting to and selecting a MySQL database named sakila
// Hostname: 127.0.0.1, username: your_user, password: your_pass, db: sakila
$mysqli = new mysqli('127.0.0.1', 'your_user', 'your_pass', 'sakila');
// Oh no! A connect_errno exists so the connection attempt failed!
if ($mysqli->connect_errno)
{
// The connection failed. What do you want to do?
// You could contact yourself (email?), log the error, show a nice page, etc.
// You do not want to reveal sensitive information
// Let's try this:
echo "Sorry, this website is experiencing problems.";
// Something you should not do on a public site, but this Пример will show you
// anyways, is print out MySQL error related information -- you might log this
echo "Error: Failed to make a MySQL connection, here is why: \n";
echo "Errno: " . $mysqli->connect_errno . "\n";
echo "Error: " . $mysqli->connect_error . "\n";
// You might want to show them something nice, but we will simply exit
exit;
}
// Perform an SQL query
$sql = "SELECT actor_id, first_name, last_name FROM actor WHERE actor_id = $aid";
if (!$result = $mysqli->query($sql))
{
// Oh no! The query failed.
echo "Sorry, the website is experiencing problems.";
// Again, do not do this on a public site, but we'll show you how
// to get the error information
echo "Error: Our query failed to execute and here is why: \n";
echo "Query: " . $sql . "\n";
echo "Errno: " . $mysqli->errno . "\n";
echo "Error: " . $mysqli->error . "\n";
exit;
}
// Phew, we made it. We know our MySQL connection and query
// succeeded, but do we have a result?
if ($result->num_rows === 0)
{
// Oh, no rows! Sometimes that's expected and okay, sometimes
// it is not. You decide. In this case, maybe actor_id was too large?
echo "We could not find a match for ID $aid, sorry about that. Please try again.";
exit;
}
// Now, we know only one result will exist in this Пример so let's
// fetch it into an associated array where the array's keys are the
// table's column names
$actor = $result->fetch_assoc();
echo "Sometimes I see " . $actor['first_name'] . " " . $actor['last_name'] . " on TV.";
// Now, let's fetch five random actors and output their names to a list.
// We'll add less error handling here as you can do that on your own now
$sql = "SELECT actor_id, first_name, last_name FROM actor ORDER BY rand() LIMIT 5";
if (!$result = $mysqli->query($sql))
{
echo "Sorry, the website is experiencing problems.";
exit;
}
// Print our 5 random actors in a list, and link to each actor
echo "<ul>\n";
while ($actor = $result->fetch_assoc())
{
echo "<li><a href='" . $_SERVER['SCRIPT_FILENAME'] . "?aid=" . $actor['actor_id'] . "'>\n";
echo $actor['first_name'] . ' ' . $actor['last_name'];
echo "</a></li>\n";
}
echo "</ul>\n";
// The script will automatically free the result and close the MySQL
// connection when it exits, but let's just do it anyways
$result->free();
$mysqli->close();
?>
3.9. Класс mysqli
Представляет связь между PHP и базой данных MySQL.
mysqli {
mysqli
Properties int mysqli->affected_rows ;
int mysqli->connect_errno ;
string mysqli->connect_error ;
int mysqli->errno ;
array mysqli->error_list ;
string mysqli->error ;
int mysqli->field_count ;
string mysqli->client_info ;
int mysqli->client_version ;
string mysqli->host_info ;
string mysqli->protocol_version ;
string mysqli->server_info ;
int mysqli->server_version ;
string mysqli->info ;
mixed mysqli->insert_id ;
string mysqli->sqlstate ;
int mysqli->thread_id ;
int mysqli->warning_count ;
Methods mysqli::__construct(
string host= =ini_get("mysqli.default_host"),
string username= =ini_get("mysqli.default_user"),
string passwd= =ini_get("mysqli.default_pw"),
string dbname= ="",
int port= =ini_get("mysqli.default_port"),
string socket= =ini_get("mysqli.default_socket"));
bool mysqli::autocommit(bool mode);
bool mysqli::change_user(string user,
string password,
string database);
string mysqli::character_set_name();
bool mysqli::close();
bool mysqli::commit(
int flags= =0,
string name);
void mysqli::connect(
string host= =ini_get("mysqli.default_host"),
string username= =ini_get("mysqli.default_user"),
string passwd= =ini_get("mysqli.default_pw"),
string dbname= ="",
int port= =ini_get("mysqli.default_port"),
string socket= =ini_get("mysqli.default_socket"));
bool mysqli::debug(string message);
bool mysqli::dump_debug_info();
object mysqli::get_charset();
string mysqli::get_client_info();
bool mysqli::get_connection_stats();
string mysqli_stmt::get_server_info();
mysqli_warning mysqli::get_warnings();
mysqli mysqli::init();
bool mysqli::kill(int processid);
bool mysqli::more_results();
bool mysqli::multi_query(string query);
bool mysqli::next_result();
bool mysqli::options(int option,
mixed value);
bool mysqli::ping();
public static int mysqli::poll(array read,
array error,
array reject,
int sec,
int usec= =0);
mysqli_stmt mysqli::prepare(string query);
mixed mysqli::query(string query,
int resultmode= =MYSQLI_STORE_RESULT);
bool mysqli::real_connect(string host,
string username,
string passwd,
string dbname,
int port,
string socket,
int flags);
string mysqli::escape_string(string escapestr);
string mysqli::real_escape_string(string escapestr);
bool mysqli::real_query(string query);
public mysqli_result mysqli::reap_async_query();
public bool mysqli::refresh(int options);
bool mysqli::rollback(int flags= =0,
string name);
int mysqli::rpl_query_type(string query);
bool mysqli::select_db(string dbname);
bool mysqli::send_query(string query);
bool mysqli::set_charset(string charset);
bool mysqli::set_local_infile_handler(mysqli link,
callable read_func);
bool mysqli::ssl_set(string key,
string cert,
string ca,
string capath,
string cipher);
string mysqli::stat();
mysqli_stmt mysqli::stmt_init();
mysqli_result mysqli::store_result(int option);
mysqli_result mysqli::use_result();
}
3.9.1. mysqli::$affected_rows ,
mysqli_affected_rows
Описание
Объектный стиль
int mysqli->affected_rows ;
Процедурный стиль
int mysqli_affected_rows(
mysqli link);
Возвращает количество строк, затронутых последним запросом
INSERT , UPDATE ,
REPLACE или
DELETE .
Для операторов SELECT
mysqli_affected_rows работает аналогично
mysqli_num_rows .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Целое число, больше, чем ноль, указывает на количество строк, затронутых
или полученных. Ноль указывает, что никакие записи не были обновлены для
запросы UPDATE, никакие строки не подобраны
WHERE в запросе или что никакой запрос еще не
был выполнен. -1 указывает, что запрос возвратил ошибку.
Если количество затронутых строк больше, чем максимальное целочисленное
значение (PHP_INT_MAX ),
количество затронутых строк будет возвращено как последовательность.
Примеры
Пример 3.31. $mysqli->affected_rows
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Insert rows */
$mysqli->query("CREATE TABLE Language SELECT * from CountryLanguage");
printf("Affected rows (INSERT): %d\n", $mysqli->affected_rows);
$mysqli->query("ALTER TABLE Language ADD Status int default 0");
/* update rows */
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Affected rows (UPDATE): %d\n", $mysqli->affected_rows);
/* delete rows */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", $mysqli->affected_rows);
/* select all rows */
$result = $mysqli->query("SELECT CountryCode FROM Language");
printf("Affected rows (SELECT): %d\n", $mysqli->affected_rows);
$result->close();
/* Delete table Language */
$mysqli->query("DROP TABLE Language");
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
if (!$link)
{
printf("Can't connect to localhost. Error: %s\n", mysqli_connect_error());
exit();
}
/* Insert rows */
mysqli_query($link, "CREATE TABLE Language SELECT * from CountryLanguage");
printf("Affected rows (INSERT): %d\n", mysqli_affected_rows($link));
mysqli_query($link, "ALTER TABLE Language ADD Status int default 0");
/* update rows */
mysqli_query($link, "UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Affected rows (UPDATE): %d\n", mysqli_affected_rows($link));
/* delete rows */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", mysqli_affected_rows($link));
/* select all rows */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("Affected rows (SELECT): %d\n", mysqli_affected_rows($link));
mysqli_free_result($result);
/* Delete table Language */
mysqli_query($link, "DROP TABLE Language");
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Affected rows (INSERT): 984
Affected rows (UPDATE): 168
Affected rows (DELETE): 815
Affected rows (SELECT): 169
См. также
3.9.2. mysqli::autocommit ,
mysqli_autocommit
Описание
Объектный стиль
bool mysqli::autocommit(
bool mode);
Процедурный стиль
bool mysqli_autocommit(
mysqli link,
bool mode);
Включает или выключает режим autocommit.
Чтобы определить текущее состояние autocommit, используют команду SQL
SELECT @@autocommit .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
mode
Включен или нет autocommit.
Возвращаемое значение
Returns TRUE при успехе или
FALSE при ошибке.
Примечания
Эта функция не работает с нетранзакционными типами таблиц
(как MyISAM или ISAM).
Примеры
Пример 3.32.
mysqli::autocommit
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* turn autocommit on */
$mysqli->autocommit(TRUE);
if ($result = $mysqli->query("SELECT @@autocommit"))
{
$row = $result->fetch_row();
printf("Autocommit is %s\n", $row[0]);
$result->free();
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
if (!$link)
{
printf("Can't connect to localhost. Error: %s\n", mysqli_connect_error());
exit();
}
/* turn autocommit on */
mysqli_autocommit($link, TRUE);
if ($result = mysqli_query($link, "SELECT @@autocommit"))
{
$row = mysqli_fetch_row($result);
printf("Autocommit is %s\n", $row[0]);
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Autocommit is 1
См. также
3.9.3. mysqli::begin_transaction ,
mysqli_begin_transaction
Описание
Объектный стиль (method):
public bool mysqli::begin_transaction
(int flags= =0,
string name);
Процедурный стиль:
bool mysqli_begin_transaction(
mysqli link,
int flags= =0,
string name);
Начинает транзакцию. Требует механизма InnoDB (он позволен по умолчанию).
Для дополнительных деталей о том, как транзакции MySQL работают, см.
http://dev.mysql.com/doc/mysql/en/commit.html.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init
flags
Действительные флаги:
MYSQLI_TRANS_START_READ_ONLY :
Начните транзакцию как "START TRANSACTION READ ONLY".
Требует MySQL 5.6 и выше.
MYSQLI_TRANS_START_READ_WRITE :
Начните транзакцию как "START TRANSACTION READ WRITE".
Требует MySQL 5.6 и выше.
MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT
: Начните транзакцию как "START TRANSACTION WITH CONSISTENT SNAPSHOT".
name
Название точки сохранения транзакции.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.33.
$mysqli->begin_transaction
Объектный стиль
<?php
$mysqli = new mysqli("127.0.0.1", "my_user", "my_password", "sakila");
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY);
$mysqli->query("SELECT first_name, last_name FROM actor");
$mysqli->commit();
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_begin_transaction($link, MYSQLI_TRANS_START_READ_ONLY);
mysqli_query($link, "SELECT first_name, last_name FROM actor LIMIT 1");
mysqli_commit($link);
mysqli_close($link);
?>
См. также
3.9.4. mysqli::change_user ,
mysqli_change_user
Описание
Объектный стиль
bool mysqli::change_user(
string user,
string password,
string database);
Процедурный стиль
bool mysqli_change_user(
mysqli link,
string user,
string password,
string database);
Изменяет пользователя указанного соединения с базой данных и устанавливает
текущую базу данных.
Чтобы успешно изменить пользователя, действительные параметры
username и password
должны быть обеспечены, и у того пользователя должны быть достаточные
полномочия, чтобы получить доступ к желаемой базе данных. Если по какой-либо
причине разрешение потерпит неудачу, текущая
аутентификация пользователя останется.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
user
Имя пользователя MySQL.
password
Пароль MySQL.
database
База данных, на которую изменить.
При желании значение NULL
может быть передано, приведя только к изменению пользователя без выбора базы
данных. Чтобы выбрать базу данных в этом случае используют функцию
mysqli_select_db .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примечания
Использование этой команды будет всегда заставлять текущее соединение с
базой данных вести себя, как будто это было абсолютно новое соединение с
базой данных, независимо от того, была ли операция закончена успешно.
Этот сброс включает выполнение отмены любых активных транзакциях, закрытия
всех временных таблиц и разблокировки всех заблокированных таблиц.
Примеры
Пример 3.34.
mysqli::change_user
Объектный стиль
<?php
/* connect database test */
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Set Variable a */
$mysqli->query("SET @a:=1");
/* reset all and select a new database */
$mysqli->change_user("my_user", "my_password", "world");
if ($result = $mysqli->query("SELECT DATABASE()"))
{
$row = $result->fetch_row();
printf("Default database: %s\n", $row[0]);
$result->close();
}
if ($result = $mysqli->query("SELECT @a"))
{
$row = $result->fetch_row();
if ($row[0] === NULL)
{
printf("Value of variable a is NULL\n");
}
$result->close();
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
/* connect database test */
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Set Variable a */
mysqli_query($link, "SET @a:=1");
/* reset all and select a new database */
mysqli_change_user($link, "my_user", "my_password", "world");
if ($result = mysqli_query($link, "SELECT DATABASE()"))
{
$row = mysqli_fetch_row($result);
printf("Default database: %s\n", $row[0]);
mysqli_free_result($result);
}
if ($result = mysqli_query($link, "SELECT @a"))
{
$row = mysqli_fetch_row($result);
if ($row[0] === NULL)
{
printf("Value of variable a is NULL\n");
}
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Default database: world
Value of variable a is NULL
См. также
3.9.5. mysqli::character_set_name ,
mysqli_character_set_name
mysqli::character_set_name
mysqli_character_set_name
Возвращает набор символов по умолчанию для соединения с базой данных.
Описание
Объектный стиль
string mysqli::character_set_name();
Процедурный стиль
string mysqli_character_set_name(
mysqli link);
Возвращает текущий набор символов для соединения с базой данных.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Набор символов по умолчанию для текущей связи.
Примеры
Пример 3.35.
mysqli::character_set_name
Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Print current character set */
$charset = $mysqli->character_set_name();
printf ("Current character set is %s\n", $charset);
$mysqli->close();
?>
Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Print current character set */
$charset = mysqli_character_set_name($link);
printf ("Current character set is %s\n",$charset);
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Current character set is latin1_swedish_ci
См. также
3.9.6.
mysqli::close , mysqli_close
Описание
Объектный стиль
bool mysqli::close();
Процедурный стиль
bool mysqli_close(
mysqli link);
Закрывает ранее открытое соединение с базой данных.
Откройте непостоянное подключение mysql, и наборы результатов
автоматически будут разрушены, когда скрипт PHP заканчивает свое выполнение.
Это немедленно возвратит ресурсы к PHP и MySQL, что может улучшить работу.
Для соответствующей информации посмотрите
freeing resources.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
См.
mysqli_connect .
Примечания
mysqli_close не закроет постоянные связи. Для дополнительных
деталей см. страницу руководства на
persistent connections.
См. также
3.9.7.
mysqli::commit , mysqli_commit
Описание
Объектный стиль
bool mysqli::commit(int
flags= =0,
string name);
Процедурный стиль
bool mysqli_commit(mysqli
link,
int flags= =0,
string name);
Передает текущую транзакцию для соединения с базой данных.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
flags
Битовая маска констант
MYSQLI_TRANS_COR_* .
name
Если обеспечено, тогда выполнено
COMMIT/*name*/ .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Журнал изменений
Версия |
Описание |
5.5.0 |
Добавлены параметры flags
и name . |
Примеры
Пример 3.36.
mysqli::commit
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");
/* set autocommit to off */
$mysqli->autocommit(FALSE);
/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
if (!$mysqli->commit())
{
print("Transaction commit failed\n");
exit();
}
/* drop table */
$mysqli->query("DROP TABLE Language");
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* set autocommit to off */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
/* Insert some values */
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
if (!mysqli_commit($link))
{
print("Transaction commit failed\n");
exit();
}
/* close connection */
mysqli_close($link);
?>
См. также
3.9.8.
mysqli::$connect_errno ,
mysqli_connect_errno
Описание
Объектный стиль
int mysqli->connect_errno ;
Процедурный стиль
int mysqli_connect_errno();
Возвращает последний код ошибки из последнего вызова
mysqli_connect .
Номера сообщений об ошибках клиента перечисляются в заголовочном файле
MySQL errmsg.h , сообщения об ошибках сервера
перечисляются в mysqld_error.h .
В исходных текстах MySQL можно найти полный список сообщений об ошибках и
кодов ошибок в файле Docs/mysqld_error.txt .
Возвращаемое значение
Значение кода ошибки для последнего обращения к
mysqli_connect , если это потерпело неудачу. Ноль означает, что
никакая ошибка не произошла.
Примеры
Пример 3.37.
$mysqli->connect_errno
Объектный стиль
<?php
$mysqli = @new mysqli('localhost', 'fake_user', 'my_password', 'my_db');
if ($mysqli->connect_errno)
{
die('Connect Error: ' . $mysqli->connect_errno);
}
?>
Процедурный стиль
<?php
$link = @mysqli_connect('localhost', 'fake_user', 'my_password', 'my_db');
if (!$link)
{
die('Connect Error: ' . mysqli_connect_errno());
}
?>
Вышеупомянутые примеры произведут:
Connect Error: 1045
См. также
3.9.9.
mysqli::$connect_error ,
mysqli_connect_error
Описание
Объектный стиль
string mysqli->connect_error ;
Процедурный стиль
string mysqli_connect_error();
Возвращает строку последнего сообщения об ошибке из последнего вызова
mysqli_connect .
Возвращаемое значение
Последовательность, которая описывает ошибку.
NULL возвращен, если никакая
ошибка не произошла.
Примеры
Пример 3.38.
$mysqli->connect_error
Объектный стиль
<?php
$mysqli = @new mysqli('localhost', 'fake_user', 'my_password', 'my_db');
// Works с PHP 5.2.9 and 5.3.0.
if ($mysqli->connect_error)
{
die('Connect Error: ' . $mysqli->connect_error);
}
?>
Процедурный стиль
<?php
$link = @mysqli_connect('localhost', 'fake_user', 'my_password', 'my_db');
if (!$link)
{
die('Connect Error: ' . mysqli_connect_error());
}
?>
Вышеупомянутые примеры произведут:
Connect Error: Access denied for user 'fake_user'@'localhost'
(using password: YES)
Примечания
Свойство mysqli->connect_error работает правильно начиная с версий
5.2.9 и 5.3.0 PHP. Используйте
mysqli_connect_error , если совместимость с ранее
версиями PHP требуется.
См. также
3.9.10.
mysqli::__construct ,
mysqli::connect ,
mysqli_connect
Описание
Объектный стиль
mysqli::__construct(
string host= =ini_get("mysqli.default_host"),
string username
= =ini_get("mysqli.default_user"),
string passwd
= =ini_get("mysqli.default_pw"),
string dbname= ="",
int port
= =ini_get("mysqli.default_port"),
string socket
= =ini_get("mysqli.default_socket"));
void mysqli::connect(string
host= =ini_get("mysqli.default_host"),
string username
= =ini_get("mysqli.default_user"),
string passwd
= =ini_get("mysqli.default_pw"),
string dbname= ="",
int port
= =ini_get("mysqli.default_port"),
string socket
= =ini_get("mysqli.default_socket"));
Процедурный стиль
mysqli mysqli_connect(string
host= =ini_get("mysqli.default_host"),
string username
= =ini_get("mysqli.default_user"),
string passwd
= =ini_get("mysqli.default_pw"),
string dbname= ="",
int port
= =ini_get("mysqli.default_port"),
string socket
= =ini_get("mysqli.default_socket"));
Открывает связь с MySQL Server.
Параметры
host
Может быть именем хоста или IP-адресом. Значение
NULL или строка "localhost"
означает локальную машину. Когда возможно, каналы
будут использоваться вместо протокола TCP/IP.
Предварительное указание префикса p:
открывает постоянную связь.
mysqli_change_user
автоматически вызван на связях, открытых из пула.
username
Имя пользователя MySQL.
passwd
Если не обеспечен или NULL , MySQL
попытается подтвердить подлинность пользователя только для записей, у которых
нет пароля. Это позволяет одному имени пользователя использоваться с
различными разрешениями (в зависимости от того, если или нет пароль).
dbname
Если обеспечено определит базу данных по умолчанию, которая будет
использоваться, выполняя запросы.
port
Определяет номер порта, чтобы попытаться
соединиться с сервером MySQL.
socket
Определяет сокет или именованный канал,
который должен использоваться.
Определение параметра socket явно не определит тип
связи, которая будет использоваться, соединяясь с сервером MySQL. То, как
связь установлена с базой данных MySQL, определяется параметром
host .
Возвращаемое значение
Возвращает объект, который представляет связь с MySQL
Server, или FALSE при ошибке.
Журнал изменений
Версия |
Описание |
5.3.0 |
Добавлена возможность постоянных связей. |
Примеры
Пример 3.39.
mysqli::__construct
Объектный стиль
<?php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
/*
* This is the "official" OO way to do it,
* BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
*/
if ($mysqli->connect_error)
{
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
/*
* Use this instead of $connect_error if you need to ensure
* compatibility with PHP versions prior to 5.2.9 and 5.3.0.
*/
if (mysqli_connect_error())
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
Объектный стиль, расширяя класс mysqli
<?php
class foo_mysqli extends mysqli
{
public function __construct($host, $user, $pass, $db)
{
parent::__construct($host, $user, $pass, $db);
if (mysqli_connect_error())
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
}
$db = new foo_mysqli('localhost', 'my_user', 'my_password', 'my_db');
echo 'Success... ' . $db->host_info . "\n";
$db->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
if (!$link)
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . mysqli_get_host_info($link) . "\n";
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Success... MySQL host info: localhost via TCP/IP
Примечания
MySQLnd всегда принимает набор символов сервера по умолчанию. Этот набор
символов посылают во время идентификации связи, которую
будет использовать mysqlnd.
Libmysqlclient использует набор символов по умолчанию, заданный в
my.cnf или явным вызовом
mysqli_options до вызова
mysqli_real_connect , но после
mysqli_init .
Объектно-ориентированный синтаксис: Если связь прерывается, объект все еще
возвращен. Чтобы проверить, используется ли связь, примените функцию
mysqli_connect_error или свойство
mysqli->connect_error
, как в предыдущих примерах.
Если необходимо установить варианты, такие как тайм-аут связи,
mysqli_real_connect должен использоваться вместо этого.
Запрос конструктора без параметров совпадает с запросом
mysqli_init .
Ошибка "Can't create TCP/IP socket (10106)" обычно значит,
что директива конфигурации
variables_order не содержит символ
E . В Windows если окружающая среда не
копируется, переменная окружения SYSTEMROOT
не будет доступна, и у PHP будут проблемы при загрузке Winsock.
См. также
3.9.11.
mysqli::debug ,
mysqli_debug
Описание
Объектный стиль
bool mysqli::debug(string
message);
Процедурный стиль
bool mysqli_debug(string
message);
Выполняет операции по отладке, пользующиеся библиотекой
отладки Fred Fish.
Параметры
message
Последовательность, представляющая операцию по отладке.
Возвращаемое значение
Вернет TRUE .
Примечания
Чтобы использовать функцию
mysqli_debug , необходимо собрать библиотеку клиента MySQL,
чтобы поддерживать отладку.
Примеры
Пример 3.40.
Создание трассировочного файла
<?php
/* Create a trace file in '/tmp/client.trace' on the local (client) machine: */
mysqli_debug("d:t:o,/tmp/client.trace");
?>
См. также
3.9.12.
mysqli::dump_debug_info ,
mysqli_dump_debug_info
Описание
Объектный стиль
bool mysqli::dump_debug_info();
Процедурный стиль
bool mysqli_dump_debug_info(
mysqli link);
Эта функция разработана, чтобы быть выполненной пользователем с
привилегией SUPER и используется, чтобы сбросить отладочную информацию в
журнал MySQL Server.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect
или
mysqli_init
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.9.13. mysqli::$errno ,
mysqli_errno
Описание
Объектный стиль
int mysqli->errno ;
Процедурный стиль
int mysqli_errno(mysqli
link);
Возвращает последний код ошибки для нового вызова функции MySQLi, которая
может иметь успех или потерпеть неудачу.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Значение кода ошибки для последнего вызова, если это потерпело неудачу.
Ноль означает, что никакая ошибка не произошла.
Примеры
Пример 3.41.
$mysqli->errno
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if (!$mysqli->query("SET a=1"))
{
printf("Errorcode: %d\n", $mysqli->errno);
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if (!mysqli_query($link, "SET a=1"))
{
printf("Errorcode: %d\n", mysqli_errno($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Errorcode: 1193
См. также
3.9.14.
mysqli::$error_list ,
mysqli_error_list
Описание
Объектный стиль
array mysqli->error_list ;
Процедурный стиль
array mysqli_error_list(mysqli
link);
Возвращает множество ошибок для нового вызова функции MySQLi, который
может иметь успех или потерпеть неудачу.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init
.
Возвращаемое значение
Список ошибок, каждый элемент которого ассоциативный массив,
содержащий errno, ошибку и sqlstate.
Примеры
Пример 3.42.
$mysqli->error_list
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "nobody", "");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if (!$mysqli->query("SET a=1"))
{
print_r($mysqli->error_list);
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if (!mysqli_query($link, "SET a=1"))
{
print_r(mysqli_error_list($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Array
(
[0] => Array
(
[errno] => 1193
[sqlstate] => HY000
[error] => Unknown system variable 'a'
)
)
См. также
3.9.15.
mysqli::$error ,
mysqli_error
Описание
Объектный стиль
string mysqli->error ;
Процедурный стиль
string mysqli_error(mysqli
link);
Возвращает последнее сообщение об ошибке для нового вызова функции MySQLi,
который может иметь успех или потерпеть неудачу.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Последовательность, которая описывает ошибку. Пустая строка, если никакая
ошибка не произошла.
Примеры
Пример 3.43.
$mysqli->error
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if (!$mysqli->query("SET a=1"))
{
printf("Error message: %s\n", $mysqli->error);
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if (!mysqli_query($link, "SET a=1"))
{
printf("Error message: %s\n", mysqli_error($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error message: Unknown system variable 'a'
См. также
3.9.16.
mysqli::$field_count ,
mysqli_field_count
Описание
Объектный стиль
int mysqli->field_count ;
Процедурный стиль
int mysqli_field_count(mysqli
link);
Возвращает количество столбцов для нового запроса на связи, представленной
параметром link .
Эта функция может быть полезной, используя функцию
mysqli_store_result , чтобы определить,
должен ли запрос был произвести непустой набор результатов или не
зная природу запроса.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Целое число, представляющее количество полей в наборе результатов.
Примеры
Пример 3.44.
$mysqli->field_count
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
$mysqli->query( "DROP TABLE IF EXISTS friends");
$mysqli->query( "CREATE TABLE friends (id int, name varchar(20))");
$mysqli->query( "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
$mysqli->real_query("SELECT * FROM friends");
if ($mysqli->field_count)
{
/* this was a select/show or describe query */
$result = $mysqli->store_result();
/* process resultset */
$row = $result->fetch_row();
/* free resultset */
$result->close();
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
mysqli_query($link, "DROP TABLE IF EXISTS friends");
mysqli_query($link, "CREATE TABLE friends (id int, name varchar(20))");
mysqli_query($link, "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
mysqli_real_query($link, "SELECT * FROM friends");
if (mysqli_field_count($link))
{
/* this was a select/show or describe query */
$result = mysqli_store_result($link);
/* process resultset */
$row = mysqli_fetch_row($result);
/* free resultset */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
3.9.17.
mysqli::get_charset ,
mysqli_get_charset
Описание
Объектный стиль
object mysqli::get_charset();
Процедурный стиль
object mysqli_get_charset(mysqli
link);
Возвращает объект набора символов, обеспечивающий несколько свойств
текущего активного набора символов.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Функция возвращает объект набора символов со следующими свойствами:
charset
Имя набора символов.
collation
Имя сопоставления.
dir
Каталог, откуда было получено описание набора символов, (?)
или "" для встроенных наборов символов.
min_length
Минимальная длина символа в байтах.
max_length
Максимальная длина символа в байтах.
number
Внутренний номер набора символов.
state
Статус набора символов.
Примеры
Пример 3.45.
mysqli::get_charset
Объектный стиль
<?php
$db = mysqli_init();
$db->real_connect("localhost","root","","test");
var_dump($db->get_charset());
?>
Процедурный стиль
<?php
$db = mysqli_init();
mysqli_real_connect($db, "localhost","root","","test");
var_dump(mysqli_get_charset($db));
?>
Вышеупомянутые примеры произведут:
object(stdClass)#2 (7)
{
["charset"]=>
string(6) "latin1"
["collation"]=>
string(17) "latin1_swedish_ci"
["dir"]=>
string(0) ""
["min_length"]=>
int(1)
["max_length"]=>
int(1)
["number"]=>
int(8)
["state"]=>
int(801)
}
См. также
3.9.18.
mysqli::$client_info ,
mysqli::get_client_info ,
mysqli_get_client_info
Описание
Объектный стиль
string mysqli->client_info ;
string mysqli::get_client_info();
Процедурный стиль
string mysqli_get_client_info(
mysqli link);
Последовательность, которая представляет версию
библиотеки клиента MySQL.
Возвращаемое значение
Возвращает последовательность, которая представляет версию
библиотеки клиента MySQL.
Примеры
Пример 3.46.
mysqli_get_client_info
<?php
/* We don't need a connection to determine
the version of mysql client library */
printf("Client library version: %s\n", mysqli_get_client_info());
?>
См. также
3.9.19.
mysqli::$client_version ,
mysqli_get_client_version
Описание
Объектный стиль
int mysqli->client_version ;
Процедурный стиль
int mysqli_get_client_version(
mysqli link);
Номер версии клиента вернет как целое число.
Возвращаемое значение
Число, которое представляет версию библиотеки клиента MySQL в формате:
main_version*10000 + minor_version *100 +
sub_version . Например, 4.1.0 представлена как 40100.
Это полезно, чтобы быстро определить версию библиотеки клиента, чтобы
знать, существует ли некоторая способность.
Примеры
Пример 3.47.
mysqli_get_client_version
<?php
/* We don't need a connection to determine
the version of mysql client library */
printf("Client library version: %d\n", mysqli_get_client_version());
?>
См. также
3.9.20.
mysqli::get_connection_stats ,
mysqli_get_connection_stats
mysqli::get_connection_stats
mysqli_get_connection_stats
Статистика о связи клиента.
Описание
Объектный стиль
bool mysqli::get_connection_stats();
Процедурный стиль
array mysqli_get_connection_stats(
mysqli link);
Статистика о связи клиента. Доступна только с
mysqlnd.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Возвращает множество со статистикой связи если успех,
FALSE иначе.
Примеры
Пример 3.48.
mysqli_get_connection_stats
<?php
$link = mysqli_connect();
print_r(mysqli_get_connection_stats($link));
?>
Вышеупомянутый пример произведет что-то подобное:
Array
(
[bytes_sent] => 43
[bytes_received] => 80
[packets_sent] => 1
[packets_received] => 2
[protocol_overhead_in] => 8
[protocol_overhead_out] => 4
[bytes_received_ok_packet] => 11
[bytes_received_eof_packet] => 0
[bytes_received_rset_header_packet] => 0
[bytes_received_rset_field_meta_packet] => 0
[bytes_received_rset_row_packet] => 0
[bytes_received_prepare_response_packet] => 0
[bytes_received_change_user_packet] => 0
[packets_sent_command] => 0
[packets_received_ok] => 1
[packets_received_eof] => 0
[packets_received_rset_header] => 0
[packets_received_rset_field_meta] => 0
[packets_received_rset_row] => 0
[packets_received_prepare_response] => 0
[packets_received_change_user] => 0
[result_set_queries] => 0
[non_result_set_queries] => 0
[no_index_used] => 0
[bad_index_used] => 0
[slow_queries] => 0
[buffered_sets] => 0
[unbuffered_sets] => 0
[ps_buffered_sets] => 0
[ps_unbuffered_sets] => 0
[flushed_normal_sets] => 0
[flushed_ps_sets] => 0
[ps_prepared_never_executed] => 0
[ps_prepared_once_executed] => 0
[rows_fetched_from_server_normal] => 0
[rows_fetched_from_server_ps] => 0
[rows_buffered_from_client_normal] => 0
[rows_buffered_from_client_ps] => 0
[rows_fetched_from_client_normal_buffered] => 0
[rows_fetched_from_client_normal_unbuffered] => 0
[rows_fetched_from_client_ps_buffered] => 0
[rows_fetched_from_client_ps_unbuffered] => 0
[rows_fetched_from_client_ps_cursor] => 0
[rows_skipped_normal] => 0
[rows_skipped_ps] => 0
[copy_on_write_saved] => 0
[copy_on_write_performed] => 0
[command_buffer_too_small] => 0
[connect_success] => 1
[connect_failure] => 0
[connection_reused] => 0
[reconnect] => 0
[pconnect_success] => 0
[active_connections] => 1
[active_persistent_connections] => 0
[explicit_close] => 0
[implicit_close] => 0
[disconnect_close] => 0
[in_middle_of_command_close] => 0
[explicit_free_result] => 0
[implicit_free_result] => 0
[explicit_stmt_close] => 0
[implicit_stmt_close] => 0
[mem_emalloc_count] => 0
[mem_emalloc_ammount] => 0
[mem_ecalloc_count] => 0
[mem_ecalloc_ammount] => 0
[mem_erealloc_count] => 0
[mem_erealloc_ammount] => 0
[mem_efree_count] => 0
[mem_malloc_count] => 0
[mem_malloc_ammount] => 0
[mem_calloc_count] => 0
[mem_calloc_ammount] => 0
[mem_realloc_count] => 0
[mem_realloc_ammount] => 0
[mem_free_count] => 0
[proto_text_fetched_null] => 0
[proto_text_fetched_bit] => 0
[proto_text_fetched_tinyint] => 0
[proto_text_fetched_short] => 0
[proto_text_fetched_int24] => 0
[proto_text_fetched_int] => 0
[proto_text_fetched_bigint] => 0
[proto_text_fetched_decimal] => 0
[proto_text_fetched_float] => 0
[proto_text_fetched_double] => 0
[proto_text_fetched_date] => 0
[proto_text_fetched_year] => 0
[proto_text_fetched_time] => 0
[proto_text_fetched_datetime] => 0
[proto_text_fetched_timestamp] => 0
[proto_text_fetched_string] => 0
[proto_text_fetched_blob] => 0
[proto_text_fetched_enum] => 0
[proto_text_fetched_set] => 0
[proto_text_fetched_geometry] => 0
[proto_text_fetched_other] => 0
[proto_binary_fetched_null] => 0
[proto_binary_fetched_bit] => 0
[proto_binary_fetched_tinyint] => 0
[proto_binary_fetched_short] => 0
[proto_binary_fetched_int24] => 0
[proto_binary_fetched_int] => 0
[proto_binary_fetched_bigint] => 0
[proto_binary_fetched_decimal] => 0
[proto_binary_fetched_float] => 0
[proto_binary_fetched_double] => 0
[proto_binary_fetched_date] => 0
[proto_binary_fetched_year] => 0
[proto_binary_fetched_time] => 0
[proto_binary_fetched_datetime] => 0
[proto_binary_fetched_timestamp] => 0
[proto_binary_fetched_string] => 0
[proto_binary_fetched_blob] => 0
[proto_binary_fetched_enum] => 0
[proto_binary_fetched_set] => 0
[proto_binary_fetched_geometry] => 0
[proto_binary_fetched_other] => 0
)
См. также
3.9.21. mysqli::$host_info ,
mysqli_get_host_info
Описание
Объектный стиль
string mysqli->host_info ;
Процедурный стиль
string mysqli_get_host_info(
mysqli link);
Возвращает последовательность, описывающую связь, представленную
параметром link (включая имя хоста сервера).
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Символьная строка, представляющая имя хоста сервера и тип подключения.
Примеры
Пример 3.49.
$mysqli->host_info
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print host information */
printf("Host info: %s\n", $mysqli->host_info);
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print host information */
printf("Host info: %s\n", mysqli_get_host_info($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Host info: Localhost via UNIX socket
См. также
3.9.22.
mysqli::$protocol_version ,
mysqli_get_proto_info
Описание
Объектный стиль
string mysqli->protocol_version ;
Процедурный стиль
int mysqli_get_proto_info(mysqli
link);
Возвращает целое число, представляющее версию протокола MySQL,
используемую связью, представленной параметром link .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Возвращает целое число, представляющее версию протокола.
Примеры
Пример 3.50.
$mysqli->protocol_version
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print protocol version */
printf("Protocol version: %d\n", $mysqli->protocol_version);
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print protocol version */
printf("Protocol version: %d\n", mysqli_get_proto_info($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Protocol version: 10
См. также
3.9.23.
mysqli::$server_info ,
mysqli::get_server_info ,
mysqli_get_server_info
Описание
Объектный стиль
string mysqli->server_info ;
string mysqli_stmt::get_server_info();
Процедурный стиль
string mysqli_get_server_info(
mysqli link);
Возвращает последовательность, представляющую версию сервера MySQL, с
которым связано расширение MySQLi.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Символьная строка, представляющая версию сервера.
Примеры
Пример 3.51.
$mysqli->server_info
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print server version */
printf("Server version: %s\n", $mysqli->server_info);
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print server version */
printf("Server version: %s\n", mysqli_get_server_info($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Server version: 4.1.2-alpha-debug
См. также
3.9.24.
mysqli::$server_version ,
mysqli_get_server_version
Описание
Объектный стиль
int mysqli->server_version ;
Процедурный стиль
int mysqli_get_server_version(
mysqli link);
Функция
mysqli_get_server_version
возвращает версию сервера (представленного параметром
link ) как integer.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Целое число, представляющее версию сервера.
Форма этого номера версии main_version * 10000
+ minor_version * 100 + sub_version (то есть, 4.1.0 это 40100).
Примеры
Пример 3.52.
$mysqli->server_version
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print server version */
printf("Server version: %d\n", $mysqli->server_version);
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* print server version */
printf("Server version: %d\n", mysqli_get_server_version($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Server version: 40102
См. также
3.9.25.
mysqli::get_warnings ,
mysqli_get_warnings
Описание
Объектный стиль
mysqli_warning mysqli::get_warnings();
Процедурный стиль
mysqli_warning mysqli_get_warnings(
mysqli link);
Эта функция в настоящее время не документируется,
только список аргументов доступен.
3.9.26.
mysqli::$info ,
mysqli_info
Описание
Объектный стиль
string mysqli->info ;
Процедурный стиль
string mysqli_info(mysqli
link);
Функция
mysqli_info возвращает информацию о последнем выполненном запросе.
Природа этой последовательности обеспечивается ниже:
Таблица 3.9.
Возможные значения mysqli_info
Тип запроса |
Пример result string |
INSERT INTO...SELECT... |
Records: 100 Duplicates: 0 Warnings: 0 |
INSERT INTO...VALUES (...),(...),(...) |
Records: 3 Duplicates: 0 Warnings: 0 |
LOAD DATA INFILE ... |
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 |
ALTER TABLE ... |
Records: 3 Duplicates: 0 Warnings: 0 |
UPDATE ... |
Rows matched: 40 Changed: 40 Warnings: 0 |
Запросы, которые не попадают в один из предыдущих форматов, не
поддерживаются. В этих ситуациях
mysqli_info возвратит пустую строку.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Символьная строка, представляющая дополнительную информацию о
последнем выполненном запросе.
Примеры
Пример 3.53.
$mysqli->info
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TEMPORARY TABLE t1 LIKE City");
/* INSERT INTO .. SELECT */
$mysqli->query("INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", $mysqli->info);
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TEMPORARY TABLE t1 LIKE City");
/* INSERT INTO .. SELECT */
mysqli_query($link, "INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", mysqli_info($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Records: 150 Duplicates: 0 Warnings: 0
См. также
3.9.27.
mysqli::init ,
mysqli_init
Описание
Объектный стиль
mysqli mysqli::init();
Процедурный стиль
mysqli mysqli_init();
Инициализирует объект MYSQL, подходящий для
mysqli_options и
mysqli_real_connect .
Любые последующие обращения к любой функции mysqli (кроме
mysqli_options ) потерпят неудачу до вызова
mysqli_real_connect .
Возвращаемое значение
Возвращает объект.
Примеры
См.
mysqli_real_connect .
См. также
3.9.28.
mysqli::$insert_id ,
mysqli_insert_id
Описание
Объектный стиль
mixed mysqli->insert_id ;
Процедурный стиль
mixed mysqli_insert_id(
mysqli link);
mysqli_insert_id вернет ID, произведенный запросом (обычно INSERT)
на таблице с колонкой, имеющей признак AUTO_INCREMENT. Если никакой запрос
INSERT или UPDATE не послан через эту связь, или если у измененной таблицы не
будет колонки с признаком AUTO_INCREMENT, эта функция возвратит ноль.
Выполняя запрос INSERT или UPDATE, функция LAST_INSERT_ID()
также изменит значение, возвращенное
mysqli_insert_id .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Значение поля AUTO_INCREMENT , которое было
обновлена предыдущим запросом. Ноль вернет, если не было никакого предыдущего
запроса на связи или если запрос не обновил значение
AUTO_INCREMENT .
Если число больше, чем максимальное значение int,
mysqli_insert_id
возвратит последовательность.
Примеры
Пример 3.54.
$mysqli->insert_id
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* drop table */
$mysqli->query("DROP TABLE myCity");
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);
printf ("New Record has id %d.\n", mysqli_insert_id($link));
/* drop table */
mysqli_query($link, "DROP TABLE myCity");
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
New Record has id 1.
3.9.29.
mysqli::kill ,
mysqli_kill
mysqli::kill
mysqli_kill
Уничтожает поток MySQL.
Описание
Объектный стиль
bool mysqli::kill(int
processid);
Процедурный стиль
bool mysqli_kill(mysqli
link, int processid
);
Эта функция используется, чтобы попросить сервер уничтожить поток MySQL,
определенный как processid .
Это значение должно быть получено вызовом функции
mysqli_thread_id .
Чтобы остановить запрос, необходимо использовать команду SQL
KILL QUERY processid .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.55.
mysqli::kill
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* determine our thread id */
$thread_id = $mysqli->thread_id;
/* Kill connection */
$mysqli->kill($thread_id);
/* This should produce an error */
if (!$mysqli->query("CREATE TABLE myCity LIKE City"))
{
printf("Error: %s\n", $mysqli->error);
exit;
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* determine our thread id */
$thread_id = mysqli_thread_id($link);
/* Kill connection */
mysqli_kill($link, $thread_id);
/* This should produce an error */
if (!mysqli_query($link, "CREATE TABLE myCity LIKE City"))
{
printf("Error: %s\n", mysqli_error($link));
exit;
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: MySQL server has gone away
См. также
3.9.30.
mysqli::more_results ,
mysqli_more_results
Описание
Объектный стиль
bool mysqli::more_results();
Процедурный стиль
bool mysqli_more_results(
mysqli link);
Указывает, доступны ли один или несколько наборов результатов от
предыдущего вызова
mysqli_multi_query .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет TRUE ,
если один или несколько наборов результатов доступны от предыдущего вызова
mysqli_multi_query , иначе FALSE .
Примеры
См.
mysqli_multi_query .
См. также
3.9.31.
mysqli::multi_query ,
mysqli_multi_query
Описание
Объектный стиль
bool mysqli::multi_query(
string query);
Процедурный стиль
bool mysqli_multi_query(mysqli
link,
string query);
Выполняет один или многократные запросы, которые связаны точкой с запятой.
Чтобы получить набор результатов от первого запроса, можно использовать
mysqli_use_result или
mysqli_store_result .
Все последующие результаты запроса могут быть обработаны, используя
mysqli_more_results и
mysqli_next_result .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
query
Запрос, как последовательность.
Данные в запросе нужно
правильно экранировать.
Возвращаемое значение
Вернет FALSE , если первый
запрос потерпел неудачу. Чтобы получить последующие ошибки из других
запросов, необходимо сначала вызвать
mysqli_next_result .
Примеры
Пример 3.56.
mysqli::multi_query
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query= "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query))
{
do
{
/* store first result set */
if ($result = $mysqli->store_result())
{
while ($row = $result->fetch_row())
{
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results())
{
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query= "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if (mysqli_multi_query($link, $query))
{
do
{
/* store first result set */
if ($result = mysqli_store_result($link))
{
while ($row = mysqli_fetch_row($result))
{
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($link))
{
printf("-----------------\n");
}
} while (mysqli_next_result($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут что-то подобное:
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer
См. также
3.9.32.
mysqli::next_result ,
mysqli_next_result
Описание
Объектный стиль
bool mysqli::next_result();
Процедурный стиль
bool mysqli_next_result(m
ysqli link);
Готовит следующий набор результатов от предыдущего вызова
mysqli_multi_query ,
который может быть получен
mysqli_store_result или
mysqli_use_result .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
См.
mysqli_multi_query .
См. также
3.9.33.
mysqli::options ,
mysqli_options
mysqli::options
mysqli_options
Установит разные опции.
Описание
Объектный стиль
bool mysqli::options(int
option,
mixed value);
Процедурный стиль
bool mysqli_options(mysqli
link,
int option,
mixed value);
Используется, чтобы установить дополнительные параметры соединения и
затрагивает поведение для связи.
Эта функция может быть вызвана многократно, чтобы
установить несколько опций.
mysqli_options должна быть вызвана после
mysqli_init , но до
mysqli_real_connect .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
option
Опция, которую вы хотите установить. Это может быть одно
из следующих значений:
Таблица 3.10. Допустимые опции
Имя |
Описание |
MYSQLI_OPT_CONNECT_TIMEOUT |
Тайм-аут связи в секундах (поддержано в Windows с
TCP/IP с PHP 5.3.1). |
MYSQLI_OPT_LOCAL_INFILE |
Включить/выключить использование
LOAD LOCAL INFILE . |
MYSQLI_INIT_COMMAND |
Команда, чтобы выполнить, соединяясь с сервером MySQL. |
MYSQLI_READ_DEFAULT_FILE |
Прочитайте опции из названного файла вместо
my.cnf . |
MYSQLI_READ_DEFAULT_GROUP |
Прочитайте опции из названной группы файла
my.cnf или файл, определенного в
MYSQL_READ_DEFAULT_FILE . |
MYSQLI_SERVER_PUBLIC_KEY |
Файл открытого ключа RSA, используемый с SHA-256. |
MYSQLI_OPT_NET_CMD_BUFFER_SIZE |
Размер внутреннего буфера команды/сети. Только для mysqlnd. |
MYSQLI_OPT_NET_READ_BUFFER_SIZE |
Максимальный прочитанный размер куска в байтах, читая тело пакета команд
MySQL. Только для mysqlnd. |
MYSQLI_OPT_INT_AND_FLOAT_NATIVE |
Столбцы integer и float преобразовать назад к числам PHP.
Только для mysqlnd. |
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT |
|
value
Значение для опции.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Журнал изменений
Версия |
Описание |
5.5.0 |
Добавлены опции MYSQLI_SERVER_PUBLIC_KEY
и MYSQLI_SERVER_PUBLIC_KEY . |
5.3.0 |
Добавлены опции MYSQLI_OPT_INT_AND_FLOAT_NATIVE
, MYSQLI_OPT_NET_CMD_BUFFER_SIZE ,
MYSQLI_OPT_NET_READ_BUFFER_SIZE и
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT .
|
Примеры
См.
mysqli_real_connect .
Примечания
MySQLnd всегда принимает набор символов сервера по умолчанию.
Этот набор символов посылают во время идентификации связи, которую
будет использовать mysqlnd.
Libmysqlclient использует набор символов по умолчанию из
my.cnf или заданный явным вызовом
mysqli_options до вызова
mysqli_real_connect , но уже после
mysqli_init .
См. также
3.9.34.
mysqli::ping ,
mysqli_ping
Описание
Объектный стиль
bool mysqli::ping();
Процедурный стиль
bool mysqli_ping(mysqli
link);
Проверяет, работает ли связь с сервером. Если она потеряна, и глобальная
опция mysqli.reconnect
позволена, автоматическое повторное соединение предпринято.
Значение php.ini mysqli.reconnect
проигнорировано драйвером mysqlnd, таким образом, автоматическое повторное
соединение никогда не предпринимается.
Эта функция может использоваться клиентами, которые остаются неработающими
долгое время, чтобы проверить, закрыл ли сервер связь и снова
соединяться при необходимости.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.57.
mysqli::ping
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
/* check if server is alive */
if ($mysqli->ping())
{
printf ("Our connection is ok!\n");
} else {
printf ("Error: %s\n", $mysqli->error);
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* check if server is alive */
if (mysqli_ping($link))
{
printf ("Our connection is ok!\n");
} else {
printf ("Error: %s\n", mysqli_error($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Our connection is ok!
3.9.35.
mysqli::poll ,
mysqli_poll
mysqli::poll
mysqli_poll
Опрос связей.
Описание
Объектный стиль
public static int
mysqli::poll(array read,
array error,
array reject,
int sec,
int usec= =0);
Процедурный стиль
int mysqli_poll(array
read,
array error,
array reject,
int sec,
int usec= =0);
Опрос связей. Доступно только в
mysqlnd. Метод может использоваться в качестве
static.
Параметры
read
Список связей, чтобы проверить на результаты, которые
могут быть прочитаны.
error
Список связей, на которых ошибка произошла, например, неудача запроса
или потеряна связь.
reject
Список отклонных связей, потому что не было никакого асинхронного
запроса, для которого функция могла получить результаты.
sec
Максимальное количество секунд, чтобы ждать,
должно быть неотрицательным.
usec
Максимальное количество микросекунд, чтобы ждать,
должно быть неотрицательным.
Возвращаемое значение
Количество готовых связей при успехе,
FALSE иначе.
Примеры
Пример 3.58.
mysqli_poll
<?php
$link1 = mysqli_connect();
$link1->query("SELECT 'test'", MYSQLI_ASYNC);
$all_links = array($link1);
$processed = 0;
do
{
$links = $errors = $reject = array();
foreach ($all_links as $link)
{
$links[] = $errors[] = $reject[] = $link;
}
if (!mysqli_poll($links, $errors, $reject, 1))
{
continue;
}
foreach ($links as $link)
{
if ($result = $link->reap_async_query())
{
print_r($result->fetch_row());
if (is_object($result)) mysqli_free_result($result);
} else die(sprintf("MySQLi Error: %s", mysqli_error($link)));
$processed++;
}
} while ($processed < count($all_links));
?>
Этот пример выведет:
Array
(
[0] => test
)
См. также
3.9.36.
mysqli::prepare ,
mysqli_prepare
Описание
Объектный стиль
mysqli_stmt mysqli::prepare(
string query);
Процедурный стиль
mysqli_stmt mysqli_prepare(mysqli
link,
string query);
Готовит SQL-запрос и возвращает дескриптор запроса, который будет
использоваться для дальнейших операций. Запрос должен состоять из
единственного SQL-оператора.
Маркеры параметра должны быть связаны с переменными, используя
mysqli_stmt_bind_param и/или
mysqli_stmt_bind_result прежде, чем выполнить запрос
или получить строки.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
query
Запрос как последовательность.
Вы не должны добавлять заканчивающую точку с запятой или
\g .
Этот параметр может включать один или несколько маркеров параметра в
SQL-оператор, включая вопросительный знак
(? ) в соответствующих местах.
Маркеры законны только в определенных местах в SQL-операторах.
Например, им позволяют входить в список
VALUES() оператора
INSERT (чтобы определить значения столбцов для
строки) или в сравнении с колонкой в предложении
WHERE , чтобы определить сравнительное значение.
Однако им не позволяют использоваться для идентификаторов (таких как
таблица или имена столбцов) в списке выборки, который называет колонки,
которые будут возвращены SELECT ,
или определить оба операнда бинарного оператора, такого как
= . Последнее ограничение необходимо, потому что
было бы невозможно определить тип параметра. Не позволено сравнить маркер с
NULL , например, ? IS
NULL . В целом параметры законны только в запросах
Data Manipulation Language (DML), но не в Data Definition Language (DDL).
Возвращаемое значение
mysqli_prepare возвращает объект запроса или
FALSE , если ошибка произошла.
Примеры
Пример 3.59.
mysqli::prepare
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?"))
{
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT District FROM City WHERE Name=?"))
{
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
/* fetch value */
mysqli_stmt_fetch($stmt);
printf("%s is in district %s\n", $city, $district);
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Amersfoort is in district Utrecht
См. также
3.9.37. mysqli::query ,
mysqli_query
Описание
Объектный стиль
mixed mysqli::query(string
query,
int resultmode= =MYSQLI_STORE_RESULT
);
Процедурный стиль
mixed mysqli_query(mysqli
link, string query,
int resultmode= =MYSQLI_STORE_RESULT
);
Выполняет запрос query на базе данных.
Для запросов non-DML (не INSERT, UPDATE или DELETE), эта функция подобна
запросу
mysqli_real_query сопровождаемому также
mysqli_use_result или
mysqli_store_result .
В случае, когда вы передаете запрос в
mysqli_query более длинный, чем
max_allowed_packet ,
возвращенные коды ошибок отличаются в зависимости от того, используете ли вы
MySQL Native Driver (mysqlnd ) или
MySQL Client Library (libmysqlclient ):
mysqlnd в Linux возвращает код ошибки
1153. Это значит got a packet bigger than
max_allowed_packet bytes.
mysqlnd в Windows возвращает код ошибки
code 2006. Это server has gone away.
libmysqlclient на всех платформах
возвращает код ошибки 2006. Это server
has gone away.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
query
Строка запроса.
Данные в запросе нужно
экранировать.
resultmode
Любая из констант MYSQLI_USE_RESULT или
MYSQLI_STORE_RESULT
в зависимости от желаемого поведения. По умолчанию
MYSQLI_STORE_RESULT .
При использовании MYSQLI_USE_RESULT
все последующие вызовы возвратят ошибку Commands out
of sync , если вы не вызываете
mysqli_free_result .
С MYSQLI_ASYNC (доступно в mysqlnd),
возможно выполнить запрос асинхронно.
mysqli_poll
тогда используется, чтобы получить результаты таких запросов.
Возвращаемое значение
Вернет FALSE при ошибке. Для успешного
SELECT, SHOW, DESCRIBE или
EXPLAIN
mysqli_query вернет объект
mysqli_result . Для других успешных запросов
mysqli_query вернет TRUE .
Журнал изменений
Версия |
Описание |
5.3.0 |
Добавлена поддержка запросов async. |
Примеры
Пример 3.60.
mysqli::query
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
/* Create table doesn't return a resultset */
if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE)
{
printf("Table myCity successfully created.\n");
}
/* Select queries return a resultset */
if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10"))
{
printf("Select returned %d rows.\n", $result->num_rows);
/* free result set */
$result->close();
}
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT))
{
/* Note, that we can't execute any functions which interact with the
server until result set was closed. All calls will return an
'out of sync' error */
if (!$mysqli->query("SET @a:='this will not work'"))
{
printf("Error: %s\n", $mysqli->error);
}
$result->close();
}
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Create table doesn't return a resultset */
if (mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE)
{
printf("Table myCity successfully created.\n");
}
/* Select queries return a resultset */
if ($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10"))
{
printf("Select returned %d rows.\n", mysqli_num_rows($result));
/* free result set */
mysqli_free_result($result);
}
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
if ($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT))
{
/* Note, that we can't execute any functions which interact with the
server until result set was closed. All calls will return an
'out of sync' error */
if (!mysqli_query($link, "SET @a:='this will not work'"))
{
printf("Error: %s\n", mysqli_error($link));
}
mysqli_free_result($result);
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Table myCity successfully created.
Select returned 10 rows.
Error: Commands out of sync;You can't run this command now
См. также
3.9.38.
mysqli::real_connect ,
mysqli_real_connect
Описание
Объектный стиль
bool mysqli::real_connect(string
host,
string username,
string passwd,
string dbname,
int port,
string socket,
int flags);
Процедурный стиль
bool mysqli_real_connect(mysqli
link,
string host,
string username,
string passwd,
string dbname,
int port,
string socket,
int flags);
Установит связь с ядром базы данных MySQL.
Эта функция отличается от
mysqli_connect :
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
host
Может быть именем хоста или IP-адресом. Перелача
NULL или строки "localhost" означает
локальную машину. Когда возможно, каналы будут использоваться вместо
протокола TCP/IP.
username
Имя пользователя MySQL.
passwd
Если задан или NULL ,
сервер MySQL попытается подтвердить подлинность пользователя только для
тех пользовательских записей, у которых нет пароля. Это позволяет одному
имени пользователя использоваться с различными разрешениями (в зависимости от
того, есть пароль или нет).
dbname
Если обеспечено определит базу данных по умолчанию, которая будет
использоваться, выполняя запросы.
port
Определяет номер порта, чтобы попытаться соединиться с сервером MySQL.
socket
Определяет сокет или именованный канал, который должен использоваться.
Указание параметра socket явно не определит тип связи,
которая будет использоваться, соединяясь с сервером MySQL. То, как связь
установлена с базой данных MySQL, определяется параметром
host .
flags
С параметром flags
можно установить различные варианты связи:
Таблица 3.11. Допустимые параметры
Имя |
Описание |
MYSQLI_CLIENT_COMPRESS |
Используйте протокол сжатия. |
MYSQLI_CLIENT_FOUND_ROWS |
Возвратит количество подобранных строк, а не
количество затронутых строк. |
MYSQLI_CLIENT_IGNORE_SPACE |
Позволить места после имен функций. Делает все зарезервированные
слова именами функций. |
MYSQLI_CLIENT_INTERACTIVE |
Позволить interactive_timeout секунд
(вместо wait_timeout секунд)
бездеятельности прежде, чем закрыть связь. |
MYSQLI_CLIENT_SSL |
Используйте SSL (шифрование). |
MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT |
Аналог MYSQLI_CLIENT_SSL ,
но отключает проверку предоставленного сертификата SSL. Это только для
инсталляционного использования MySQL Native Driver и
MySQL 5.6 или выше. |
Из соображений безопасности
MULTI_STATEMENT
не поддерживается в PHP. Если вы хотите выполнить мультизапросы, используйте
функцию
mysqli_multi_query .
Журнал изменений
Версия |
Описание |
5.6.16 |
Добавлен параметр
MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT для
MySQL Native Driver. |
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.61.
mysqli::real_connect
Объектный стиль
<?php
$mysqli = mysqli_init();
if (!$mysqli)
{
die('mysqli_init failed');
}
if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0'))
{
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5))
{
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db'))
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
Объектный стиль, расширяя класс mysqli
<?php
class foo_mysqli extends mysqli
{
public function __construct($host, $user, $pass, $db)
{
parent::init();
if (!parent::options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0'))
{
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!parent::options(MYSQLI_OPT_CONNECT_TIMEOUT, 5))
{
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!parent::real_connect($host, $user, $pass, $db))
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
}
$db = new foo_mysqli('localhost', 'my_user', 'my_password', 'my_db');
echo 'Success... ' . $db->host_info . "\n";
$db->close();
?>
Процедурный стиль
<?php
$link = mysqli_init();
if (!$link)
{
die('mysqli_init failed');
}
if (!mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0'))
{
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5))
{
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!mysqli_real_connect($link, 'localhost', 'my_user', 'my_password', 'my_db'))
{
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . mysqli_get_host_info($link) . "\n";
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Success... MySQL host info: localhost via TCP/IP
Примечания
MySQLnd всегда принимает набор символов сервера по умолчанию.
Этот набор символов посылают во время идентификации связи, которая
будет использовать mysqlnd.
Libmysqlclient применяет набор символов по умолчанию из
my.cnf или заданный явным вызовом
mysqli_options до
mysqli_real_connect , но после
mysqli_init .
См. также
3.9.39.
mysqli::real_escape_string ,
mysqli::escape_string ,
mysqli_real_escape_string
mysqli::real_escape_string
mysqli::escape_string
mysqli_real_escape_string
Экранирует специальные символы в последовательности для использования в
SQL-операторе, принимая во внимание текущий набор символов связи.
Описание
Объектный стиль
string mysqli::escape_string(
string escapestr);
string mysqli::real_escape_string(
string escapestr);
Процедурный стиль
string mysqli_real_escape_string(
mysqli link,
string escapestr);
Эта функция используется, чтобы создать допустимую последовательность SQL,
которую можно использовать в SQL-операторе. Данная последовательность
закодирована к последовательности SQL, приняв во внимание текущий
набор символов связи. Безопасность: набор символов по умолчанию.
Набор символов должен быть установлен или на уровне сервера, или
API-функцией
mysqli_set_charset , чтобы затронуть
mysqli_real_escape_string .
Посмотрите секцию понятий
character sets.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
escapestr
Последовательность, которую надо экранировать.
Будут закодированы символы NUL (ASCII 0), \n, \r,
\, ', " и Control-Z .
Возвращаемое значение
Возвращает экранированную последовательность.
Ошибки и исключения
Выполнение этой функции без действительной связи MySQLi возвратит
NULL и установит уровень ошибки
E_WARNING .
Примеры
Пример 3.62.
mysqli::real_escape_string
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");
$city = "'s Hertogenbosch";
/* this query will fail, cause we didn't escape $city */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')"))
{
printf("Error: %s\n", $mysqli->sqlstate);
}
$city = $mysqli->real_escape_string($city);
/* this query with escaped $city will work */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')"))
{
printf("%d Row inserted.\n", $mysqli->affected_rows);
}
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
$city = "'s Hertogenbosch";
/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')"))
{
printf("Error: %s\n", mysqli_sqlstate($link));
}
$city = mysqli_real_escape_string($link, $city);
/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')"))
{
printf("%d Row inserted.\n", mysqli_affected_rows($link));
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: 42000
1 Row inserted.
Примечания
Для использующих
mysql_real_escape_string отметьте, что
аргументы
mysqli_real_escape_string
отличаются от
mysql_real_escape_string .
link стоит на первом месте в
mysqli_real_escape_string ,
тогда как последовательность для экранировки на первом месте в
mysql_real_escape_string .
См. также
3.9.40.
mysqli::real_query ,
mysqli_real_query
mysqli::real_query
mysqli_real_query
Выполните SQL-запрос.
Описание
Объектный стиль
bool mysqli::real_query(string
query);
Процедурный стиль
bool mysqli_real_query(mysqli
link,
string query);
Выполняет единый запрос к базе данных, результат которого может быть
получен или сохранен с использованием
mysqli_store_result или
mysqli_use_result .
Чтобы определить, должен ли данный запрос возвратить набор результатов или
нет, посмотрите
mysqli_field_count .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
query
Запрос как последовательность.
Данные в запросе нужно
экранировать.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.9.41.
mysqli::reap_async_query ,
mysqli_reap_async_query
Описание
Объектный стиль
public mysqli_result
mysqli::reap_async_query();
Процедурный стиль
mysqli_result mysqli_reap_async_query(
mysqli link);
Получить результат async-запроса. Доступно только с
mysqlnd.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Вернет mysqli_result при успехе, иначе
FALSE .
См. также
3.9.42.
mysqli::refresh ,
mysqli_refresh
mysqli::refresh
mysqli_refresh
Обновления.
Описание
Объектный стиль
public bool mysqli::refresh(
int options);
Процедурный стиль
bool mysqli_refresh(resource
link,
int options);
Сбрасывает таблицы или кэши или информацию о сервере репликации.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
options
Варианты сброса, используя константы MYSQLI_REFRESH_*
как зарегистрировано в рамках документации
MySQLi constants.
См. также официальную документацию
MySQL Refresh.
Возвращаемое значение
TRUE при удаче, иначе
FALSE .
См. также
3.9.43.
mysqli::release_savepoint ,
mysqli_release_savepoint
Описание
Объектный стиль (метод):
public bool mysqli::release_savepoint
(string name);
Процедурный стиль:
bool mysqli_release_savepoint(
mysqli link,
string name);
Эта функция в настоящее время не документируется,
только список аргументов доступен.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
name
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.9.44.
mysqli::rollback ,
mysqli_rollback
Описание
Объектный стиль
bool mysqli::rollback(int
flags= =0,
string name);
Процедурный стиль
bool mysqli_rollback(mysqli
link,
int flags= =0,
string name);
Отменяет текущую транзакцию.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
flags
Битовая маска констант
MYSQLI_TRANS_COR_* .
name
Если обеспечено, тогда выполняется
ROLLBACK/*name*/ .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Журнал изменений
Версия |
Описание |
5.5.0 |
Добавлены параметры flags и
name . |
Примеры
Пример 3.63.
mysqli::rollback
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* disable autocommit */
$mysqli->autocommit(FALSE);
$mysqli->query("CREATE TABLE myCity LIKE City");
$mysqli->query("ALTER TABLE myCity Type=InnoDB");
$mysqli->query("INSERT INTO myCity SELECT * FROM City LIMIT 50");
/* commit insert */
$mysqli->commit();
/* delete all rows */
$mysqli->query("DELETE FROM myCity");
if ($result = $mysqli->query("SELECT COUNT(*) FROM myCity"))
{
$row = $result->fetch_row();
printf("%d rows in table myCity.\n", $row[0]);
/* Free result */
$result->close();
}
/* Rollback */
$mysqli->rollback();
if ($result = $mysqli->query("SELECT COUNT(*) FROM myCity"))
{
$row = $result->fetch_row();
printf("%d rows in table myCity (after rollback).\n", $row[0]);
/* Free result */
$result->close();
}
/* Drop table myCity */
$mysqli->query("DROP TABLE myCity");
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* disable autocommit */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE myCity LIKE City");
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB");
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50");
/* commit insert */
mysqli_commit($link);
/* delete all rows */
mysqli_query($link, "DELETE FROM myCity");
if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity"))
{
$row = mysqli_fetch_row($result);
printf("%d rows in table myCity.\n", $row[0]);
/* Free result */
mysqli_free_result($result);
}
/* Rollback */
mysqli_rollback($link);
if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity"))
{
$row = mysqli_fetch_row($result);
printf("%d rows in table myCity (after rollback).\n", $row[0]);
/* Free result */
mysqli_free_result($result);
}
/* Drop table myCity */
mysqli_query($link, "DROP TABLE myCity");
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
0 rows in table myCity.
50 rows in table myCity (after rollback).
См. также
3.9.45.
mysqli::rpl_query_type ,
mysqli_rpl_query_type
mysqli::rpl_query_type
mysqli_rpl_query_type
Вернет тип запроса RPL.
Описание
Объектный стиль
int mysqli::rpl_query_type(
string query);
Процедурный стиль
int mysqli_rpl_query_type(mysqli
link,
string query);
Вернет MYSQLI_RPL_MASTER ,
MYSQLI_RPL_SLAVE или
MYSQLI_RPL_ADMIN
в зависимости от типа запроса.
INSERT , UPDATE и
подобные запросы это master,
SELECT slave
, FLUSH ,
REPAIR и подобные
admin.
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.9.46.
mysqli::savepoint ,
mysqli_savepoint
Описание
Объектный стиль (метод):
public bool mysqli::savepoint(
string name);
Процедурный стиль:
bool mysqli_savepoint(mysqli
link,
string name);
Эта функция пока не документирована, есть только список параметров.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
name
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.9.47.
mysqli::select_db ,
mysqli_select_db
Описание
Объектный стиль
bool mysqli::select_db(string
dbname);
Процедурный стиль
bool mysqli_select_db(mysqli
link,
string dbname);
Выбирает базу данных по умолчанию, которая будет использоваться, выполняя
запросы к базе данных.
Эта функция должна только использоваться, чтобы изменить базу данных по
умолчанию для связи. Можно выбрать базу данных по умолчанию с 4-м параметром
в
mysqli_connect .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
dbname
Имя базы данных.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.64.
mysqli::select_db
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* return name of current default database */
if ($result = $mysqli->query("SELECT DATABASE()"))
{
$row = $result->fetch_row();
printf("Default database is %s.\n", $row[0]);
$result->close();
}
/* change db to world db */
$mysqli->select_db("world");
/* return name of current default database */
if ($result = $mysqli->query("SELECT DATABASE()"))
{
$row = $result->fetch_row();
printf("Default database is %s.\n", $row[0]);
$result->close();
}
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* return name of current default database */
if ($result = mysqli_query($link, "SELECT DATABASE()"))
{
$row = mysqli_fetch_row($result);
printf("Default database is %s.\n", $row[0]);
mysqli_free_result($result);
}
/* change db to world db */
mysqli_select_db($link, "world");
/* return name of current default database */
if ($result = mysqli_query($link, "SELECT DATABASE()"))
{
$row = mysqli_fetch_row($result);
printf("Default database is %s.\n", $row[0]);
mysqli_free_result($result);
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Default database is test.
Default database is world.
См. также
3.9.48.
mysqli::send_query ,
mysqli_send_query
Описание
Объектный стиль
bool mysqli::send_query(string
query);
Процедурный стиль
bool mysqli_send_query(mysqli
link,
string query);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.9.49.
mysqli::set_charset ,
mysqli_set_charset
Описание
Объектный стиль
bool mysqli::set_charset(string
charset);
Процедурный стиль
bool mysqli_set_charset(mysqli
link,
string charset);
Устанавливает набор символов, который будет использоваться по умолчанию,
посылая данные с и на сервер базы данных.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
charset
Набор символов, который будет установлен.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примечания
Чтобы использовать эту функцию на платформе Windows, вам нужна версия
4.1.11 библиотеки клиента MySQL или выше (для MySQL 5.0 вы нуждаетесь в
версии 5.0.6 или выше).
Это предпочтительный способ изменить набор символов. Использование для
этого
mysqli_query (например, SET NAMES utf8
) не рекомендуется. Посмотрите подробности
здесь.
Примеры
Пример 3.65.
mysqli::set_charset
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
printf("Initial character set: %s\n", $mysqli->character_set_name());
/* change character set to utf8 */
if (!$mysqli->set_charset("utf8"))
{
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit();
} else {
printf("Current character set: %s\n", $mysqli->character_set_name());
}
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
printf("Initial character set: %s\n", mysqli_character_set_name($link));
/* change character set to utf8 */
if (!mysqli_set_charset($link, "utf8"))
{
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут что-то подобное:
Initial character set: latin1
Current character set: utf8
См. также
3.9.50.
mysqli::set_local_infile_default ,
mysqli_set_local_infile_default
mysqli::set_local_infile_default
mysqli_set_local_infile_default
Сбрасывает определенный пользователем обработчик для load local infile.
Описание
void mysqli_set_local_infile_default(
mysqli link);
Дезактивирует обработчик LOAD DATA INFILE LOCAL
, ранее установленный с
mysqli_set_local_infile_handler .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Отсутствует.
Примеры
См.
mysqli_set_local_infile_handler .
См. также
3.9.51.
mysqli::set_local_infile_handler ,
mysqli_set_local_infile_handler
mysqli::set_local_infile_handler
mysqli_set_local_infile_handler
Установит функцию обратного вызова для LOAD DATA LOCAL INFILE.
Описание
Объектный стиль
bool mysqli::set_local_infile_handler(
mysqli link,
callable read_func);
Процедурный стиль
bool mysqli_set_local_infile_handler(
mysqli link,
callable read_func);
Установит функцию обратного вызова для LOAD DATA LOCAL INFILE.
Задача функции состоит в том, чтобы прочитать ввод из файла, определенного
в LOAD DATA LOCAL INFILE
и переформатировать его в формат, понятный
LOAD DATA INFILE .
Возвращенные данные должны соответствовать формату, определенному в
LOAD DATA .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
read_func
Функция обратного вызова или метод объекта,
берущий следующие параметры:
stream
Поток PHP, связанный с SQL-командой INFILE.
&buffer
Буфер последовательности, чтобы сохранить переписанный ввод.
buflen
Максимальное количество знаков, которые будут сохранены в буфере.
&errormsg
Если ошибка происходит, можно сохранить сообщение об ошибке здесь.
Функция должна возвратить количество знаков, сохраненных в
buffer , или отрицательную величину,
если ошибка произошла.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.66.
mysqli::set_local_infile_handler
Объектный стиль
<?php
$db = mysqli_init();
$db->real_connect("localhost","root","","test");
function callme($stream, &$buffer, $buflen, &$errmsg)
{
$buffer = fgets($stream);
echo $buffer;
// convert to upper case and replace "," delimiter with [TAB]
$buffer = strtoupper(str_replace(",", "\t", $buffer));
return strlen($buffer);
}
echo "Input:\n";
$db->set_local_infile_handler("callme");
$db->query("LOAD DATA LOCAL INFILE 'input.txt' INTO TABLE t1");
$db->set_local_infile_default();
$res = $db->query("SELECT * FROM t1");
echo "\nResult:\n";
while ($row = $res->fetch_assoc())
{
echo join(",", $row)."\n";
}
?>
Процедурный стиль
<?php
$db = mysqli_init();
mysqli_real_connect($db, "localhost","root","","test");
function callme($stream, &$buffer, $buflen, &$errmsg)
{
$buffer = fgets($stream);
echo $buffer;
// convert to upper case and replace "," delimiter with [TAB]
$buffer = strtoupper(str_replace(",", "\t", $buffer));
return strlen($buffer);
}
echo "Input:\n";
mysqli_set_local_infile_handler($db, "callme");
mysqli_query($db, "LOAD DATA LOCAL INFILE 'input.txt' INTO TABLE t1");
mysqli_set_local_infile_default($db);
$res = mysqli_query($db, "SELECT * FROM t1");
echo "\nResult:\n";
while ($row = mysqli_fetch_assoc($res))
{
echo join(",", $row)."\n";
}
?>
Вышеупомянутые примеры произведут:
Input:
23,foo
42,bar
Output:
23,FOO
42,BAR
См. также
3.9.52.
mysqli::$sqlstate ,
mysqli_sqlstate
Описание
Объектный стиль
string mysqli->sqlstate ;
Процедурный стиль
string mysqli_sqlstate(mysqli
link);
Возвращает последовательность, содержащую код ошибки SQLSTATE для
последней ошибки. Код ошибки состоит из пяти знаков.
'00000' означает отсутствие ошибок.
Значения определяются ANSI SQL и ODBC. Для списка возможных значений см.
http://dev.mysql.com/doc/mysql/en/error-handling.html.
Обратите внимание на то, что не все ошибки MySQL все же отображены в
SQLSTATE. Значение HY000 (general error)
используется для не отображенных ошибок.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Возвращает последовательность, содержащую код ошибки SQLSTATE для
последней ошибки. Код ошибки состоит из пяти знаков.
'00000' означает отсутствие ошибок.
Примеры
Пример 3.67.
$mysqli->sqlstate
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Table City already exists, so we should get an error */
if (!$mysqli->query("CREATE TABLE City (ID INT, Name VARCHAR(30))"))
{
printf("Error - SQLSTATE %s.\n", $mysqli->sqlstate);
}
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Table City already exists, so we should get an error */
if (!mysqli_query($link, "CREATE TABLE City (ID INT, Name VARCHAR(30))"))
{
printf("Error - SQLSTATE %s.\n", mysqli_sqlstate($link));
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error - SQLSTATE 42S01.
См. также
3.9.53.
mysqli::ssl_set ,
mysqli_ssl_set
Описание
Объектный стиль
bool mysqli::ssl_set(string
key,
string cert,
string ca,
string capath,
string cipher);
Процедурный стиль
bool mysqli_ssl_set(mysqli
link,
string key,
string cert,
string ca,
string capath,
string cipher);
Используется для установления безопасных соединений, используя SSL.
Это нужно назвать до
mysqli_real_connect .
Эта функция ничего не делает, если поддержка OpenSSL не позволена.
Заметьте, что MySQL Native Driver не понимал SSL до PHP 5.3.3,
таким образом вызов этой функции, используя MySQL Native Driver,
приведет к ошибке. MySQL Native Driver позволен по умолчанию в
Microsoft Windows с PHP version 5.3 и выше.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
key
Путь к файлу ключей.
cert
Путь к файлу сертификатов.
ca
Путь к файлу центра сертификации.
capath
Путь к каталогу, который содержит доверенные сертификаты SSL
CA в формате PEM.
cipher
Список допустимых шифров, чтобы использовать для шифрования SSL.
Возвращаемое значение
Эта функция всегда возвращает TRUE .
Если установка SSL неправильная,
mysqli_real_connect возвратит ошибку, когда
вы попытаетесь соединиться.
См. также
3.9.54.
mysqli::stat ,
mysqli_stat
Описание
Объектный стиль
string mysqli::stat();
Процедурный стиль
string mysqli_stat(mysqli
link);
mysqli_stat возвращает последовательность, содержащую информацию,
подобную обеспеченной командой 'mysqladmin status'.
Это включает продолжительность работы в секундах, количество запущенных
потоков, запросов, перезагрузок и открытых таблиц.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Последовательность, описывающая статус сервера.
FALSE , если ошибка произошла.
Примеры
Пример 3.68.
mysqli::stat
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
printf ("System status: %s\n", $mysqli->stat());
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
printf("System status: %s\n", mysqli_stat($link));
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
System status: Uptime: 272 Threads: 1 Questions: 5340 Slow queries: 0
Opens: 13 Flush tables: 1 Open tables: 0 Queries per second avg: 19.632
Memory in use: 8496K Max memory used: 8560K
См. также
3.9.55.
mysqli::stmt_init ,
mysqli_stmt_init
Описание
Объектный стиль
mysqli_stmt mysqli::stmt_init();
Процедурный стиль
mysqli_stmt mysqli_stmt_init(
mysqli link);
Ассигнует и инициализирует объект запросы, подходящий для
mysqli_stmt_prepare .
Любые последующие обращения к любой функции mysqli_stmt
потерпят неудачу до вызова
mysqli_stmt_prepare .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Возвращает объект.
См. также
3.9.56.
mysqli::store_result ,
mysqli_store_result
Описание
Объектный стиль
mysqli_result mysqli::store_result(
int option);
Процедурный стиль
mysqli_result mysqli_store_result(
mysqli link,
int option);
Передает набор результатов от последнего запроса на соединении с базой
данных, представленном параметром link , который будет
использоваться с функцией
mysqli_data_seek .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
option
Опция, которую вы хотите установить. Это может быть одно
из следующих значений:
Таблица 3.12. Допустимые опции
Имя |
Описание |
MYSQLI_STORE_RESULT_COPY_DATA |
Копировать результаты из внутреннего буфера в переменные PHP.
По умолчанию mysqlnd будет использовать ссылочную логику, чтобы избежать
копировать и дублировать результаты, хранимые в памяти.
Для определенных наборов результатов, например, наборов результатов с многими
маленькими строками, копирование может уменьшить полное использование памяти,
потому что переменные PHP, содержащие результаты, могут быть освобождены
раньше (доступно только с mysqlnd, начиная с PHP 5.6.0).
|
Возвращаемое значение
Возвращает буферизированный объект результата или
FALSE , если ошибка произошла.
mysqli_store_result
вернет FALSE в случае, если запрос не возвратил
набор результатов (если запрос был, например, оператором INSERT). Эта функция
также возвращает FALSE , если чтение набора
результатов потерпело неудачу. Можно проверить, есть ли у вас ошибка
проверяя, что
mysqli_error
не возвращает пустую строку, если
mysqli_errno
возвращает не нулевое значение или если
mysqli_field_count
возвращает не нулевое значение. Также возможная причина для того, чтобы эта
функция возвратила FALSE после успешного вызова
mysqli_query может быть слишком большой набор результатов (память
для него не может быть ассигнована). Если
mysqli_field_count возвращает ненулевое значение, запрос должен
был произвести непустой набор результатов.
Примечания
Хотя всегда хорошая практика, чтобы освободить память, используемую
результатом запроса, используя
mysqli_free_result , передавая большие
наборы результатов, используя
mysqli_store_result ,
это становится особенно важным.
Примеры
См.
mysqli_multi_query .
См. также
3.9.57.
mysqli::$thread_id ,
mysqli_thread_id
Описание
Объектный стиль
int mysqli->thread_id ;
Процедурный стиль
int mysqli_thread_id(mysqli
link);
mysqli_thread_id
возвращает ID потока для текущей связи, который может тогда быть уничтожен,
используя
mysqli_kill . Если связь потеряна, и вы снова соединяетесь с
помощью
mysqli_ping , ID потока будет другим.
Поэтому необходимо получить ID только, когда он вам нужен.
ID потока назначен на основе связи. Следовательно, если связь будет
разорвана и затем восстановится, то ID будет переназначен.
Чтобы уничтожить выполняемый запрос, можно использовать команду SQL
KILL QUERY processid .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Возвращает Thread ID для текущей связи.
Примеры
Пример 3.69.
$mysqli->thread_id
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* determine our thread id */
$thread_id = $mysqli->thread_id;
/* Kill connection */
$mysqli->kill($thread_id);
/* This should produce an error */
if (!$mysqli->query("CREATE TABLE myCity LIKE City"))
{
printf("Error: %s\n", $mysqli->error);
exit;
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* determine our thread id */
$thread_id = mysqli_thread_id($link);
/* Kill connection */
mysqli_kill($link, $thread_id);
/* This should produce an error */
if (!mysqli_query($link, "CREATE TABLE myCity LIKE City"))
{
printf("Error: %s\n", mysqli_error($link));
exit;
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: MySQL server has gone away
См. также
3.9.58. mysqli::thread_safe ,
mysqli_thread_safe
Описание
Процедурный стиль
bool mysqli_thread_safe();
Говорит, собрана ли библиотека клиента как ориентированная
на многопотоковое исполнение.
Возвращаемое значение
TRUE , если библиотека клиента ориентирована
на многопотоковое исполнение, иначе FALSE .
3.9.59.
mysqli::use_result ,
mysqli_use_result
Описание
Объектный стиль
mysqli_result mysqli::use_result();
Процедурный стиль
mysqli_result mysqli_use_result(
mysqli link);
Используется, чтобы начать применение набора результатов от последнего
запроса, выполненного, используя
mysqli_real_query
на соединении с базой данных.
Эта или функция
mysqli_store_result
должна быть вызвана, прежде чем результаты запроса смогут быть получены,
и эта или другая функция должна быть вызвана, чтобы предотвратить следующий
запрос на этом соединении с базой данных от провала.
mysqli_use_result не передает весь набор результатов от базы
данных и следовательно не может использоваться такими функциями, как
mysqli_data_seek , чтобы двигаться в
конкретную строку в наборе. Чтобы использовать эту функциональность, набор
результатов должен быть сохранен, используя
mysqli_store_result . Не нужно использовать
mysqli_use_result ,
если большая обработка на клиентской стороне будет выполнена, так как это
будет связывать сервер и препятствовать тому, чтобы другие потоки обновили
любые таблицы, из которых приносятся данные.
Возвращаемое значение
Возвращает небуферизированный объект результата или
FALSE , если ошибка произошла.
Примеры
Пример 3.70.
mysqli::use_result
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query= "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query))
{
do {
/* store first result set */
if ($result = $mysqli->use_result())
{
while ($row = $result->fetch_row())
{
printf("%s\n", $row[0]);
}
$result->close();
}
/* print divider */
if ($mysqli->more_results())
{
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query= "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if (mysqli_multi_query($link, $query))
{
do {
/* store first result set */
if ($result = mysqli_use_result($link))
{
while ($row = mysqli_fetch_row($result))
{
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
/* print divider */
if (mysqli_more_results($link))
{
printf("-----------------\n");
}
} while (mysqli_next_result($link));
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer
См. также
3.9.60.
mysqli::$warning_count ,
mysqli_warning_count
Описание
Объектный стиль
int mysqli->warning_count ;
Процедурный стиль
int mysqli_warning_count(mysqli
link);
Возвращает количество предупреждений от последнего запроса в связи.
Для восстановления предупреждающих сообщений можно использовать команду
SQL SHOW WARNINGS [limit row_count] .
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
Возвращаемое значение
Количество предупреждений или ноль при отсутствии предупреждений.
Примеры
Пример 3.71.
$mysqli->warning_count
Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
/* a remarkable city in Wales */
$query = "INSERT INTO myCity (CountryCode, Name) VALUES('GBR',
'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch')";
$mysqli->query($query);
if ($mysqli->warning_count)
{
if ($result = $mysqli->query("SHOW WARNINGS"))
{
$row = $result->fetch_row();
printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
$result->close();
}
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCity LIKE City");
/* a remarkable long city name in Wales */
$query = "INSERT INTO myCity (CountryCode, Name) VALUES('GBR',
'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch')";
mysqli_query($link, $query);
if (mysqli_warning_count($link))
{
if ($result = mysqli_query($link, "SHOW WARNINGS"))
{
$row = mysqli_fetch_row($result);
printf("%s (%d): %s\n", $row[0], $row[1], $row[2]);
mysqli_free_result($result);
}
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Warning (1264): Data truncated for column 'Name' at row 1
См. также
3.10. Коасс mysqli_stmt
Представляет подготовленный запрос.
mysqli_stmt {mysqli_stmt
Propertiesint mysqli_stmt->affected_rows ;
int mysqli_stmt->errno ;
array mysqli_stmt->error_list ;
string mysqli_stmt->error ;
int mysqli_stmt->field_count ;
int mysqli_stmt->insert_id ;
int mysqli_stmt->num_rows ;
int mysqli_stmt->param_count ;
string mysqli_stmt->sqlstate ;
Methods mysqli_stmt::__construct
(mysqli link,
string query);
int mysqli_stmt::attr_get(int
attr);
bool mysqli_stmt::attr_set(int
attr,
int mode);
bool mysqli_stmt::bind_param(
string types,
mixed var1,
mixed ...);
bool mysqli_stmt::bind_result(
mixed var1,
mixed ...);
bool mysqli_stmt::close();
void mysqli_stmt::data_seek(int
offset);
bool mysqli_stmt::execute();
bool mysqli_stmt::fetch();
void mysqli_stmt::free_result();
mysqli_result mysqli_stmt::get_result();
object mysqli_stmt::get_warnings();
int mysqli_stmt::num_rows();
mixed mysqli_stmt::prepare(string
query);
bool mysqli_stmt::reset();
mysqli_result mysqli_stmt::result_metadata();
bool mysqli_stmt::send_long_data(
int param_nr,
string data);
bool mysqli_stmt::store_result(); }
3.10.1.
mysqli_stmt::$affected_rows ,
mysqli_stmt_affected_rows
mysqli_stmt::$affected_rows
mysqli_stmt_affected_rows
Возвращает общее количество строк, измененных, удаленных или вставленных
последним выполненным запросом.
Описание
Объектный стиль
int mysqli_stmt->affected_rows ;
Процедурный стиль
int mysqli_stmt_affected_rows(
mysqli_stmt stmt);
Возвращает количество строк, затронутых запросом
INSERT , UPDATE или
DELETE .
Эта функция только работает с запросами, которые обновляют таблицу.
Чтобы получить количество строк от запроса SELECT, используйте
mysqli_stmt_num_rows .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Целое число, больше, чем ноль, указывает на количество затронутых строк.
Ноль указывает, что не было никаких записей для UPDATE/DELETE,
никакие строки не соответствовали оператору Where в запросе или что никакой
запрос еще не был выполнен. -1 указывает, что запрос возвратил ошибку.
NULL указывает на недействительный аргумент функции.
Если количество затронутых строк будет больше, чем максимальное значение
PHP int, количество затронутых строк будет возвращено
как значение последовательности.
Примеры
Пример 3.72. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* create temp table */
$mysqli->query("CREATE TEMPORARY TABLE myCountry LIKE Country");
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";
/* prepare statement */
if ($stmt = $mysqli->prepare($query))
{
/* Bind variable for placeholder */
$code = 'A%';
$stmt->bind_param("s", $code);
/* execute statement */
$stmt->execute();
printf("rows inserted: %d\n", $stmt->affected_rows);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.73. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* create temp table */
mysqli_query($link, "CREATE TEMPORARY TABLE myCountry LIKE Country");
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";
/* prepare statement */
if ($stmt = mysqli_prepare($link, $query))
{
/* Bind variable for placeholder */
$code = 'A%';
mysqli_stmt_bind_param($stmt, "s", $code);
/* execute statement */
mysqli_stmt_execute($stmt);
printf("rows inserted: %d\n", mysqli_stmt_affected_rows($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
rows inserted: 17
См. также
3.10.2.
mysqli_stmt::attr_get ,
mysqli_stmt_attr_get
Описание
Объектный стиль
int mysqli_stmt::attr_get(int
attr);
Процедурный стиль
int mysqli_stmt_attr_get(
mysqli_stmt stmt,
int attr);
Получает текущее значение признака запроса.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
attr
Признак, который вы хотите получить.
Возвращаемое значение
FALSE , если признак не найден, иначе
возвращает значение признака.
3.10.3.
mysqli_stmt::attr_set ,
mysqli_stmt_attr_set
Описание
Объектный стиль
bool mysqli_stmt::attr_set(int
attr,
int mode);
Процедурный стиль
bool mysqli_stmt_attr_set(
mysqli_stmt stmt,
int attr,
int mode);
Используется, чтобы изменить поведение подготовленного запросы.
Эта функция может быть вызвана многократно, чтобы
установить несколько признаков.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
attr
Признак, который вы хотите установить. У этого может быть одно
из следующих значений:
Таблица 3.13. Значения атрибута
Значение |
Описание |
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH |
TRUE предписывает обновить метаданные
mysqli_stmt_store_result
значения MYSQL_FIELD->max_length . |
MYSQLI_STMT_ATTR_CURSOR_TYPE |
Тип курсора, чтобы открыть для запроса, когда вызван
mysqli_stmt_execute .
mode может быть
MYSQLI_CURSOR_TYPE_NO_CURSOR (по умолчанию) или
MYSQLI_CURSOR_TYPE_READ_ONLY . |
MYSQLI_STMT_ATTR_PREFETCH_ROWS |
Количество строк, чтобы получить от сервера при использовании курсора.
mode может быть в диапазоне от 1 до максимального
значения unsigned long. По умолчанию 1. |
При использовании MYSQLI_STMT_ATTR_CURSOR_TYPE
с with MYSQLI_CURSOR_TYPE_READ_ONLY ,
курсор открыт для запроса, когда вы вызываете
mysqli_stmt_execute . Если уже есть открытый курсор от предыдущего
mysqli_stmt_execute , это закрывает курсор прежде, чем открыть
новый.
mysqli_stmt_reset
также закроет любой открытый курсор прежде, чем подготовить запрос к
повторному выполнению.
mysqli_stmt_free_result
закроет любой открытый курсор.
Если вы открываете курсор для подготовленного запроса,
mysqli_stmt_store_result не нужен.
mode
Значение, чтобы назначить признаку.
См. также
3.10.4.
mysqli_stmt::bind_param ,
mysqli_stmt_bind_param
Описание
Объектный стиль
bool mysqli_stmt::bind_param(
string types,
mixed var1,
mixed ...);
Процедурный стиль
bool mysqli_stmt_bind_param(
mysqli_stmt stmt,
string types,
mixed var1,
mixed ...);
Свяжет переменные для маркеров параметра в SQL-операторе, который был
передан
mysqli_prepare .
Если размер данных переменной превышает максимальный позволенный размер
пакета (max_allowed_packet), необходимо определить
b в types и использовать
mysqli_stmt_send_long_data , чтобы
послать данные в пакетах.
Необходимо соблюдать осторожность, используя
mysqli_stmt_bind_param вместе с
call_user_func_array . Заметьте, что
mysqli_stmt_bind_param
требует, чтобы параметры были переданы ссылкой, тогда как
call_user_func_array
может принять в качестве параметра список переменных, которые могут
представлять ссылки или значения.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
types
Последовательность, которая содержит один или несколько знаков,
которые определяют типы для связываемых переменных:
Таблица 3.14. Спецификации типа
Символ |
Описание |
i |
integer |
d | double |
s | string |
b |
blob и будет послан в пакетах |
var1
Количество переменных и длина последовательности
types должны соответствовать параметрам в запросе.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.74. Объектный стиль
<?php
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);
/* close statement and connection */
$stmt->close();
/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", $mysqli->affected_rows);
/* close connection */
$mysqli->close();
?>
Пример 3.75. Процедурный стиль
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
mysqli_stmt_execute($stmt);
printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));
/* close statement and connection */
mysqli_stmt_close($stmt);
/* Clean up table CountryLanguage */
mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", mysqli_affected_rows($link));
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
1 Row inserted.
1 Row deleted.
См. также
3.10.5.
mysqli_stmt::bind_result ,
mysqli_stmt_bind_result
Описание
Объектный стиль
bool mysqli_stmt::bind_result(
mixed var1,
mixed ...);
Процедурный стиль
bool mysqli_stmt_bind_result(
mysqli_stmt stmt,
mixed var1,
mixed ...);
Связывает колонки в наборе результатов с переменными.
Когда
mysqli_stmt_fetch вызван, чтобы принести
данные, протокол клиент-сервер MySQL помещает данные для связанных колонок в
указанные переменные var1, ... .
Обратите внимание на то, что все колонки должны быть связаны после
mysqli_stmt_execute но перед
mysqli_stmt_fetch . В зависимости от типов столбца связанные
переменные могут тихо измениться на соответствующий тип PHP.
Колонка может быть связана в любое время, даже после того, как набор
результатов был частично получен. Привязка вступает в силу при следующем
вызове
mysqli_stmt_fetch .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
var1
Переменная, которая будет связана.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.76. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5"))
{
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
/* fetch values */
while ($stmt->fetch())
{
printf("%s %s\n", $col1, $col2);
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.77. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* prepare statement */
if ($stmt = mysqli_prepare($link, "SELECT Code, Name FROM Country ORDER BY Name LIMIT 5"))
{
mysqli_stmt_execute($stmt);
/* bind variables to prepared statement */
mysqli_stmt_bind_result($stmt, $col1, $col2);
/* fetch values */
while (mysqli_stmt_fetch($stmt))
{
printf("%s %s\n", $col1, $col2);
}
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
AFG Afghanistan
ALB Albania
DZA Algeria
ASM American Samoa
AND Andorra
См. также
3.10.6.
mysqli_stmt::close ,
mysqli_stmt_close
Описание
Объектный стиль
bool mysqli_stmt::close();
Процедурный стиль
bool mysqli_stmt_close(
mysqli_stmt stmt);
Закрывает подготовленный запрос.
mysqli_stmt_close
также освобождает дескриптор запроса. Если у текущего запроса есть ожидание
или непрочитанные результаты, эта функция отменяет их так, чтобы следующий
запрос мог быть выполнен.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.10.7.
mysqli_stmt::__construct
Описание
mysqli_stmt::__construct(
mysqli link,
string query);
Создает новый объект mysqli_stmt .
В целом необходимо использовать также
mysqli_prepare или
mysqli_stmt_init , чтобы создать объект
mysqli_stmt вместо того, чтобы непосредственно создать экземпляр
с new
mysqli_stmt . Этот метод (и способность непосредственно
создать экземпляр mysqli_stmt ) может быть удален в будущем.
Параметры
link
Только для процедурного стиля: идентификатор связи, возвращенный
mysqli_connect или
mysqli_init .
query
Запрос, как последовательность. Если этот параметр опущен, то
конструктор ведет себя тождественно
mysqli_stmt_init , если обеспечено, то это ведет себя согласно
mysqli_prepare .
См. также
3.10.8.
mysqli_stmt::data_seek ,
mysqli_stmt_data_seek
Описание
Объектный стиль
void mysqli_stmt::data_seek(int
offset);
Процедурный стиль
void mysqli_stmt_data_seek(
mysqli_stmt stmt,
int offset);
Переходит на произвольный указатель результата в наборе результатов.
mysqli_stmt_store_result
должен быть вызван до
mysqli_stmt_data_seek .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
offset
Должен быть между нолем и общим количеством строк минус одна (0..
mysqli_stmt_num_rows -1).
Примеры
Пример 3.78. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
if ($stmt = $mysqli->prepare($query))
{
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($name, $code);
/* store result */
$stmt->store_result();
/* seek to row no. 400 */
$stmt->data_seek(399);
/* fetch values */
$stmt->fetch();
printf ("City: %sCountrycode: %s\n", $name, $code);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.79. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query))
{
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $name, $code);
/* store result */
mysqli_stmt_store_result($stmt);
/* seek to row no. 400 */
mysqli_stmt_data_seek($stmt, 399);
/* fetch values */
mysqli_stmt_fetch($stmt);
printf ("City: %sCountrycode: %s\n", $name, $code);
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
City: Benin CityCountrycode: NGA
См. также
3.10.9.
mysqli_stmt::$errno ,
mysqli_stmt_errno
Описание
Объектный стиль
int mysqli_stmt->errno ;
Процедурный стиль
int mysqli_stmt_errno(mysqli_stmt
stmt);
Возвращает код ошибки для последней вызванной функции запроса, которая
может иметь успех или потерпеть неудачу.
Номера сообщений об ошибках клиента перечисляются в файле MySQL
errmsg.h , номера сообщений об ошибках
сервера перечисляются в mysqld_error.h .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Значение кода ошибки. Ноль означает, что никакая ошибка не произошла.
Примеры
Пример 3.80. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query))
{
/* drop table */
$mysqli->query("DROP TABLE myCountry");
/* execute query */
$stmt->execute();
printf("Error: %d.\n", $stmt->errno);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.81. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query))
{
/* drop table */
mysqli_query($link, "DROP TABLE myCountry");
/* execute query */
mysqli_stmt_execute($stmt);
printf("Error: %d.\n", mysqli_stmt_errno($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: 1146.
См. также
3.10.10. mysqli_stmt::$error_list ,
mysqli_stmt_error_list
Описание
Объектный стиль
array mysqli_stmt->error_list ;
Процедурный стиль
array mysqli_stmt_error_list(
mysqli_stmt stmt);
Возвращает множество ошибок для последней вызванной функции запроса,
которая может иметь успех или потерпеть неудачу.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Список ошибок, каждый элемент как ассоциативный массив,
содержащий errno, ошибку и sqlstate.
Примеры
Пример 3.82. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query))
{
/* drop table */
$mysqli->query("DROP TABLE myCountry");
/* execute query */
$stmt->execute();
echo "Error:\n";
print_r($stmt->error_list);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.83. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query))
{
/* drop table */
mysqli_query($link, "DROP TABLE myCountry");
/* execute query */
mysqli_stmt_execute($stmt);
echo "Error:\n";
print_r(mysql_stmt_error_list($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Array
(
[0] => Array
(
[errno] => 1146
[sqlstate] => 42S02
[error] => Table 'world.myCountry' doesn't exist
)
)
См. также
3.10.11. mysqli_stmt::$error ,
mysqli_stmt_error
Описание
Объектный стиль
string mysqli_stmt->error ;
Процедурный стиль
string mysqli_stmt_error(
mysqli_stmt stmt);
Возвращает последовательность, содержащую сообщение об ошибке для
последней вызванной функции запроса, которая может иметь успех
или потерпеть неудачу.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Последовательность, которая описывает ошибку. Пустая строка, если никакая
ошибка не произошла.
Примеры
Пример 3.84. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query))
{
/* drop table */
$mysqli->query("DROP TABLE myCountry");
/* execute query */
$stmt->execute();
printf("Error: %s.\n", $stmt->error);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.85. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query))
{
/* drop table */
mysqli_query($link, "DROP TABLE myCountry");
/* execute query */
mysqli_stmt_execute($stmt);
printf("Error: %s.\n", mysqli_stmt_error($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: Table 'world.myCountry' doesn't exist.
См. также
3.10.12. mysqli_stmt::execute ,
mysqli_stmt_execute
Описание
Объектный стиль
bool mysqli_stmt::execute();
Процедурный стиль
bool mysqli_stmt_execute(
mysqli_stmt stmt);
Выполняет запрос, который был ранее подготовлен, используя
mysqli_prepare . Когда выполнено, любые маркеры параметра, которые
существуют, будут автоматически заменены соответствующими данными.
Если запрос UPDATE ,
DELETE или INSERT ,
общее количество затронутых строк может быть определено при помощи
mysqli_stmt_affected_rows .
Аналогично, если запрос приводит к набору результатов, используется
mysqli_stmt_fetch .
Используя
mysqli_stmt_execute ,
mysqli_stmt_fetch
должна использоваться, чтобы получить данные до выполнения
любых дополнительных запросов.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.86. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
/* Prepare an insert statement */
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("sss", $val1, $val2, $val3);
$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';
/* Execute the statement */
$stmt->execute();
$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';
/* Execute the statement */
$stmt->execute();
/* close statement */
$stmt->close();
/* retrieve all rows from myCity */
$query = "SELECT Name, CountryCode, District FROM myCity";
if ($result = $mysqli->query($query))
{
while ($row = $result->fetch_row())
{
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}
/* free result set */
$result->close();
}
/* remove table */
$mysqli->query("DROP TABLE myCity");
/* close connection */
$mysqli->close();
?>
Пример 3.87. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCity LIKE City");
/* Prepare an insert statement */
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);
$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';
/* Execute the statement */
mysqli_stmt_execute($stmt);
$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';
/* Execute the statement */
mysqli_stmt_execute($stmt);
/* close statement */
mysqli_stmt_close($stmt);
/* retrieve all rows from myCity */
$query = "SELECT Name, CountryCode, District FROM myCity";
if ($result = mysqli_query($link, $query))
{
while ($row = mysqli_fetch_row($result))
{
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}
/* free result set */
mysqli_free_result($result);
}
/* remove table */
mysqli_query($link, "DROP TABLE myCity");
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Stuttgart (DEU,Baden-Wuerttemberg)
Bordeaux (FRA,Aquitaine)
См. также
3.10.13.
mysqli_stmt::fetch ,
mysqli_stmt_fetch
Описание
Объектный стиль
bool mysqli_stmt::fetch();
Процедурный стиль
bool mysqli_stmt_fetch(
mysqli_stmt stmt);
Получает результаты из подготовленного запроса в переменные, связанные
mysqli_stmt_bind_result .
Обратите внимание на то, что все колонки должны быть связаны перед
запросом
mysqli_stmt_fetch .
Данные передаются небуферизированные без запроса
mysqli_stmt_store_result , что
может уменьшить производительность (но точно уменьшает затраты памяти).
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Таблица 3.15. Возвращаемые значения
Value | Описание |
TRUE |
Успех. Данные были получены. |
FALSE |
Ошибка произошла. |
NULL |
Больше строк/данных не существует, или усечение данных произошло.
|
Примеры
Пример 3.88. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";
if ($stmt = $mysqli->prepare($query))
{
/* execute statement */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($name, $code);
/* fetch values */
while ($stmt->fetch())
{
printf ("%s (%s)\n", $name, $code);
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.89. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";
if ($stmt = mysqli_prepare($link, $query))
{
/* execute statement */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $name, $code);
/* fetch values */
while (mysqli_stmt_fetch($stmt))
{
printf ("%s (%s)\n", $name, $code);
}
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Rockford (USA)
Tallahassee (USA)
Salinas (USA)
Santa Clarita (USA)
Springfield (USA)
См. также
3.10.14. mysqli_stmt::$field_count ,
mysqli_stmt_field_count
Описание
Объектный стиль
int mysqli_stmt->field_count ;
Процедурный стиль
int mysqli_stmt_field_count(
mysqli_stmt stmt);
Эта функция пока не документирована, есть только список параметров.
3.10.15.
mysqli_stmt::free_result ,
mysqli_stmt_free_result
Описание
Объектный стиль
void mysqli_stmt::free_result();
Процедурный стиль
void mysqli_stmt_free_result(
mysqli_stmt stmt);
Освобождает память результата, связанную с запросом, которая была
ассигнована
mysqli_stmt_store_result .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
См. также
3.10.16.
mysqli_stmt::get_result ,
mysqli_stmt_get_result
Описание
Объектный стиль
mysqli_result mysqli_stmt::get_result();
Процедурный стиль
mysqli_result mysqli_stmt_get_result(
mysqli_stmt stmt);
Вызовите, чтобы возвратить набор результатов из подготовленного запроса.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Возвращает набор результатов для успешных запросов SELECT или
FALSE для других запросов DML или при неудаче.
mysqli_errno может использоваться, чтобы различать
два типа неудачи.
Только MySQL Native Driver
Доступно только с mysqlnd.
Примеры
Пример 3.90. Объектный стиль
<?php
$mysqli = new mysqli("127.0.0.1", "user", "password", "world");
if ($mysqli->connect_error)
{
die("$mysqli->connect_errno: $mysqli->connect_error");
}
$query = "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1";
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare($query))
{
print "Failed to prepare statement\n";
}
else
{
$stmt->bind_param("s", $continent);
$continent_array = array('Europe','Africa','Asia','North America');
foreach($continent_array as $continent)
{
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
}
}
$stmt->close();
$mysqli->close();
?>
Пример 3.91. Процедурный стиль
<?php
$link = mysqli_connect("127.0.0.1", "user", "password", "world");
if (!$link)
{
$error = mysqli_connect_error();
$errno = mysqli_connect_errno();
print "$errno: $error\n";
exit();
}
$query = "SELECT Name, Population, Continent FROM Country WHERE Continent=? ORDER BY Name LIMIT 1";
$stmt = mysqli_stmt_init($link);
if (!mysqli_stmt_prepare($stmt, $query))
{
print "Failed to prepare statement\n";
}
else
{
mysqli_stmt_bind_param($stmt, "s", $continent);
$continent_array = array('Europe','Africa','Asia','North America');
foreach($continent_array as $continent)
{
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_array($result, MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
}
}
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Albania 3401200 Europe
Algeria 31471000 Africa
Afghanistan 22720000 Asia
Anguilla 8000 North America
См. также
3.10.17. mysqli_stmt::get_warnings ,
mysqli_stmt_get_warnings
Описание
Объектный стиль
object mysqli_stmt::get_warnings();
Процедурный стиль
object mysqli_stmt_get_warnings(
mysqli_stmt stmt);
Эта функция пока не документирована, есть только список параметров.
3.10.18. mysqli_stmt::$insert_id ,
mysqli_stmt_insert_id
Описание
Объектный стиль
int mysqli_stmt->insert_id ;
Процедурный стиль
mixed mysqli_stmt_insert_id(
mysqli_stmt stmt);
Эта функция пока не документирована, есть только список параметров.
3.10.19. mysqli_stmt::more_results ,
mysqli_stmt_more_results
Описание
Объектный стиль (method):
public bool mysqli_stmt::more_results
();
Процедурный стиль:
bool mysqli_stmt_more_results(
mysql_stmt stmt);
Проверяет, есть ли еще результаты от мультизапроса.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
TRUE , если результаты есть, иначе
FALSE .
Только MySQL Native Driver
Доступно только с mysqlnd.
См. также
3.10.20. mysqli_stmt::next_result ,
mysqli_stmt_next_result
Описание
Объектный стиль (method):
public bool mysqli_stmt::next_result
();
Процедурный стиль:
bool mysqli_stmt_next_result(
mysql_stmt stmt);
Читает следующий результат мультизапроса.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Ошибки и исключения
Выдает уровень ошибки E_STRICT ,
если набор результатов не существует и предлагает использовать
mysqli_stmt::more_results
в этих случаях перед запросом
mysqli_stmt::next_result .
Только MySQL Native Driver
Доступно только с mysqlnd.
См. также
3.10.21. mysqli_stmt::$num_rows ,
mysqli_stmt::num_rows ,
mysqli_stmt_num_rows
Описание
Объектный стиль
int mysqli_stmt->num_rows ;
int mysqli_stmt::num_rows();
Процедурный стиль
int mysqli_stmt_num_rows(
mysqli_stmt stmt);
Возвращает количество строк в наборе результатов. Использование
mysqli_stmt_num_rows
зависит от того, использовали ли вы
mysqli_stmt_store_result , чтобы
буферизовать весь набор результатов в дескипторе запроса.
При использовании
mysqli_stmt_store_result ,
mysqli_stmt_num_rows
может быть немедленно вызван.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Целое число, представляющее количество строк в наборе результатов.
Примеры
Пример 3.92. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if ($stmt = $mysqli->prepare($query))
{
/* execute query */
$stmt->execute();
/* store result */
$stmt->store_result();
printf("Number of rows: %d.\n", $stmt->num_rows);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.93. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if ($stmt = mysqli_prepare($link, $query))
{
/* execute query */
mysqli_stmt_execute($stmt);
/* store result */
mysqli_stmt_store_result($stmt);
printf("Number of rows: %d.\n", mysqli_stmt_num_rows($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Number of rows: 20.
См. также
3.10.22. mysqli_stmt::$param_count ,
mysqli_stmt_param_count
Описание
Объектный стиль
int mysqli_stmt->param_count ;
Процедурный стиль
int mysqli_stmt_param_count(
mysqli_stmt stmt);
Возвращает количество маркеров параметров,
существующих в подготовленном запросе.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Возвращает целое число, представляющее количество параметров.
Примеры
Пример 3.94. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($stmt = $mysqli->prepare("SELECT Name FROM Country WHERE Name=? OR Code=?"))
{
$marker = $stmt->param_count;
printf("Statement has %d markers.\n", $marker);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.95. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($stmt = mysqli_prepare($link, "SELECT Name FROM Country WHERE Name=? OR Code=?"))
{
$marker = mysqli_stmt_param_count($stmt);
printf("Statement has %d markers.\n", $marker);
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Statement has 2 markers.
См. также
3.10.23. mysqli_stmt::prepare ,
mysqli_stmt_prepare
Описание
Объектный стиль
mixed mysqli_stmt::prepare(string
query);
Процедурный стиль
bool mysqli_stmt_prepare(
mysqli_stmt stmt,
string query);
Подготовит SQL-оператор, который задает законченная
пустым указателем последовательность.
Маркеры параметра должны быть связаны с переменными использованием
mysqli_stmt_bind_param и/или
mysqli_stmt_bind_result
прежде, чем выполнить запрос или получить данные.
В случае когда вы передаете запрос
mysqli_stmt_prepare более длинный, чем
max_allowed_packet сервера,
возвращенные коды ошибок отличаются в зависимости от того, используете ли вы
MySQL Native Driver (mysqlnd ) или MySQL Client
Library (libmysqlclient ). Поведение следующее:
mysqlnd в Linux возвращает код ошибки
1153. Это сообщение got a packet
bigger than max_allowed_packet bytes.
mysqlnd в Windows возвращает код ошибки
2006. Это сообщение server has gone away.
libmysqlclient на всех платформах
возвращает код ошибки 2006. Это server has gone away
.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
query
Запрос, как последовательность. Это должно состоять из
единственного SQL-оператора.
Можно включать один или несколько маркеров параметра в SQL-оператор,
включая вопросительный знак
(? ) в соответствующих положениях.
Вы не должны добавлять заканчивающую точку с запятой или
\g .
Маркеры законны только в определенных местах в SQL-операторах. Например, в
списке VALUES() для INSERT (чтобы определить значения столбцов для строки)
или в сравнении с колонкой в операторе Where, чтобы определить значение.
Однако, они не позволяются для идентификаторов (таких как имена
таблицы или столбцов) в списке выборки, который называет колонки, которые
будут возвращены оператором SELECT) или чтобы определить оба операнда
бинарного оператора, например, = .
Последнее ограничение необходимо, потому что было бы невозможно определить
тип параметра. В целом параметры законны только в запросах Data Manipulation
Language (DML) statements, но не в Data Definition Language (DDL).
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.96. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* create a prepared statement */
$stmt =$mysqli->stmt_init();
if ($stmt->prepare("SELECT District FROM City WHERE Name=?"))
{
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.97. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* create a prepared statement */
$stmt = mysqli_stmt_init($link);
if (mysqli_stmt_prepare($stmt, 'SELECT District FROM City WHERE Name=?'))
{
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
/* fetch value */
mysqli_stmt_fetch($stmt);
printf("%s is in district %s\n", $city, $district);
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Amersfoort is in district Utrecht
См. также
3.10.24. mysqli_stmt::reset ,
mysqli_stmt_reset
Описание
Объектный стиль
bool mysqli_stmt::reset();
Процедурный стиль
bool mysqli_stmt_reset(
mysqli_stmt stmt);
Перезагружает подготовленный запрос на клиенте и сервере.
Это перезагружает запрос, данные, посланные после
mysqli_stmt_send_long_data ,
небуферизированные наборы результатов и текущие ошибки. Это не очищает
привязанные или сохраненные наборы результатов.
Сохраненные наборы результатов будут очищены, выполняя подготовленный запрос
(или закрывая его).
Чтобы подготовить другой запрос, используют функцию
mysqli_stmt_prepare .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
См. также
3.10.25. mysqli_stmt::result_metadata ,
mysqli_stmt_result_metadata
mysqli_stmt::result_metadata
mysqli_stmt_result_metadata
Метаданные набора результатов из подготовленного запроса.
Описание
Объектный стиль
mysqli_result mysqli_stmt::result_metadata
();
Процедурный стиль
mysqli_result mysqli_stmt_result_metadata(
mysqli_stmt stmt);
Если запрос, переданный к
mysqli_prepare производит набор результатов,
mysqli_stmt_result_metadata
возвращает объект результата, который может использоваться, чтобы обработать
метаинформацию, такую как общее количество полей и
отдельную полевую информацию.
Этот указатель набора результатов может быть передан как аргумент любой из
полевых функций, которые обрабатывают метаданные
набора результатов, например:
Структура набора результатов должна быть освобождена, когда вы закончите
работу с ней, это можно сделать, передав ее к
mysqli_free_result .
Набор результатов, возвращенный
mysqli_stmt_result_metadata ,
содержит только метаданные. Это не содержит строки результатов.
Строки получены при помощи
mysqli_stmt_fetch .
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Возвращает объект результата или FALSE ,
если ошибка произошла.
Примеры
Пример 3.98. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
$mysqli->query("DROP TABLE IF EXISTS friends");
$mysqli->query("CREATE TABLE friends (id int, name varchar(20))");
$mysqli->query("INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
$stmt = $mysqli->prepare("SELECT id, name FROM friends");
$stmt->execute();
/* get resultset for metadata */
$result = $stmt->result_metadata();
/* retrieve field information from metadata result set */
$field = $result->fetch_field();
printf("Fieldname: %s\n", $field->name);
/* close resultset */
$result->close();
/* close connection */
$mysqli->close();
?>
Пример 3.99. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
mysqli_query($link, "DROP TABLE IF EXISTS friends");
mysqli_query($link, "CREATE TABLE friends (id int, name varchar(20))");
mysqli_query($link, "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
$stmt = mysqli_prepare($link, "SELECT id, name FROM friends");
mysqli_stmt_execute($stmt);
/* get resultset for metadata */
$result = mysqli_stmt_result_metadata($stmt);
/* retrieve field information from metadata result set */
$field = mysqli_fetch_field($result);
printf("Fieldname: %s\n", $field->name);
/* close resultset */
mysqli_free_result($result);
/* close connection */
mysqli_close($link);
?>
См. также
3.10.26. mysqli_stmt::send_long_data ,
mysqli_stmt_send_long_data
mysqli_stmt::send_long_data
mysqli_stmt_send_long_data
Посылает данные в блоках.
Описание
Объектный стиль
bool mysqli_stmt::send_long_data(
int param_nr,
string data);
Процедурный стиль
bool mysqli_stmt_send_long_data(
mysqli_stmt stmt,
int param_nr,
string data);
Позволяет посылать данные параметров в сервер в частях (или кусками),
например, если размер blob превышает размер
max_allowed_packet .
Эта функция может быть вызвана многократно, чтобы послать части символьных
или значения двоичных данных для колонки, которая должна быть одним из типов
данных BLOB или TEXT.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
param_nr
Указывает, который параметр связать с данными.
Параметры пронумерованы, начиная с 0.
data
Последовательность, содержащая данные, которые пошлют.
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.100. Объектный стиль
<?php
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp))
{
$stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
?>
См. также
3.10.27. mysqli_stmt::$sqlstate ,
mysqli_stmt_sqlstate
Описание
Объектный стиль
string mysqli_stmt->sqlstate ;
Процедурный стиль
string mysqli_stmt_sqlstate(
mysqli_stmt stmt);
Возвращает последовательность, содержащую код ошибки SQLSTATE для
последней вызванной подготовленной функции запроса, которая может иметь успех
или потерпеть неудачу. Код ошибки состоит из пяти знаков.
'00000' означает отсутствие ошибки.
Значения определяются ANSI SQL и ODBC. Для списка возможных значений см.
http://dev.mysql.com/doc/mysql/en/error-handling.html.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Возвращает последовательность, содержащую код ошибки SQLSTATE для
последней ошибки. Код ошибки состоит из пяти знаков.
'00000' означает отсутствие ошибки.
Примечания
Обратите внимание на то, что не все ошибки MySQL все же отображены в
SQLSTATE. Значение HY000 (general error)
используется для неотображенных ошибок.
Примеры
Пример 3.101. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCountry LIKE Country");
$mysqli->query("INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = $mysqli->prepare($query))
{
/* drop table */
$mysqli->query("DROP TABLE myCountry");
/* execute query */
$stmt->execute();
printf("Error: %s.\n", $stmt->sqlstate);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.102. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCountry LIKE Country");
mysqli_query($link, "INSERT INTO myCountry SELECT * FROM Country");
$query = "SELECT Name, Code FROM myCountry ORDER BY Name";
if ($stmt = mysqli_prepare($link, $query))
{
/* drop table */
mysqli_query($link, "DROP TABLE myCountry");
/* execute query */
mysqli_stmt_execute($stmt);
printf("Error: %s.\n", mysqli_stmt_sqlstate($stmt));
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Error: 42S02.
См. также
3.10.28. mysqli_stmt::store_result ,
mysqli_stmt_store_result
Описание
Объектный стиль
bool mysqli_stmt::store_result();
Процедурный стиль
bool mysqli_stmt_store_result(
mysqli_stmt stmt);
Необходимо вызвать
mysqli_stmt_store_result
для каждого запроса, который успешно производит набор результатов
(SELECT, SHOW, DESCRIBE, EXPLAIN ),
если и только если вы хотите буферизовать полный набор результатов на
клиенте, чтобы последующий вызов
mysqli_stmt_fetch вернул буферизованные данные.
Не нужно вызывать
mysqli_stmt_store_result
для других запросов, но это не будет вредить или вызывать любую известную
потерю производительности во всех случаях. Можно обнаружить, произвел ли
запрос набор результатов, проверив возвращает ли
mysqli_stmt_result_metadata NULL.
Параметры
stmt
Только для процедурного стиля: идентификатор запроса, возвращенный
mysqli_stmt_init .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.103. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if ($stmt = $mysqli->prepare($query))
{
/* execute query */
$stmt->execute();
/* store result */
$stmt->store_result();
printf("Number of rows: %d.\n", $stmt->num_rows);
/* free result */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.104. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if ($stmt = mysqli_prepare($link, $query))
{
/* execute query */
mysqli_stmt_execute($stmt);
/* store result */
mysqli_stmt_store_result($stmt);
printf("Number of rows: %d.\n", mysqli_stmt_num_rows($stmt));
/* free result */
mysqli_stmt_free_result($stmt);
/* close statement */
mysqli_stmt_close($stmt);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Number of rows: 20.
См. также
3.11. Класс mysqli_result
Представляет набор результатов, полученный из запроса к базе данных.
Журнал изменений
Таблица 3.16. Журнал изменений
Версия |
Описание |
5.4.0 |
Добавлена поддержка Iterator ,
mysqli_result теперь реализует
Traversable . |
mysqli_result {
mysqli_result
, Traversable
Propertiesint
mysqli_result->current_field;
int mysqli_result->field_count ;
array mysqli_result->lengths ;
int mysqli_result->num_rows ;
Methodsbool mysqli_result::data_seek(
int offset);
mixed mysqli_result::fetch_all(
int resulttype= =MYSQLI_NUM);
mixed mysqli_result::fetch_array(
int resulttype= =MYSQLI_BOTH);
array mysqli_result::fetch_assoc();
object mysqli_result::fetch_field_direct(
int fieldnr);
object mysqli_result::fetch_field();
array mysqli_result::fetch_fields();
object mysqli_result::fetch_object(
string class_name= ="stdClass",
array params);
mixed mysqli_result::fetch_row();
bool mysqli_result::field_seek(
int fieldnr);
void mysqli_result::free(); }
3.11.1. mysqli_result::$current_field ,
mysqli_field_tell
Описание
Объектный стиль
int mysqli_result->current_field ;
Процедурный стиль
int mysqli_field_tell(
mysqli_result result);
Возвращает положение полевого курсора, используемого для последнего вызова
mysqli_fetch_field .
Это значение может использоваться в качестве аргумента
mysqli_field_seek .
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Текущее смещение полевого курсора.
Примеры
Пример 3.105. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = $mysqli->query($query))
{
/* Get field information for all columns */
while ($finfo = $result->fetch_field())
{
/* get fieldpointer offset */
$currentfield = $result->current_field;
printf("Column %d:\n", $currentfield);
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.106. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query))
{
/* Get field information for all fields */
while ($finfo = mysqli_fetch_field($result))
{
/* get fieldpointer offset */
$currentfield = mysqli_field_tell($result);
printf("Column %d:\n", $currentfield);
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Column 1:
Name: Name
Table:Country
max. Len: 11
Flags:1
Type: 254
Column 2:
Name: SurfaceArea
Table:Country
max. Len: 10
Flags:32769
Type: 4
См. также
3.11.2. mysqli_result::data_seek ,
mysqli_data_seek
Описание
Объектный стиль
bool mysqli_result::data_seek(int
offset);
Процедурный стиль
bool mysqli_data_seek(
mysqli_result result,
int offset);
mysqli_data_seek
переходит на произвольный указатель результата, определенный
offset в наборе результатов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
offset
Полевое смещение. Должен быть между нолем и общим количеством строк
минус одна (0..
mysqli_num_rows - 1).
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примечания
Эта функция может использоваться только с буферизированными результатами,
полученными от использования
mysqli_store_result или
mysqli_query .
Примеры
Пример 3.107. Объектный стиль
<?php
/* Open a connection */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
if ($result = $mysqli->query($query))
{
/* seek to row no. 400 */
$result->data_seek(399);
/* fetch row */
$row = $result->fetch_row();
printf ("City: %sCountrycode: %s\n", $row[0], $row[1]);
/* free result set*/
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.108. Процедурный стиль
<?php
/* Open a connection */
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (!$link)
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER BY Name";
if ($result = mysqli_query($link, $query))
{
/* seek to row no. 400 */
mysqli_data_seek($result, 399);
/* fetch row */
$row = mysqli_fetch_row($result);
printf ("City: %sCountrycode: %s\n", $row[0], $row[1]);
/* free result set*/
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
City: Benin CityCountrycode: NGA
См. также
3.11.3.
mysqli_result::fetch_all ,
mysqli_fetch_all
Описание
Объектный стиль
mixed mysqli_result::fetch_all(
int resulttype= =MYSQLI_NUM);
Процедурный стиль
mixed mysqli_fetch_all(
mysqli_result result,
int resulttype= =MYSQLI_NUM
);
mysqli_fetch_all получает все строки
результата как ассоциативный массив, числовое
множество или оба.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
resulttype
Этот дополнительный параметр постоянное указание, какое множество
должно быть произведено из текущих данных строки. Возможные значения для
этого параметра это константы
constants MYSQLI_ASSOC ,
MYSQLI_NUM или
MYSQLI_BOTH .
Возвращаемое значение
Возвращает множество ассоциативных или числовых множеств,
содержащих строки результата.
Только MySQL Native Driver
Доступно только с mysqlnd.
Когда
mysqli_fetch_all
вернет все строки как множество в единственном шаге, это может потреблять
больше памяти, чем некоторые подобные функции, такие как
mysqli_fetch_array ,
которая возвращает только одну строку за один раз из набора результатов.
Далее, если необходимо итерировать по набору результатов, вам будет нужна
конструкция цикла, которая повлияет на производительность. По этим причинам
mysqli_fetch_all
должен использоваться только в тех ситуациях, когда принесенный набор
результатов пошлют в другой слой для обработки.
См. также
3.11.4.
mysqli_result::fetch_array ,
mysqli_fetch_array
Описание
Объектный стиль
mixed mysqli_result::fetch_array(
int resulttype= =MYSQLI_BOTH);
Процедурный стиль
mixed mysqli_fetch_array(
mysqli_result result,
int resulttype= =MYSQLI_BOTH
);
Возвращает множество, которое соответствует строке, или
NULL , если больше нет строк для набора
результатов, представленного параметром result .
mysqli_fetch_array это расширенная версия
mysqli_fetch_row .
В дополнение к тому, чтобы хранить данные в числовых индексах множества
результата,
mysqli_fetch_array
может также хранить данные в ассоциативных индексах, используя имена полей
набора результатов как ключи.
Имена полей, возвращенные этой функцией
are чувствительны к регистру.
Эта функция устанавливает области NULL в значение PHP
the PHP NULL .
Если у двух или больше колонок результата будут те же самые имена полей,
последняя колонка будет иметь приоритет и переписывать более ранние данные.
Чтобы получить доступ к многочисленным колонкам с тем же самым именем,
должна использоваться индексируемая версия строки.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
resulttype
Этот дополнительный параметр постоянное указание, какое множество
должно быть произведено из текущих данных строки. Возможные значения для
этого параметра константы
constants MYSQLI_ASSOC ,
MYSQLI_NUM или
MYSQLI_BOTH .
При помощи MYSQLI_ASSOC
эта функция будет вести себя тождественно
mysqli_fetch_assoc в то время, как
MYSQLI_NUM будет вести себя тождественно
mysqli_fetch_row .
Заключительный выбор MYSQLI_BOTH
создаст единый массив с признаками обоих.
Возвращаемое значение
Возвращает множество последовательностей, которое соответствует
принесенной строке, или NULL ,
если больше нет строк в наборе результатов.
Примеры
Пример 3.109. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = $mysqli->query($query);
/* numeric array */
$row = $result->fetch_array(MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);
/* associative array */
$row = $result->fetch_array(MYSQLI_ASSOC);
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
/* associative and numeric array */
$row = $result->fetch_array(MYSQLI_BOTH);
printf ("%s (%s)\n", $row[0], $row["CountryCode"]);
/* free result set */
$result->free();
/* close connection */
$mysqli->close();
?>
Пример 3.110. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = mysqli_query($link, $query);
/* numeric array */
$row = mysqli_fetch_array($result, MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);
/* associative array */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
/* associative and numeric array */
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
printf ("%s (%s)\n", $row[0], $row["CountryCode"]);
/* free result set */
mysqli_free_result($result);
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Kabul (AFG)
Qandahar (AFG)
Herat (AFG)
См. также
3.11.5. mysqli_result::fetch_assoc ,
mysqli_fetch_assoc
Описание
Объектный стиль
array mysqli_result::fetch_assoc();
Процедурный стиль
array mysqli_fetch_assoc(
mysqli_result result);
Возвращает ассоциативный массив, который соответствует строке, или
NULL , если больше нет строк.
Имена полей, возвращенные этой функцией
чувствительны к регистру.
Эта функция устанавливает поля NULL в значение
PHP NULL .
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Возвращает ассоциативный массив последовательностей, представляющих
строку в наборе результатов, где каждый ключ во множестве представляет
название одной из колонок набора результатов или
NULL , если больше нет
строк в наборе результатов.
Если у двух или больше колонок результата будут те же самые имена полей,
последняя колонка будет иметь приоритет. Чтобы получить доступ к другой
колонке (колонкам) с тем же самым именем, необходимо
получить доступ к результату с числовыми индексами при помощи
mysqli_fetch_row
или добавьте псевдонимы имен.
Примеры
Пример 3.111. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = $mysqli->query($query))
{
/* fetch associative array */
while ($row = $result->fetch_assoc())
{
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}
/* free result set */
$result->free();
}
/* close connection */
$mysqli->close();
?>
Пример 3.112. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = mysqli_query($link, $query))
{
/* fetch associative array */
while ($row = mysqli_fetch_assoc($result))
{
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}
/* free result set */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)
Пример 3.113. Пример сравнения mysqli_result
с использованием iterator
<?php
$c = mysqli_connect('127.0.0.1','user', 'pass');
// Using iterators (support was added with PHP 5.4)
foreach ( $c->query('SELECT user,host FROM mysql.user') as $row)
{
printf("'%s'@'%s'\n", $row['user'], $row['host']);
}
echo "\n==================\n";
// Not using iterators
$result = $c->query('SELECT user,host FROM mysql.user');
while ($row = $result->fetch_assoc())
{
printf("'%s'@'%s'\n", $row['user'], $row['host']);
}
?>
Этот пример вернет нечто вроде:
'root'@'192.168.1.1'
'root'@'127.0.0.1'
'dude'@'localhost'
'lebowski'@'localhost'
==================
'root'@'192.168.1.1'
'root'@'127.0.0.1'
'dude'@'localhost'
'lebowski'@'localhost'
См. также
3.11.6.
mysqli_result::fetch_field_direct ,
mysqli_fetch_field_direct
mysqli_result::fetch_field_direct
mysqli_fetch_field_direct
Метаданные для единственного поля.
Описание
Объектный стиль
object mysqli_result::fetch_field_direct(
int fieldnr);
Процедурный стиль
object mysqli_fetch_field_direct(
mysqli_result result,
int fieldnr);
Возвращает объект, который содержит информацию об определении поля от
указанного набора результатов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
fieldnr
Номер поля. Это значение должно быть в диапазоне от
0 до
число полей-1 .
Возвращаемое значение
Возвращает объект, который содержит информацию об определении поля, или
FALSE , если никакая полевая информация для
указанного fieldnr недоступна.
Таблица 3.17. Атрибуты объектов
Признак |
Описание |
name | Название колонки |
orgname |
Имя первоначального столбца, если псевдоним был определен. |
table |
Название таблицы, которой это поле принадлежит
(если не вычислено). |
orgtable |
Оригинальное имя таблицы, если псевдоним был определен. |
def |
Значение по умолчанию для этого поля,
представленное как последовательность. |
max_length |
Максимальная ширина поля для набора результатов. |
length |
Ширина поля, как определено в определении таблицы. |
charsetnr |
Номер набора символов для поля. |
flags |
integer, представляющий битовые флаги для поля. |
type |
Тип данных для этого поля. |
decimals |
Количество десятичных чисел (для числовых полей).
|
Примеры
Пример 3.114. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($result = $mysqli->query($query))
{
/* Get field information for column 'SurfaceArea' */
$finfo = $result->fetch_field_direct(1);
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n", $finfo->type);
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.115. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($result = mysqli_query($link, $query))
{
/* Get field information for column 'SurfaceArea' */
$finfo = mysqli_fetch_field_direct($result, 1);
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n", $finfo->type);
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Name: SurfaceArea
Table:Country
max. Len: 10
Flags:32769
Type: 4
См. также
3.11.7. mysqli_result::fetch_field ,
mysqli_fetch_field
Описание
Объектный стиль
object mysqli_result::fetch_field();
Процедурный стиль
object mysqli_fetch_field(
mysqli_result result);
Возвращает определение одной колонки набора результатов как объект.
Вызовите эту функцию неоднократно, чтобы собрать информацию обо всех
колонках в наборе результатов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Возвращает объект, который содержит информацию об определении поля, или
FALSE при отсутствии данных.
Таблица 3.18. Свойства объекта
Свойство |
Описание |
name | Название. |
orgname |
Имя первоначального столбца, если псевдоним был определен. |
table |
Название таблицы, которой поле принадлежит
(если не вычислено). |
orgtable |
Оригинальное имя таблицы, если псевдоним был определен. |
def |
Зарезервировано для значения по умолчанию,
в настоящее время всегда "". |
db | База данных (с PHP 5.3.6). |
catalog |
Название каталога, всегда "def" (с PHP 5.3.6). |
max_length |
Максимальная ширина поля для набора результатов. |
length |
Ширина поля, как определено в определении таблицы. |
charsetnr |
Номер набора символов для поля. |
flags |
integer, представляющий битовые флаги для поля. |
type |
Тип данных поля. |
decimals |
Количество десятичных чисел (для полей integer).
|
Примеры
Пример 3.116. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = $mysqli->query($query))
{
/* Get field information for all columns */
while ($finfo = $result->fetch_field())
{
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.117. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query))
{
/* Get field information for all fields */
while ($finfo = mysqli_fetch_field($result))
{
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Name: Name
Table:Country
max. Len: 11
Flags:1
Type: 254
Name: SurfaceArea
Table:Country
max. Len: 10
Flags:32769
Type: 4
См. также
3.11.8. mysqli_result::fetch_fields ,
mysqli_fetch_fields
mysqli_result::fetch_fields
mysqli_fetch_fields
Возвращает множество объектов, представляющих
области в наборе результатов.
Описание
Объектный стиль
array mysqli_result::fetch_fields();
Процедурный стиль
array mysqli_fetch_fields(
mysqli_result result);
Эта функция идентична
mysqli_fetch_field с единственным
различием в том, что вместо того чтобы возвратить один объект за один раз для
каждого поля, колонки возвращены как множество объектов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Возвращает множество объектов, которое содержит информацию об определении
поля или FALSE , если нет данных.
Таблица 3.19. Свойства объекта
Свойство |
Описание |
name |
Название колонки. |
orgname |
Имя первоначального столбца, если псевдоним был определен. |
table |
Название таблицы, которой это поле принадлежит
(если не вычислено). |
orgtable |
Оригинальное имя таблицы, если псевдоним был определен. |
max_length |
Максимальная ширина поля для набора результатов. |
length |
Ширина поля в байтах, как определено в определении таблицы.
Обратите внимание на то, что это число (байты) могло бы отличаться от вашей
значения определения таблицы (символы), в зависимости от набора символов,
который вы используете. Например, у набора символов utf8 есть 3 байта на
символ, таким образом, varchar(10) возвратит длину 30 для utf8 (10*3),
но 10 для latin1 (10*1). |
charsetnr |
Номер набора символов (id) для поля. |
flags |
integer, представляющий битовые флаги для поля. |
type |
Тип данных для этого поля. |
decimals |
Количество десятичных чисел (для полей integer).
|
Примеры
Пример 3.118. Объектный стиль
<?php
$mysqli = new mysqli("127.0.0.1", "root", "foofoo", "sakila");
/* check connection */
if ($mysqli->connect_errno)
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
foreach (array('latin1', 'utf8') as $charset)
{
// Set character set, to show its impact on some values (e.g., length in bytes)
$mysqli->set_charset($charset);
$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";
echo "======================\n";
echo "Character Set: $charset\n";
echo "======================\n";
if ($result = $mysqli->query($query))
{
/* Get field information for all columns */
$finfo = $result->fetch_fields();
foreach ($finfo as $val)
{
printf("Name:%s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len:%d\n", $val->max_length);
printf("Length:%d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type:%d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>
Пример 3.119. Процедурный стиль
<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
foreach (array('latin1', 'utf8') as $charset)
{
// Set character set, to show its impact on some values (e.g., length in bytes)
mysqli_set_charset($link, $charset);
$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";
echo "======================\n";
echo "Character Set: $charset\n";
echo "======================\n";
if ($result = mysqli_query($link, $query))
{
/* Get field information for all columns */
$finfo = mysqli_fetch_fields($result);
foreach ($finfo as $val)
{
printf("Name:%s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len:%d\n", $val->max_length);
printf("Length:%d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type:%d\n\n", $val->type);
}
mysqli_free_result($result);
}
}
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
======================
Character Set: latin1
======================
Name:actor_id
Table: actor
Max. Len:3
Length:5
charsetnr: 63
Flags: 49699
Type:2
Name:last_name
Table: actor
Max. Len:12
Length:45
charsetnr: 8
Flags: 20489
Type:253
======================
Character Set: utf8
======================
Name:actor_id
Table: actor
Max. Len:3
Length:5
charsetnr: 63
Flags: 49699
Type:2
Name:last_name
Table: actor
Max. Len:12
Length:135
charsetnr: 33
Flags: 20489
См. также
3.11.9. mysqli_result::fetch_object ,
mysqli_fetch_object
Описание
Объектный стиль
object mysqli_result::fetch_object(
string class_name= ="stdClass",
array params);
Процедурный стиль
object mysqli_fetch_object(
mysqli_result result,
string class_name= ="stdClass"
, array params);
mysqli_fetch_object
возвратит текущую строку набора результатов как объект, где признаки объекта
представляют названия полей, найденных в наборе результатов.
Заметьте, что
mysqli_fetch_object
устанавливает свойства объекта прежде, чем вызвать конструктор.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
class_name
Название класса, чтобы создать экземпляр, установить свойства и
вернуть. Если не определен, вернется объект stdClass .
params
Дополнительный array параметров, чтобы передать
конструктору для объектов class_name .
Возвращаемое значение
Возвращает объект со свойствами строки, который соответствует строке, или
NULL , если больше нет
строк в наборе результатов.
Имена полей, возвращенные этой функцией
are чувствительные к регистру.
Эта функция устанавливает области NULL в значене PHP
NULL .
Примеры
Пример 3.120. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = $mysqli->query($query))
{
/* fetch object array */
while ($obj = $result->fetch_object())
{
printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
}
/* free result set */
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.121. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = mysqli_query($link, $query))
{
/* fetch associative array */
while ($obj = mysqli_fetch_object($result))
{
printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
}
/* free result set */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)
См. также
3.11.10. mysqli_result::fetch_row ,
mysqli_fetch_row
Описание
Объектный стиль
mixed mysqli_result::fetch_row();
Процедурный стиль
mixed mysqli_fetch_row(
mysqli_result result);
Получает одну строку данных из набора результатов и вернет это как
перечисленное множество, где каждая колонка сохранена в смещении
множества, начиная с 0 (ноль). Каждое последующее обращение
к этой функции возвратит следующую строку в наборе результатов, или
NULL , если больше нет строк.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
mysqli_fetch_row
возвращает множество последовательностей, которое соответствует строке или
NULL , если больше нет
строк в наборе результатов.
Эта функция устанавливает поля NULL в значение
PHP NULL .
Примеры
Пример 3.122. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = $mysqli->query($query))
{
/* fetch object array */
while ($row = $result->fetch_row())
{
printf ("%s (%s)\n", $row[0], $row[1]);
}
/* free result set */
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.123. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
if ($result = mysqli_query($link, $query))
{
/* fetch associative array */
while ($row = mysqli_fetch_row($result))
{
printf ("%s (%s)\n", $row[0], $row[1]);
}
/* free result set */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)
См. также
3.11.11. mysqli_result::$field_count ,
mysqli_num_fields
Описание
Объектный стиль
int mysqli_result->field_count ;
Процедурный стиль
int mysqli_num_fields(
mysqli_result result);
Возвращает количество полей от указанного набора результатов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Количество полей набора результатов.
Примеры
Пример 3.124. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($result = $mysqli->query("SELECT * FROM City ORDER BY ID LIMIT 1"))
{
/* determine number of fields in result set */
$field_cnt = $result->field_count;
printf("Result set has %d fields.\n", $field_cnt);
/* close result set */
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.125 Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($result = mysqli_query($link, "SELECT * FROM City ORDER BY ID LIMIT 1"))
{
/* determine number of fields in result set */
$field_cnt = mysqli_num_fields($result);
printf("Result set has %d fields.\n", $field_cnt);
/* close result set */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Result set has 5 fields.
См. также
3.11.12. mysqli_result::field_seek ,
mysqli_field_seek
Описание
Объектный стиль
bool mysqli_result::field_seek(
int fieldnr);
Процедурный стиль
bool mysqli_field_seek(
mysqli_result result,
int fieldnr);
Установить указатель набора результатов на указанное полевое смещение.
Следующее обращение к
mysqli_fetch_field
получить определение поля колонки, связанной с этим смещением.
Чтобы перейти на начало строки, передайте значение 0.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
fieldnr
Полевое смещение. Это значение должно быть в диапазоне от
0 до число полей-1 .
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Примеры
Пример 3.126. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = $mysqli->query($query))
{
/* Get field information for 2nd column */
$result->field_seek(1);
$finfo = $result->fetch_field();
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.127. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";
if ($result = mysqli_query($link, $query))
{
/* Get field information for 2nd column */
mysqli_field_seek($result, 1);
$finfo = mysqli_fetch_field($result);
printf("Name: %s\n", $finfo->name);
printf("Table:%s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags:%d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Name: SurfaceArea
Table:Country
max. Len: 10
Flags:32769
Type: 4
См. также
3.11.13. mysqli_result::free ,
mysqli_result::close ,
mysqli_result::free_result ,
mysqli_free_result
Описание
Объектный стиль
void mysqli_result::free();
void mysqli_result::close();
void mysqli_result::free_result();
Процедурный стиль
void mysqli_free_result(
mysqli_result result);
Освобождает память, связанную с результатом.
Необходимо всегда освобождать результат с помощью
mysqli_free_result ,
когда ваш объект результата больше не нужен.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
См. также
3.11.14. mysqli_result::$lengths ,
mysqli_fetch_lengths
Описание
Объектный стиль
array mysqli_result->lengths ;
Процедурный стиль
array mysqli_fetch_lengths(
mysqli_result result);
mysqli_fetch_lengths
возвращает множество, содержащее длины каждой колонки текущей
строки в наборе результатов.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Множество целых чисел, представляющих размер каждой колонки
(не включая любые нулевые символы завершения).
FALSE , если ошибка произошла.
mysqli_fetch_lengths
действительно только для текущей строки набора результатов. Это возвращает
FALSE , если вы вызываете его прежде
mysqli_fetch_row/array/object или после получения всех строк в результате.
Примеры
Пример 3.128. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT * from Country ORDER BY Code LIMIT 1";
if ($result = $mysqli->query($query))
{
$row = $result->fetch_row();
/* display column lengths */
foreach ($result->lengths as $i => $val)
{
printf("Field %2d has Length %2d\n", $i+1, $val);
}
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.129. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT * from Country ORDER BY Code LIMIT 1";
if ($result = mysqli_query($link, $query))
{
$row = mysqli_fetch_row($result);
/* display column lengths */
foreach (mysqli_fetch_lengths($result) as $i => $val)
{
printf("Field %2d has Length %2d\n", $i+1, $val);
}
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Field1 has Length3
Field2 has Length5
Field3 has Length 13
Field4 has Length9
Field5 has Length6
Field6 has Length1
Field7 has Length6
Field8 has Length4
Field9 has Length6
Field 10 has Length6
Field 11 has Length5
Field 12 has Length 44
Field 13 has Length7
Field 14 has Length3
Field 15 has Length2
3.11.15. mysqli_result::$num_rows ,
mysqli_num_rows
Описание
Объектный стиль
int mysqli_result->num_rows ;
Процедурный стиль
int mysqli_num_rows(mysqli_result
result);
Возвращает количество строк в наборе результатов.
Поведение
mysqli_num_rows
зависит от того, буферизованные или небуферизированные наборы результатов
используются. Для небуферизированных наборов результатов
mysqli_num_rows
не возвратит правильное количество строк, пока все строки в результате
не были получены.
Параметры
result
Только для процедурного стиля: идентификатор набора результатов,
возвращенный
mysqli_query ,
mysqli_store_result или
mysqli_use_result .
Возвращаемое значение
Количество строк в наборе результатов.
Если количество строк больше, чем
PHP_INT_MAX ,
число будет возвращено как последовательность.
Примеры
Пример 3.130. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($result = $mysqli->query("SELECT Code, Name FROM Country ORDER BY Name"))
{
/* determine number of rows result set */
$row_cnt = $result->num_rows;
printf("Result set has %d rows.\n", $row_cnt);
/* close result set */
$result->close();
}
/* close connection */
$mysqli->close();
?>
Пример 3.131. Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($result = mysqli_query($link, "SELECT Code, Name FROM Country ORDER BY Name"))
{
/* determine number of rows result set */
$row_cnt = mysqli_num_rows($result);
printf("Result set has %d rows.\n", $row_cnt);
/* close result set */
mysqli_free_result($result);
}
/* close connection */
mysqli_close($link);
?>
Вышеупомянутые примеры произведут:
Result set has 239 rows.
См. также
3.12. Класс mysqli_driver
MySQLi Driver.
mysqli_driver {
mysqli_driver
Propertiespublic readonly string
client_info ;
public readonly string
client_version ;
public readonly string
driver_version ;
public readonly string
embedded ;
public bool reconnect ;
public int report_mode ;
Methodsvoid mysqli_driver::embedded_server_end
();
bool mysqli_driver::embedded_server_start(
int start,
array arguments,
array groups); }
-
client_info
Версия заголовка Client API.
-
client_version
Версия клиента.
-
driver_version
Версия MySQLi Driver.
-
embedded
Включен ли MySQLi Embedded.
-
reconnect
Позволить или запретить снова соединяться
(см. INI-директиву mysqli.reconnect).
-
report_mode
Установить в MYSQLI_REPORT_OFF ,
MYSQLI_REPORT_ALL или любую комбинацию
MYSQLI_REPORT_STRICT (бросить исключения для
ошибок), MYSQLI_REPORT_ERROR
(сообщить об ошибках) и MYSQLI_REPORT_INDEX
(ошибки относительно индексов). См. также
mysqli_report .
3.12.1. mysqli_driver::embedded_server_end ,
mysqli_embedded_server_end
mysqli_driver::embedded_server_end
mysqli_embedded_server_end
Остановить встроенный сервер.
Описание
Объектный стиль
void
mysqli_driver::embedded_server_end();
Процедурный стиль
void mysqli_embedded_server_end();
Эта функция пока не документирована, есть только список параметров.
3.12.2. mysqli_driver::embedded_server_start ,
mysqli_embedded_server_start
mysqli_driver::embedded_server_start
mysqli_embedded_server_start
Инициализировать и запустить встроенный сервер.
Описание
Объектный стиль
bool mysqli_driver::embedded_server_start(
int start,
array arguments,
array groups);
Процедурный стиль
bool mysqli_embedded_server_start(
int start,
array arguments,
array groups);
Эта функция пока не документирована, есть только список параметров.
3.12.3.
mysqli_driver::$report_mode ,
mysqli_report
Описание
Объектный стиль
int mysqli_driver->report_mode ;
Процедурный стиль
bool mysqli_report(int
flags);
Функция, полезная в улучшении запросов во время разработки кода и
тестирования. В зависимости от флагов это сообщает об ошибках вызовов
mysqli или запросов, которые не используют индекс
(или используют плохой индекс).
Параметры
flags
-
Таблица 3.20. Допустимые flags
Name |
Описание |
MYSQLI_REPORT_OFF |
Выключает сообщения. |
MYSQLI_REPORT_ERROR |
Ошибки отчета от вызовов функций mysqli. |
MYSQLI_REPORT_STRICT |
Бросает mysqli_sql_exception
для ошибок вместо предупреждений. |
MYSQLI_REPORT_INDEX |
Сообщает, если никакой индекс не использовался в запросе
или использовался плохой индекс. |
MYSQLI_REPORT_ALL |
Установить все варианты (сообщить обо всем). |
Возвращаемое значение
Вернет TRUE при успехе или
FALSE при ошибке.
Журнал изменений
Версия |
Описание |
5.3.4 |
Изменение способа сообщения: теперь для запроса,
а не для каждого процесса. |
5.2.15 |
Изменение способа сообщения: теперь для запроса,
а не для каждого процесса. |
Примеры
Пример 3.132. Объектный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* activate reporting */
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;
try {
/* this query should report an error */
$result = $mysqli->query("SELECT Name FROM Nonexistingtable WHERE population > 50000");
/* this query should report a bad index */
$result = $mysqli->query("SELECT Name FROM City WHERE population > 50000");
$result->close();
$mysqli->close();
} catch (mysqli_sql_exception $e) {
echo $e->__toString();
}
?>
Пример 3.133. Процедурный стиль
<?php
/* activate reporting */
mysqli_report(MYSQLI_REPORT_ALL);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* this query should report an error */
$result = mysqli_query("SELECT Name FROM Nonexistingtable WHERE population > 50000");
/* this query should report a bad index */
$result = mysqli_query("SELECT Name FROM City WHERE population > 50000");
mysqli_free_result($result);
mysqli_close($link);
?>
См. также
3.13. Класс mysqli_warning
Представляет предупреждение MySQL.
mysqli_warning {
mysqli_warning
Propertiespublic message ;
public sqlstate ;
public errno ;
Methodsprotected mysqli_warning::__construct();
public bool
mysqli_warning::next(); }
-
message
Строка сообщения.
-
sqlstate
SQLstate.
-
errno
Код ошибки.
3.13.1.
mysqli_warning::__construct
Описание
protected mysqli_warning::__construct();
Эта функция пока не документирована, есть только список параметров.
Параметры
Эта функция параметров не имеет.
3.13.2.
mysqli_warning::next
Описание
public bool mysqli_warning::next
();
Информация о предупреждении изменяется к следующему предупреждению,
если это возможно.
Как только предупреждение было установлено в следующее предупреждение,
новые значения свойств message ,
sqlstate и errno в
mysqli_warning доступны.
Параметры
Эта функция параметров не имеет.
Возвращаемое значение
Вернет TRUE , если следующее предупреждение
было получено успешно. Если больше не будет предупреждений, это возвратит
FALSE .
3.14.
Класс mysqli_sql_exception
Класс обработки исключений mysqli.
mysqli_sql_exception {
mysqli_sql_exception,
extends RuntimeException
Propertiesprotected string sqlstate
;
Inherited propertiesprotected string
message ;
protected int code ;
protected string file ;
protected int line ; }
-
sqlstate
sqlstate ошибки.
3.15. Псевдонимы и устаревшие функции Mysqli
3.15.1. mysqli_bind_param
Описание
Эта функция псевдоним
mysqli_stmt_bind_param .
Эта функция УСТАРЕЛА с PHP 5.3.0 и
УДАЛЕНА с PHP 5.4.0.
См. также
3.15.2. mysqli_bind_result
Описание
Эта функция псевдоним
mysqli_stmt_bind_result .
Эта функция УСТАРЕЛА с PHP 5.3.0 и
УДАЛЕНА с PHP 5.4.0.
См. также
3.15.3. mysqli_client_encoding
Описание
Эта функция псевдоним
mysqli_character_set_name .
Эта функция УСТАРЕЛА с PHP 5.3.0 и
УДАЛЕНА с PHP 5.4.0.
См. также
3.15.4. mysqli_connect
Описание
Эта функция псевдоним
mysqli::__construct .
Хотя документация
mysqli::__construct
также включает процедурные примеры, которые используют
mysqli_connect , вот короткий пример:
Примеры
Пример 3.134.
mysqli_connect
<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
if (!$link)
{
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;
mysqli_close($link);
?>
Вышеупомянутые примеры произведут что-то подобное:
Success: A proper connection to MySQL was made! The my_db database is great.
Host information: localhost via TCP/IP
3.15.5. mysqli::disable_reads_from_master ,
mysqli_disable_reads_from_master
mysqli::disable_reads_from_master
mysqli_disable_reads_from_master
Отключает чтение с ведущей машины.
Описание
Объектный стиль
void mysqli::disable_reads_from_master();
Процедурный стиль
bool mysqli_disable_reads_from_master(
mysqli link);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.6. mysqli_disable_rpl_parse
mysqli_disable_rpl_parse
Отключить разбор RPL.
Описание
bool mysqli_disable_rpl_parse(
mysqli link);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.7. mysqli_enable_reads_from_master
Описание
bool mysqli_enable_reads_from_master(
mysqli link);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.8. mysqli_enable_rpl_parse
mysqli_enable_rpl_parse
Включить разбор RPL.
Описание
bool mysqli_enable_rpl_parse(
mysqli link);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.9. mysqli_escape_string
Описание
Эта функция псевдоним
mysqli_real_escape_string .
3.15.10. mysqli_execute
Описание
Эта функция псевдоним
mysqli_stmt_execute .
Примечания
mysqli_execute устарела и удалена.
См. также
3.15.11. mysqli_fetch
Описание
Эта функция псевдоним
mysqli_stmt_fetch .
Эта функция УСТАРЕЛА с PHP 5.3.0 и
УДАЛЕНА с PHP 5.4.0.
См. также
3.15.12. mysqli_get_cache_stats
Эта функция УДАЛЕНА с PHP 5.4.0.
Описание
array mysqli_get_cache_stats();
Возвращает пустой массив. Доступно только с
mysqlnd.
Возвращаемое значение
Возвращает пустой массив при успехе,
иначе вернет FALSE .
Журнал изменений
3.15.13. mysqli_get_client_stats
Описание
array mysqli_get_client_stats();
Вернет клиентскую статистику для каждого процесса. Доступно только с
mysqlnd.
Возвращаемое значение
Возвращает множество со статистикой клиента если успех, иначе
FALSE .
Примеры
Пример 3.135.
mysqli_get_client_stats
<?php
$link = mysqli_connect();
print_r(mysqli_get_client_stats());
?>
Этот пример вернет нечто вроде:
Array
(
[bytes_sent] => 43
[bytes_received] => 80
[packets_sent] => 1
[packets_received] => 2
[protocol_overhead_in] => 8
[protocol_overhead_out] => 4
[bytes_received_ok_packet] => 11
[bytes_received_eof_packet] => 0
[bytes_received_rset_header_packet] => 0
[bytes_received_rset_field_meta_packet] => 0
[bytes_received_rset_row_packet] => 0
[bytes_received_prepare_response_packet] => 0
[bytes_received_change_user_packet] => 0
[packets_sent_command] => 0
[packets_received_ok] => 1
[packets_received_eof] => 0
[packets_received_rset_header] => 0
[packets_received_rset_field_meta] => 0
[packets_received_rset_row] => 0
[packets_received_prepare_response] => 0
[packets_received_change_user] => 0
[result_set_queries] => 0
[non_result_set_queries] => 0
[no_index_used] => 0
[bad_index_used] => 0
[slow_queries] => 0
[buffered_sets] => 0
[unbuffered_sets] => 0
[ps_buffered_sets] => 0
[ps_unbuffered_sets] => 0
[flushed_normal_sets] => 0
[flushed_ps_sets] => 0
[ps_prepared_never_executed] => 0
[ps_prepared_once_executed] => 0
[rows_fetched_from_server_normal] => 0
[rows_fetched_from_server_ps] => 0
[rows_buffered_from_client_normal] => 0
[rows_buffered_from_client_ps] => 0
[rows_fetched_from_client_normal_buffered] => 0
[rows_fetched_from_client_normal_unbuffered] => 0
[rows_fetched_from_client_ps_buffered] => 0
[rows_fetched_from_client_ps_unbuffered] => 0
[rows_fetched_from_client_ps_cursor] => 0
[rows_skipped_normal] => 0
[rows_skipped_ps] => 0
[copy_on_write_saved] => 0
[copy_on_write_performed] => 0
[command_buffer_too_small] => 0
[connect_success] => 1
[connect_failure] => 0
[connection_reused] => 0
[reconnect] => 0
[pconnect_success] => 0
[active_connections] => 1
[active_persistent_connections] => 0
[explicit_close] => 0
[implicit_close] => 0
[disconnect_close] => 0
[in_middle_of_command_close] => 0
[explicit_free_result] => 0
[implicit_free_result] => 0
[explicit_stmt_close] => 0
[implicit_stmt_close] => 0
[mem_emalloc_count] => 0
[mem_emalloc_ammount] => 0
[mem_ecalloc_count] => 0
[mem_ecalloc_ammount] => 0
[mem_erealloc_count] => 0
[mem_erealloc_ammount] => 0
[mem_efree_count] => 0
[mem_malloc_count] => 0
[mem_malloc_ammount] => 0
[mem_calloc_count] => 0
[mem_calloc_ammount] => 0
[mem_realloc_count] => 0
[mem_realloc_ammount] => 0
[mem_free_count] => 0
[proto_text_fetched_null] => 0
[proto_text_fetched_bit] => 0
[proto_text_fetched_tinyint] => 0
[proto_text_fetched_short] => 0
[proto_text_fetched_int24] => 0
[proto_text_fetched_int] => 0
[proto_text_fetched_bigint] => 0
[proto_text_fetched_decimal] => 0
[proto_text_fetched_float] => 0
[proto_text_fetched_double] => 0
[proto_text_fetched_date] => 0
[proto_text_fetched_year] => 0
[proto_text_fetched_time] => 0
[proto_text_fetched_datetime] => 0
[proto_text_fetched_timestamp] => 0
[proto_text_fetched_string] => 0
[proto_text_fetched_blob] => 0
[proto_text_fetched_enum] => 0
[proto_text_fetched_set] => 0
[proto_text_fetched_geometry] => 0
[proto_text_fetched_other] => 0
[proto_binary_fetched_null] => 0
[proto_binary_fetched_bit] => 0
[proto_binary_fetched_tinyint] => 0
[proto_binary_fetched_short] => 0
[proto_binary_fetched_int24] => 0
[proto_binary_fetched_int] => 0
[proto_binary_fetched_bigint] => 0
[proto_binary_fetched_decimal] => 0
[proto_binary_fetched_float] => 0
[proto_binary_fetched_double] => 0
[proto_binary_fetched_date] => 0
[proto_binary_fetched_year] => 0
[proto_binary_fetched_time] => 0
[proto_binary_fetched_datetime] => 0
[proto_binary_fetched_timestamp] => 0
[proto_binary_fetched_string] => 0
[proto_binary_fetched_blob] => 0
[proto_binary_fetched_enum] => 0
[proto_binary_fetched_set] => 0
[proto_binary_fetched_geometry] => 0
[proto_binary_fetched_other] => 0
)
См. также
3.15.14. mysqli_get_links_stats
Описание
array mysqli_get_links_stats();
mysqli_get_links_stats
вернет информацию об открытых и кэшированных связях MySQL.
Параметры
Эта функция параметров не имеет.
Возвращаемое значение
mysqli_get_links_stats
возвращает ассоциативный массив с тремя элементами,
включенными следующим образом:
total
integer, указывающий на общее количество открытых
связей в любом статусе.
active_plinks
integer, указывающий на количество
активных постоянных связей.
cached_plinks
integer, представляющий количество
бездействующих постоянных связей.
3.15.15. mysqli_get_metadata
Описание
Эта функция псевдоним
mysqli_stmt_result_metadata .
Эта функция УСТАРЕЛА с PHP 5.3.0 и
УДАЛЕНА с PHP 5.4.0.
См. также
3.15.16. mysqli_master_query
Описание
bool mysqli_master_query(mysqli
link,
string query);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.17. mysqli_param_count
Описание
Эта функция псевдоним
mysqli_stmt_param_count .
Эта функция УСТАРЕЛА с PHP 5.3.0
и УДАЛЕНА с PHP 5.4.0.
См. также
3.15.18. mysqli_report
Описание
Эта функция псевдоним
mysqli_driver->report_mode.
3.15.19. mysqli_rpl_parse_enabled
Описание
int
mysqli_rpl_parse_enabled(mysqli link
);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.20. mysqli_rpl_probe
mysqli_rpl_probe
Исследование RPL.
Описание
bool mysqli_rpl_probe(mysqli
link);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
3.15.21. mysqli_send_long_data
Описание
Эта функция псевдоним
mysqli_stmt_send_long_data .
Эта функция УСТАРЕЛА с
PHP 5.3.0 и УДАЛЕНА с PHP 5.4.0.
См. также
3.15.22. mysqli::set_opt ,
mysqli_set_opt
Описание
Эта функция псевдоним
mysqli_options .
3.15.23.
mysqli_slave_query
Описание
bool mysqli_slave_query(mysqli
link,
string query);
Эта функция пока не документирована, есть только список параметров.
Эта функция УСТАРЕЛА и
УДАЛЕНА с PHP 5.3.0.
|
|