RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 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.

См. также

mysqli::__construct
mysqli::query
mysqli_result::fetch_assoc
$mysqli::connect_errno
$mysqli::connect_error
$mysqli::errno
$mysqli::error
The MySQLi Extension Function Summary

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.

Это оставляет пользователю выбор между безопасным поведением и лучшей работой. Для простоты использования безопасное поведение было сделано умолчанием за счет максимальной производительности.

См. также

mysqli::__construct
mysqli::init
mysqli::options
mysqli::real_connect
mysqli::change_user
$mysqli::host_info
MySQLi Configuration Options
Persistent Database Connections

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)

См. также

mysqli::__construct
mysqli::init
mysqli::options
mysqli::real_connect
mysqli::query
mysqli::multi_query
mysqli::use_result
mysqli::store_result
mysqli_result::free

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, единственное выполнение21
Последовательность запроса, переданная от клиента серверу 11
Циклы обработки клиент-сервер, SELECT, повторное выполнение (n раз)1 + nn
Последовательность запроса, переданная от клиента серверу 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 BinaryText
Набор результатов задает типы данных SQL СохраненыПреобразованы в последовательность или сохранены
Поддерживает все SQL-операторы Недавние версии MySQL поддерживают больше всего, но не все Да

См. также

mysqli::__construct
mysqli::query
mysqli::prepare
mysqli_stmt::prepare
mysqli_stmt::execute
mysqli_stmt::bind_param
mysqli_stmt::bind_result

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());
?>

См. также

mysqli::query
mysqli::multi_query
mysqli_result::next-result
mysqli_result::more-results

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

Подготовленные запросы

Использование мультизапросов с подготовленными запросами не поддерживается.

См. также

mysqli::query
mysqli::multi_query
mysqli_result::next-result
mysqli_result::more-results

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 не может отменить все запросы до прежнего уровня. Некоторые запросы неявно передают.

См. также

mysqli::autocommit
mysqli_result::commit
mysqli_result::rollback

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());
?>

См. также

mysqli::query
mysqli_result::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.xlibmysqlclient --with-mysqli=mysqlnd --with-mysqli=/path/to/mysql_config mysqlnd поддерживается
5.0.x, 5.1.x, 5.2.xlibmysqlclient Нет--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

Имя Значение по умолчаниюИзменяется? Журнал изменений
mysqli.allow_local_infile"0"PHP_INI_SYSTEM Доступно с PHP 5.2.4. До PHP 7.2.16 и 7.3.3 значение по умолчанию "1".
mysqli.allow_persistent"1"PHP_INI_SYSTEM Доступно с PHP 5.3.0.
mysqli.max_persistent"-1"PHP_INI_SYSTEM Доступно с PHP 5.3.0.
mysqli.max_links"-1"PHP_INI_SYSTEM
mysqli.default_port"3306"PHP_INI_ALL
mysqli.default_socketNULLPHP_INI_ALL
mysqli.default_hostNULLPHP_INI_ALL
mysqli.default_userNULLPHP_INI_ALL
mysqli.default_pwNULLPHP_INI_ALL
mysqli.reconnect"0"PHP_INI_SYSTEM
mysqli.rollback_on_cached_plinkTRUEPHP_INI_SYSTEM Доступно с PHP 5.6.0.

Для получения дальнейшей информации и определения предыдущих констант 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_portinteger

Номер порта TCP по умолчанию, чтобы использовать, соединяясь с сервером базы данных, если никакой другой порт не определяется. Если никакое умолчание не будет определено, порт будет получен из переменной окружения MYSQL_TCP_PORT, записи mysql-tcp в файле /etc/services или постоянной MYSQL_PORT времени компиляции, в этом порядке. Win32 будет использовать только MYSQL_PORT.

mysqli.default_socketstring

Сокет по умолчанию, чтобы использовать, соединяясь с сервером локальной базы данных, если никакое другое имя не определяется.

mysqli.default_hoststring

Сервер по умолчанию, чтобы использовать, соединяясь с сервером базы данных, если никакой другой хост не определяется. Не применяется в safe mode.

mysqli.default_userstring

Имя пользователя по умолчанию, чтобы использовать, соединяясь с сервером базы данных, если никакое другое имя не определяется. Не применяется в safe mode.

mysqli.default_pwstring

Пароль по умолчанию, чтобы использовать, соединяясь с сервером базы данных, если никакой другой пароль не определяется. Не применяется в safe mode.

mysqli.reconnectinteger

Автоматически снова соединитесь, если связь была потеряна. Это проигнорировано 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. Замечания

Некоторые примечания внедрения:

  1. Поддержка была добавлена для MYSQL_TYPE_GEOMETRY в MySQLi в PHP 5.3.

  2. Обратите внимание на различные внутренние реализации в 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_rowsN/A Получает количество затронутых строк в предыдущей деятельности MySQL.
$mysqli::client_info mysqli_get_client_infoN/A Возвращает версию клиента MySQL как строку.
$mysqli::client_version mysqli_get_client_versionN/A Возвращает версию клиента MySQL как integer
$mysqli::connect_errno mysqli_connect_errnoN/A Возвращает код ошибки от последнего соединения.
$mysqli::connect_error mysqli_connect_errorN/A Возвращается описание последней ошибки соединения.
$mysqli::errno mysqli_errnoN/A Возвращает код ошибки для нового вызова функции.
$mysqli::error mysqli_errorN/A Возвращает описание последней ошибки.
$mysqli::field_count mysqli_field_countN/A Возвращает количество колонок для нового запроса.
$mysqli::host_info mysqli_get_host_infoN/A Возвращает последовательность, представляющую тип используемой связи.
$mysqli::protocol_version mysqli_get_proto_infoN/A Возвращает версию используемого протокола MySQL.
$mysqli::server_info mysqli_get_server_infoN/A Возвращает версию сервера MySQL.
$mysqli::server_version mysqli_get_server_versionN/A Возвращает версию сервера MySQL как целое число.
$mysqli::info mysqli_infoN/A Восстанавливает информацию о последнем выполненном запросе.
$mysqli::insert_id mysqli_insert_idN/A Возвращает id, используемый в последнем запросе.
$mysqli::sqlstate mysqli_sqlstateN/A Возвращает ошибку SQLSTATE из предыдущей деятельности MySQL.
$mysqli::warning_count mysqli_warning_countN/A Возвращает количество предупреждений из последнего запроса для данной связи.
Методы
mysqli::autocommit mysqli_autocommitN/A Включает или отключает autocommit модификаций базы данных.
mysqli::change_user mysqli_change_userN/A Изменяет пользователя указанного соединения с базой данных.
mysqli::character_set_name, mysqli::client_encoding mysqli_character_set_name mysqli_client_encoding Возвращает набор символов по умолчанию для соединения с базой данных.
mysqli::close mysqli_closeN/A Закрывает ранее открытое соединение с базой данных.
mysqli::commit mysqli_commitN/A Передает текущую транзакцию.
mysqli::__construct mysqli_connectN/A Открывает новую связь с сервером MySQL [Примечание: статичный (т.е. класс) метод]
mysqli::debug mysqli_debugN/A Выполняет операции по отладке.
mysqli::dump_debug_info mysqli_dump_debug_infoN/A Сбрасывает отладочную информацию в журнал.
mysqli::get_charset mysqli_get_charsetN/A Возвращает объект набора символов.
mysqli::get_connection_stats mysqli_get_connection_stats N/AСтатистика связи клиента. Доступно только с mysqlnd.
mysqli::get_client_info mysqli_get_client_infoN/A Возвращает версию клиента MySQL как последовательность.
mysqli::get_client_stats mysqli_get_client_statsN/A Вернет статистику для каждого процесса. Доступно только с mysqlnd.
mysqli::get_cache_stats mysqli_get_cache_statsN/A Статистика кэша Zval клиента. Доступно только с mysqlnd.
mysqli::get_server_info mysqli_get_server_infoN/A Возвращает последовательность, представляющую версию сервера MySQL, с которым связано расширение MySQLi.
mysqli::get_warnings mysqli_get_warningsN/A Недокументировано.
mysqli::init mysqli_initN/A Инициализирует MySQLi и возвращает ресурс для использования с mysqli_real_connect. Не вызывает объект, поскольку это возвращает объект $mysqli.]
mysqli::kill mysqli_killN/A Просит сервер уничтожить поток MySQL.
mysqli::more_results mysqli_more_resultsN/A Проверяет, есть ли еще результаты из мультизапроса.
mysqli::multi_query mysqli_multi_queryN/A Выполняет запрос на базе данных.
mysqli::next_result mysqli_next_resultN/A Подготавливает следующий результат из multi_query
mysqli::options mysqli_options mysqli_set_opt Устанавливает опции.
mysqli::ping mysqli_pingN/A Пингует связь сервера или пытается снова соединиться, если связь отвалилась.
mysqli::prepare mysqli_prepareN/A Подготавливает SQL-оператор к выполнению.
mysqli::query mysqli_queryN/A Выполняет запрос на базе данных.
mysqli::real_connect mysqli_real_connectN/A Открывает связь с сервером.
mysqli::real_escape_string, mysqli::escape_string mysqli_real_escape_string mysqli_escape_string Экранирует специальные символы в последовательности для использования в SQL-операторе, принимая во внимание текущий набор символов связи.
mysqli::real_query mysqli_real_queryN/A Выполнит SQL-запрос.
mysqli::refresh mysqli_refreshN/A Сбрасывает кэши и таблицы или информацию о сервере репликации.
mysqli::rollback mysqli_rollbackN/A Отменяет текущую транзакцию.
mysqli::select_db mysqli_select_dbN/A Выбирает базу данных по умолчанию для запросов.
mysqli::set_charset mysqli_set_charsetN/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_setN/A Используется для установления безопасных соединений, используя SSL.
mysqli::stat mysqli_statN/A Получает статус существующей системы.
mysqli::stmt_init mysqli_stmt_initN/A Инициализирует запрос и возвращает объект для использования с mysqli_stmt_prepare.
mysqli::store_result mysqli_store_resultN/A Передает набор результатов последнего запроса.
mysqli::thread_id mysqli_thread_idN/A Возвращает ID потока для текущей связи.
mysqli::thread_safe mysqli_thread_safeN/A Вернет, задана ли потокобезопасность или нет.
mysqli::use_result mysqli_use_resultN/A Начинает поиск набора результатов.

Таблица 3.6. Обзор методов mysqli_stmt

MySQL_STMT
Интерфейс OOPПроцедурный интерфейс ПсевдонимОписание
Свойства
$mysqli_stmt::affected_rows mysqli_stmt_affected_rowsN/A Возвращает общее количество строк, измененных, удаленных или вставленных последним выполненным запросом.
$mysqli_stmt::errno mysqli_stmt_errnoN/A Возвращает код ошибки для нового запроса.
$mysqli_stmt::error mysqli_stmt_errorN/A Возвращает описание для последней ошибки запроса.
$mysqli_stmt::field_count mysqli_stmt_field_countN/A Возвращает количество полей в запросе.
$mysqli_stmt::insert_id mysqli_stmt_insert_idN/A Получает ID от предыдущей операции INSERT.
$mysqli_stmt::num_rows mysqli_stmt_num_rowsN/A Возвратит количество строк в наборе результатов запроса.
$mysqli_stmt::param_count mysqli_stmt_param_count mysqli_param_count Возвращает количество параметров для данного запроса.
$mysqli_stmt::sqlstate mysqli_stmt_sqlstateN/A Вернет SQLSTATE ошибки от предыдущей операции.
Методы
mysqli_stmt::attr_get mysqli_stmt_attr_getN/A Используется, чтобы получить текущую значение признака запроса.
mysqli_stmt::attr_set mysqli_stmt_attr_setN/A Используется, чтобы изменить поведение подготовленного запроса.
mysqli_stmt::bind_param mysqli_stmt_bind_param mysqli_bind_param Связывает переменные с подготовленным запросом как параметры.
mysqli_stmt::bind_result mysqli_stmt_bind_result mysqli_bind_result Связывает переменные с подготовленным запросом для хранения результата.
mysqli_stmt::close mysqli_stmt_closeN/A Закрывает подготовленный запрос.
mysqli_stmt::data_seek mysqli_stmt_data_seekN/A Переходит на произвольную строку в наборе результатов запроса.
mysqli_stmt::execute mysqli_stmt_execute mysqli_execute Выполняет подготовленный запрос.
mysqli_stmt::fetch mysqli_stmt_fetch mysqli_fetch Получает результаты из подготовленного запроса в связанные переменные.
mysqli_stmt::free_result mysqli_stmt_free_resultN/A Освобождает сохраненную память результата для данного обработчика.
mysqli_stmt::get_result mysqli_stmt_get_resultN/A Получает набор результатов из подготовленного запроса. Доступно только с mysqlnd.
mysqli_stmt::get_warnings mysqli_stmt_get_warningsN/A Недокументировано.
mysqli_stmt::more_results mysqli_stmt_more_resultsN/A Проверяет, есть ли больше результатов от мультизапроса.
mysqli_stmt::next_result mysqli_stmt_next_resultN/A Читает следующий результат мультизапроса.
mysqli_stmt::num_rows mysqli_stmt_num_rowsN/A См. также $mysqli_stmt::num_rows
mysqli_stmt::prepare mysqli_stmt_prepareN/A Подготовить SQL-оператор к выполнению.
mysqli_stmt::reset mysqli_stmt_resetN/A Перезагружает подготовленный запрос.
mysqli_stmt::result_metadata mysqli_stmt_result_metadata mysqli_get_metadata Вернет метаданные набора результатов из подготовленного запроса.
mysqli_stmt::send_long_data mysqli_stmt_send_long_data mysqli_send_long_data Пошлите данные в блоках.
mysqli_stmt::store_result mysqli_stmt_store_resultN/A Передает набор результатов от подготовленного запроса.

Таблица 3.7. Обзор методов mysqli_result

mysqli_result
Интерфейс OOPПроцедурный интерфейс ПсевдонимОписание
Свойства
$mysqli_result::current_field mysqli_field_tellN/A Получите текущее полевое смещение указателя результата.
$mysqli_result::field_count mysqli_num_fieldsN/A Получите количество областей в результате.
$mysqli_result::lengths mysqli_fetch_lengthsN/A Возвращает длины колонок текущей строки в наборе результатов.
$mysqli_result::num_rows mysqli_num_rowsN/A Получает количество строк в результате.
Методы
mysqli_result::data_seek mysqli_data_seekN/A Устанавливает указатель результата на произвольную строку в результате.
mysqli_result::fetch_all mysqli_fetch_allN/A Получает все строки результата и вернет набор результатов как ассоциативный массив, числовое множество или оба. Доступно только с mysqlnd.
mysqli_result::fetch_array mysqli_fetch_arrayN/A Получает строку результата как ассоциативный массив, числовое множество или оба.
mysqli_result::fetch_assoc mysqli_fetch_assocN/A Получает строку результата как ассоциативный массив.
mysqli_result::fetch_field_direct mysqli_fetch_field_directN/A Получает метаданные для единственной области.
mysqli_result::fetch_field mysqli_fetch_fieldN/A Возвращает следующую область в наборе результатов.
mysqli_result::fetch_fields mysqli_fetch_fieldsN/A Возвращает множество объектов, представляющих области в наборе результатов.
mysqli_result::fetch_object mysqli_fetch_objectN/A Возвращает текущую строку набора результатов как объект.
mysqli_result::fetch_row mysqli_fetch_rowN/A Получаете строку результата как перечисленное множество.
mysqli_result::field_seek mysqli_field_seekN/A Установить указатель результата на указанное полевое смещение.
mysqli_result::free, mysqli_result::close, mysqli_result::free_result mysqli_free_resultN/A Освобождает память, связанную с результатом.

Таблица 3.8. Обзор методов mysqli_driver

MySQL_Driver
Интерфейс OOPПроцедурный интерфейс ПсевдонимОписание
Свойства
N/A
Методы
mysqli_driver::embedded_server_end mysqli_embedded_server_end N/AНедокументировано.
mysqli_driver::embedded_server_start mysqli_embedded_server_start N/AНедокументировано.

Псевдонимы обеспечиваются только для целей обратной совместимости. Не используйте их в новых проектах.

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

  • mysqli::$affected_rows

    mysqli_affected_rows

    Получает количество затронутых строк в предыдущей деятельности MySQL.

Описание

Объектный стиль

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

См. также

mysqli_num_rows
mysqli_info

3.9.2. mysqli::autocommit, mysqli_autocommit

  • mysqli::autocommit

    mysqli_autocommit

    Включает или выключает режим 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

См. также

mysqli_begin_transaction
mysqli_commit
mysqli_rollback

3.9.3. mysqli::begin_transaction, mysqli_begin_transaction

  • 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);
?>

См. также

mysqli_autocommit
mysqli_commit
mysqli_rollback

3.9.4. mysqli::change_user, mysqli_change_user

  • 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

См. также

mysqli_connect
mysqli_select_db

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

См. также

mysqli_set_charset
mysqli_client_encoding
mysqli_real_escape_string

3.9.6. mysqli::close, mysqli_close

  • 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.

См. также

mysqli::__construct
mysqli_init
mysqli_real_connect
mysqli_free_result

3.9.7. mysqli::commit, mysqli_commit

  • 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);
?>

См. также

mysqli_autocommit
mysqli_begin_transaction
mysqli_rollback
mysqli_savepoint

3.9.8. mysqli::$connect_errno, mysqli_connect_errno

  • 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

См. также

mysqli_connect
mysqli_connect_error
mysqli_errno
mysqli_error
mysqli_sqlstate

3.9.9. mysqli::$connect_error, mysqli_connect_error

  • 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 требуется.

См. также

mysqli_connect
mysqli_connect_errno
mysqli_errno
mysqli_error
mysqli_sqlstate

3.9.10. mysqli::__construct, mysqli::connect, mysqli_connect

  • mysqli::__construct

    mysqli::connect

    mysqli_connect

    Открыть новую связь с сервером MySQL.

Описание

Объектный стиль

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.

См. также

mysqli_real_connect
mysqli_options
mysqli_connect_errno
mysqli_connect_error
mysqli_close

3.9.11. mysqli::debug, mysqli_debug

  • 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");
?>

См. также

mysqli_dump_debug_info
mysqli_report

3.9.12. mysqli::dump_debug_info, mysqli_dump_debug_info

  • 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 при ошибке.

См. также

mysqli_debug

3.9.13. mysqli::$errno, mysqli_errno

  • 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

См. также

mysqli_connect_errno
mysqli_connect_error
mysqli_error
mysqli_sqlstate

3.9.14. mysqli::$error_list, mysqli_error_list

  • 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'
  )
)

См. также

mysqli_connect_errno
mysqli_connect_error
mysqli_error
mysqli_sqlstate

3.9.15. mysqli::$error, mysqli_error

  • 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'

См. также

mysqli_connect_errno
mysqli_connect_error
mysqli_errno
mysqli_sqlstate

3.9.16. mysqli::$field_count, mysqli_field_count

  • 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

  • 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)
}

См. также

mysqli_character_set_name
mysqli_set_charset

3.9.18. mysqli::$client_info, mysqli::get_client_info, mysqli_get_client_info

  • mysqli::$client_info

    mysqli::get_client_info

    mysqli_get_client_info

    Получите информацию о клиенте MySQL.

Описание

Объектный стиль

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());
?>

См. также

mysqli_get_client_version
mysqli_get_server_info
mysqli_get_server_version

3.9.19. mysqli::$client_version, mysqli_get_client_version

  • mysqli::$client_version

    mysqli_get_client_version

    Возвращает версию клиента MySQL как целое число.

Описание

Объектный стиль

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());
?>

См. также

mysqli_get_client_info
mysqli_get_server_info
mysqli_get_server_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
)

См. также

Stats description

3.9.21. mysqli::$host_info, mysqli_get_host_info

  • 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

См. также

mysqli_get_proto_info

3.9.22. mysqli::$protocol_version, mysqli_get_proto_info

  • mysqli::$protocol_version

    mysqli_get_proto_info

    Возвращает версию используемого протокола MySQL.

Описание

Объектный стиль

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

См. также

mysqli_get_host_info

3.9.23. mysqli::$server_info, mysqli::get_server_info, mysqli_get_server_info

  • mysqli::$server_info

    mysqli::get_server_info

    mysqli_get_server_info

    Возвращает версию сервера MySQL.

Описание

Объектный стиль

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

См. также

mysqli_get_client_info
mysqli_get_client_version
mysqli_get_server_version

3.9.24. mysqli::$server_version, mysqli_get_server_version

  • mysqli::$server_version

    mysqli_get_server_version

    Возвращает версию сервера MySQL как целое число.

Описание

Объектный стиль

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

См. также

mysqli_get_client_info
mysqli_get_client_version
mysqli_get_server_info

3.9.25. mysqli::get_warnings, mysqli_get_warnings

  • mysqli::get_warnings

    mysqli_get_warnings

    Получите результат SHOW WARNINGS.

Описание

Объектный стиль

mysqli_warning mysqli::get_warnings();

Процедурный стиль

mysqli_warning mysqli_get_warnings( mysqli link);

Эта функция в настоящее время не документируется, только список аргументов доступен.

3.9.26. mysqli::$info, mysqli_info

  • 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

См. также

mysqli_affected_rows
mysqli_warning_count
mysqli_num_rows

3.9.27. mysqli::init, mysqli_init

  • mysqli::init

    mysqli_init

    Инициализирует MySQLi и возвращает ресурс для использования с mysqli_real_connect().

Описание

Объектный стиль

mysqli mysqli::init();

Процедурный стиль

mysqli mysqli_init();

Инициализирует объект MYSQL, подходящий для mysqli_options и mysqli_real_connect.

Любые последующие обращения к любой функции mysqli (кроме mysqli_options) потерпят неудачу до вызова mysqli_real_connect.

Возвращаемое значение

Возвращает объект.

Примеры

См. mysqli_real_connect.

См. также

mysqli_options
mysqli_close
mysqli_real_connect
mysqli_connect

3.9.28. mysqli::$insert_id, mysqli_insert_id

  • mysqli::$insert_id

    mysqli_insert_id

    Возвращается 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

См. также

mysqli_thread_id

3.9.30. mysqli::more_results, mysqli_more_results

  • 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.

См. также

mysqli_multi_query
mysqli_next_result
mysqli_store_result
mysqli_use_result

3.9.31. mysqli::multi_query, mysqli_multi_query

  • 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

См. также

mysqli_query
mysqli_use_result
mysqli_store_result
mysqli_next_result
mysqli_more_results

3.9.32. mysqli::next_result, mysqli_next_result

  • mysqli::next_result

    mysqli_next_result

    Подготовит следующий результат из multi_query.

Описание

Объектный стиль

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.

См. также

mysqli_multi_query
mysqli_more_results
mysqli_store_result
mysqli_use_result

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.

См. также

mysqli_init
mysqli_real_connect

3.9.34. mysqli::ping, mysqli_ping

  • 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
)

См. также

mysqli_query
mysqli_reap_async_query

3.9.36. mysqli::prepare, mysqli_prepare

  • mysqli::prepare

    mysqli_prepare

    Подготовить SQL-оператор к выполнению.

Описание

Объектный стиль

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

См. также

mysqli_stmt_execute
mysqli_stmt_fetch
mysqli_stmt_bind_param
mysqli_stmt_bind_result
mysqli_stmt_close

3.9.37. mysqli::query, mysqli_query

  • 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

См. также

mysqli_real_query
mysqli_multi_query
mysqli_free_result

3.9.38. mysqli::real_connect, mysqli_real_connect

  • mysqli::real_connect

    mysqli_real_connect

    Открывает связь с сервером mysql.

Описание

Объектный стиль

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:

  • mysqli_real_connect нуждается в доступном объекте, который должен быть создан функцией mysqli_init.

  • С mysqli_options можно установить различные варианты для связи.

  • Есть параметр flags.

Параметры

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.

См. также

mysqli_connect
mysqli_init
mysqli_options
mysqli_ssl_set
mysqli_close

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.

См. также

mysqli_set_charset
mysqli_character_set_name

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 при ошибке.

См. также

mysqli_query
mysqli_store_result
mysqli_use_result

3.9.41. mysqli::reap_async_query, mysqli_reap_async_query

  • mysqli::reap_async_query

    mysqli_reap_async_query

    Получить результат async-запроса.

Описание

Объектный стиль

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.

См. также

mysqli_poll

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.

См. также

mysqli_poll

3.9.43. mysqli::release_savepoint, mysqli_release_savepoint

  • 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 при ошибке.

См. также

mysqli_rollback

3.9.44. mysqli::rollback, mysqli_rollback

  • 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).

См. также

mysqli_begin_transaction
mysqli_commit
mysqli_autocommit
mysqli_release_savepoint

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

  • 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 при ошибке.

См. также

mysqli_commit

3.9.47. mysqli::select_db, mysqli_select_db

  • 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.

См. также

mysqli_connect
mysqli_real_connect

3.9.48. mysqli::send_query, mysqli_send_query

  • 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

  • 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

См. также

mysqli_character_set_name
mysqli_real_escape_string
MySQL character set concepts
List of character sets that MySQL supports

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.

См. также

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

См. также

mysqli_set_local_infile_default

3.9.52. mysqli::$sqlstate, mysqli_sqlstate

  • mysqli::$sqlstate

    mysqli_sqlstate

    Возвращает ошибку SQLSTATE из предыдущей деятельности MySQL.

Описание

Объектный стиль

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.

См. также

mysqli_errno
mysqli_error

3.9.53. mysqli::ssl_set, mysqli_ssl_set

  • mysqli::ssl_set

    mysqli_ssl_set

    Используется для установления безопасных соединений, используя SSL.

Описание

Объектный стиль

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 возвратит ошибку, когда вы попытаетесь соединиться.

См. также

mysqli_options
mysqli_real_connect

3.9.54. mysqli::stat, mysqli_stat

  • 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

См. также

mysqli_get_server_info

3.9.55. mysqli::stmt_init, mysqli_stmt_init

  • mysqli::stmt_init

    mysqli_stmt_init

    Инициализирует запрос и возвращает объект для использования с mysqli_stmt_prepare.

Описание

Объектный стиль

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.

Возвращаемое значение

Возвращает объект.

См. также

mysqli_stmt_prepare

3.9.56. mysqli::store_result, mysqli_store_result

  • 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.

См. также

mysqli_real_query
mysqli_use_result

3.9.57. mysqli::$thread_id, mysqli_thread_id

  • mysqli::$thread_id

    mysqli_thread_id

    Возвращает 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

См. также

mysqli_kill

3.9.58. mysqli::thread_safe, mysqli_thread_safe

  • mysqli::thread_safe

    mysqli_thread_safe

    Вернет, дана ли потокобезопасность или нет.

Описание

Процедурный стиль

bool mysqli_thread_safe();

Говорит, собрана ли библиотека клиента как ориентированная на многопотоковое исполнение.

Возвращаемое значение

TRUE, если библиотека клиента ориентирована на многопотоковое исполнение, иначе FALSE.

3.9.59. mysqli::use_result, mysqli_use_result

  • 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

См. также

mysqli_real_query
mysqli_store_result

3.9.60. mysqli::$warning_count, mysqli_warning_count

  • 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

См. также

mysqli_errno
mysqli_error
mysqli_sqlstate

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

См. также

mysqli_stmt_num_rows
mysqli_prepare

3.10.2. mysqli_stmt::attr_get, mysqli_stmt_attr_get

  • 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

  • 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

Значение, чтобы назначить признаку.

См. также

Connector/MySQL mysql_stmt_attr_set()

3.10.4. mysqli_stmt::bind_param, mysqli_stmt_bind_param

  • 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
ddouble
sstring
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.

См. также

mysqli_stmt_bind_result
mysqli_stmt_execute
mysqli_stmt_fetch
mysqli_prepare
mysqli_stmt_send_long_data
mysqli_stmt_errno
mysqli_stmt_error

3.10.5. mysqli_stmt::bind_result, mysqli_stmt_bind_result

  • 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

См. также

mysqli_stmt_get_result
mysqli_stmt_bind_param
mysqli_stmt_execute
mysqli_stmt_fetch
mysqli_prepare
mysqli_stmt_prepare
mysqli_stmt_init
mysqli_stmt_errno
mysqli_stmt_error

3.10.6. mysqli_stmt::close, mysqli_stmt_close

  • 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 при ошибке.

См. также

mysqli_prepare

3.10.7. mysqli_stmt::__construct

  • mysqli_stmt::__construct

    Создает новый объект mysqli_stmt.

Описание

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.

См. также

mysqli_prepare
mysqli_stmt_init

3.10.8. mysqli_stmt::data_seek, mysqli_stmt_data_seek

  • 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

См. также

mysqli_prepare

3.10.9. mysqli_stmt::$errno, mysqli_stmt_errno

  • 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.

См. также

mysqli_stmt_error
mysqli_stmt_sqlstate

3.10.10. mysqli_stmt::$error_list, mysqli_stmt_error_list

  • 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
  )
)

См. также

mysqli_stmt_error
mysqli_stmt_errno
mysqli_stmt_sqlstate

3.10.11. mysqli_stmt::$error, mysqli_stmt_error

  • 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.

См. также

mysqli_stmt_errno
mysqli_stmt_sqlstate

3.10.12. mysqli_stmt::execute, mysqli_stmt_execute

  • 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)

См. также

mysqli_prepare
mysqli_stmt_bind_param
mysqli_stmt_get_result

3.10.13. mysqli_stmt::fetch, mysqli_stmt_fetch

  • 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)

См. также

mysqli_prepare
mysqli_stmt_errno
mysqli_stmt_error
mysqli_stmt_bind_result

3.10.14. mysqli_stmt::$field_count, mysqli_stmt_field_count

  • 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

  • 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.

См. также

mysqli_stmt_store_result

3.10.16. mysqli_stmt::get_result, mysqli_stmt_get_result

  • 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

См. также

mysqli_prepare
mysqli_stmt_result_metadata
mysqli_stmt_fetch
mysqli_fetch_array
mysqli_stmt_store_result
mysqli_errno

3.10.17. mysqli_stmt::get_warnings, mysqli_stmt_get_warnings

  • mysqli_stmt::get_warnings

    mysqli_stmt_get_warnings

    Получите результат SHOW 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

  • mysqli_stmt::$insert_id

    mysqli_stmt_insert_id

    ID от предыдущей операции INSERT.

Описание

Объектный стиль

int mysqli_stmt->insert_id ;

Процедурный стиль

mixed mysqli_stmt_insert_id( mysqli_stmt stmt);

Эта функция пока не документирована, есть только список параметров.

3.10.19. mysqli_stmt::more_results, mysqli_stmt_more_results

  • 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.

См. также

mysqli_stmt::next_result
mysqli::multi_query

3.10.20. mysqli_stmt::next_result, mysqli_stmt_next_result

  • 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.

См. также

mysqli_stmt::more_results
mysqli::multi_query

3.10.21. mysqli_stmt::$num_rows, mysqli_stmt::num_rows, mysqli_stmt_num_rows

  • 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.

См. также

mysqli_stmt_affected_rows
mysqli_prepare
mysqli_stmt_store_result

3.10.22. mysqli_stmt::$param_count, mysqli_stmt_param_count

  • 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.

См. также

mysqli_prepare

3.10.23. mysqli_stmt::prepare, mysqli_stmt_prepare

  • mysqli_stmt::prepare

    mysqli_stmt_prepare

    Подготовит SQL-оператор к выполнению.

Описание

Объектный стиль

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

См. также

mysqli_stmt_init
mysqli_stmt_execute
mysqli_stmt_fetch
mysqli_stmt_bind_param
mysqli_stmt_bind_result
mysqli_stmt_get_result
mysqli_stmt_close

3.10.24. mysqli_stmt::reset, mysqli_stmt_reset

  • 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 при ошибке.

См. также

mysqli_prepare

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);
?>

См. также

mysqli_prepare
mysqli_free_result

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();
?>

См. также

mysqli_prepare
mysqli_stmt_bind_param

3.10.27. mysqli_stmt::$sqlstate, mysqli_stmt_sqlstate

  • mysqli_stmt::$sqlstate

    mysqli_stmt_sqlstate

    Вернет 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.

См. также

mysqli_stmt_errno
mysqli_stmt_error

3.10.28. mysqli_stmt::store_result, mysqli_stmt_store_result

  • 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.

См. также

mysqli_prepare
mysqli_stmt_result_metadata
mysqli_stmt_fetch

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

  • 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

См. также

mysqli_fetch_field
mysqli_field_seek

3.11.2. mysqli_result::data_seek, mysqli_data_seek

  • 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

См. также

mysqli_store_result
mysqli_fetch_row
mysqli_fetch_array
mysqli_fetch_assoc
mysqli_fetch_object
mysqli_query
mysqli_num_rows

3.11.3. mysqli_result::fetch_all, mysqli_fetch_all

  • 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 должен использоваться только в тех ситуациях, когда принесенный набор результатов пошлют в другой слой для обработки.

См. также

mysqli_fetch_array
mysqli_query

3.11.4. mysqli_result::fetch_array, mysqli_fetch_array

  • 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)

См. также

mysqli_fetch_assoc
mysqli_fetch_row
mysqli_fetch_object
mysqli_query
mysqli_data_seek

3.11.5. mysqli_result::fetch_assoc, mysqli_fetch_assoc

  • 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'

См. также

mysqli_fetch_array
mysqli_fetch_row
mysqli_fetch_object
mysqli_query
mysqli_data_seek

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

См. также

mysqli_num_fields
mysqli_fetch_field
mysqli_fetch_fields

3.11.7. mysqli_result::fetch_field, mysqli_fetch_field

  • 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

См. также

mysqli_num_fields
mysqli_fetch_field_direct
mysqli_fetch_fields
mysqli_field_seek

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

См. также

mysqli_num_fields
mysqli_fetch_field_direct
mysqli_fetch_field

3.11.9. mysqli_result::fetch_object, mysqli_fetch_object

  • 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)

См. также

mysqli_fetch_array
mysqli_fetch_assoc
mysqli_fetch_row
mysqli_query
mysqli_data_seek

3.11.10. mysqli_result::fetch_row, mysqli_fetch_row

  • 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)

См. также

mysqli_fetch_array
mysqli_fetch_assoc
mysqli_fetch_object
mysqli_query
mysqli_data_seek

3.11.11. mysqli_result::$field_count, mysqli_num_fields

  • 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.

См. также

mysqli_fetch_field

3.11.12. mysqli_result::field_seek, mysqli_field_seek

  • 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

См. также

mysqli_fetch_field

3.11.13. mysqli_result::free, mysqli_result::close, mysqli_result::free_result, mysqli_free_result

  • 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.

См. также

mysqli_query
mysqli_stmt_store_result
mysqli_store_result
mysqli_use_result

3.11.14. mysqli_result::$lengths, mysqli_fetch_lengths

  • 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

  • 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.

См. также

mysqli_affected_rows
mysqli_store_result
mysqli_use_result
mysqli_query

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

  • 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);
?>

См. также

mysqli_debug
mysqli_dump_debug_info
mysqli_sql_exception
set_exception_handler
error_reporting

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

  • mysqli_warning::__construct

    Цель __construct.

Описание

protected mysqli_warning::__construct();

Эта функция пока не документирована, есть только список параметров.

Параметры

Эта функция параметров не имеет.

3.13.2. mysqli_warning::next

  • 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.

См. также

mysqli_stmt_bind_param

3.15.2. mysqli_bind_result

Описание

Эта функция псевдоним mysqli_stmt_bind_result.

Эта функция УСТАРЕЛА с PHP 5.3.0 и УДАЛЕНА с PHP 5.4.0.

См. также

mysqli_stmt_bind_result

3.15.3. mysqli_client_encoding

Описание

Эта функция псевдоним mysqli_character_set_name.

Эта функция УСТАРЕЛА с PHP 5.3.0 и УДАЛЕНА с PHP 5.4.0.

См. также

mysqli_real_escape_string.

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

  • 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 устарела и удалена.

См. также

mysqli_stmt_execute

3.15.11. mysqli_fetch

Описание

Эта функция псевдоним mysqli_stmt_fetch.

Эта функция УСТАРЕЛА с PHP 5.3.0 и УДАЛЕНА с PHP 5.4.0.

См. также

mysqli_stmt_fetch

3.15.12. mysqli_get_cache_stats

  • mysqli_get_cache_stats

    Вернет статистику клиентского кэша Zval.

Эта функция УДАЛЕНА с PHP 5.4.0.

Описание

array mysqli_get_cache_stats();

Возвращает пустой массив. Доступно только с mysqlnd.

Возвращаемое значение

Возвращает пустой массив при успехе, иначе вернет FALSE.

Журнал изменений

Версия Описание
5.4.0 mysqli_get_cache_stats удалена.
5.3.0 mysqli_get_cache_stats добавлена как stub.

3.15.13. mysqli_get_client_stats

  • 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
)

См. также

Stats description

3.15.14. mysqli_get_links_stats

  • 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.

См. также

mysqli_stmt_result_metadata.

3.15.16. mysqli_master_query

  • mysqli_master_query

    Выполнение запроса на ведущей машине в конфигурации master/slave.

Описание

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.

См. также

mysqli_stmt_param_count

3.15.18. mysqli_report

Описание

Эта функция псевдоним mysqli_driver->report_mode.

3.15.19. mysqli_rpl_parse_enabled

  • mysqli_rpl_parse_enabled

    Проверяет, позволен ли разбор RPL.

Описание

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.

См. также

mysqli_stmt_send_long_data

3.15.22. mysqli::set_opt, mysqli_set_opt

Описание

Эта функция псевдоним mysqli_options.

3.15.23. mysqli_slave_query

  • mysqli_slave_query

    Выполнение запроса на ведомой машине в конфигурации master/slave.

Описание

bool mysqli_slave_query(mysqli link, string query);

Эта функция пока не документирована, есть только список параметров.

Эта функция УСТАРЕЛА и УДАЛЕНА с PHP 5.3.0.

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru