(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::errorCode —
Возвращает код SQLSTATE результата последней операции с базой данных
Описание
public PDO::errorCode(): ?string
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает SQLSTATE — пятисимвольный идентификатор, определённый в стандарте
ANSI SQL-92. Первые два символа SQLSTATE отвечают за класс ошибки, а следующие
три определяют её подкласс. Класс ошибок 01 означает предупреждение, которому
сопутствует возвращаемый код SQL_SUCCESS_WITH_INFO. Классы отличные от 01,
за исключением ‘IM’, означают ошибки выполнения запросов к базе данных. Класс
‘IM’ свидетельствует об ошибках и предупреждениях, которые вызваны самой
реализацией PDO (или, возможно, ODBC, если используется драйвер ODBC). Значение
подкласса ‘000’ в любом классе означает, что подкласс для этого SQLSTATE
отсутствует.
PDO::errorCode() выдаёт код ошибки только для операций,
совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement
методами PDO::prepare() или
PDO::query(), и вызвать ошибку его методами,
PDO::errorCode() эту ошибку не отобразит. Вам нужно вызвать
PDOStatement::errorCode(), чтобы получить код ошибки для операции,
выполняемой на определённом объекте PDOStatement.
Возвращает null
, если никаких операций над базой данных средствами PDO-объекта
не производилось.
Примеры
Пример #1 Получение кода SQLSTATE
<?php
/* Спровоцируем ошибку -- таблицы BONES не существует */
$dbh->exec("INSERT INTO bones(skull) VALUES ('lucy')");
echo
"nPDO::errorCode(): ", $dbh->errorCode();
?>
Результат выполнения данного примера:
Смотрите также
- PDO::errorInfo() — Получает расширенную информацию об ошибке, произошедшей в ходе
последнего обращения к базе данных - PDOStatement::errorCode() — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
- PDOStatement::errorInfo() — Получение расширенной информации об ошибке, произошедшей в результате работы
объекта PDOStatement
Matthias Leuffen ¶
17 years ago
Hi,
List containing all SQL-92 SQLSTATE Return Codes:
http://www.unix.org.ua/orelly/java-ent/jenut/ch08_06.htm
Use the following Code to let PDO throw Exceptions (PDOException) on Error.
<?PHP
$pdo = new PDO (whatever);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->exec ("QUERY WITH SYNTAX ERROR");
} catch (PDOException $e) {
if ($e->getCode() == '2A000')
echo "Syntax Error: ".$e->getMessage();
}
?>
Bye,
Matthias
runrioter at gmail dot com ¶
8 years ago
This reading says that "Returns NULL if no operation has been run on the database handle".
When I tested it based on pdo-mysql, I got 00000, not NULL!
Ошибки и их обработка
PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего
стиля разработки приложений.
-
PDO::ERRMODE_SILENT
До PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который
можно получить методами PDO::errorCode() и
PDO::errorInfo(). Эти методы реализованы как в объектах
запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения
кода объекта запроса, нужно вызвать метод
PDOStatement::errorCode() или
PDOStatement::errorInfo() этого объекта. Если ошибка
вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта. -
PDO::ERRMODE_WARNING
Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может
быть полезно при отладке или тестировании, когда нужно видеть, что произошло,
но не нужно прерывать работу приложения. -
PDO::ERRMODE_EXCEPTION
Начиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение
PDOException, свойства которого будут отражать
код ошибки и её описание. Этот режим также полезен при отладке, так как
сразу известно, где в программе произошла ошибка. Это позволяет быстро
локализовать и решить проблему. (Не забывайте, что если исключение
является причиной завершения работы скрипта, все активные транзакции
будут откачены.)Режим исключений также полезен, так как даёт возможность структурировать
обработку ошибок более тщательно, нежели с обычными предупреждениями PHP, а
также с меньшей вложенностью кода, чем в случае работы в тихом режиме с
явной проверкой возвращаемых значений при каждом обращении к базе данных.Подробнее об исключениях в PHP смотрите в разделе Исключения.
PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE.
Отдельные драйверы PDO могут задавать соответствия своих собственных кодов
кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный
код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает
метод PDO::errorInfo(), который возвращает массив, содержащий
код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.
Пример #1 Создание PDO объекта и установка режима обработки ошибок
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// PDO выбросит исключение PDOException (если таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Результат выполнения данного примера:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10 Stack trace: #0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...') #1 {main} thrown in /tmp/pdo_test.php on line 10
Замечание:
Метод PDO::__construct() будет всегда бросать исключение PDOException,
если соединение оборвалось, независимо от установленного значенияPDO::ATTR_ERRMODE
.
Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Результат выполнения данного примера:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9
There are no user contributed notes for this page.
Вернуться к: PDO
PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего
стиля разработки приложений.
-
PDO::ERRMODE_SILENT
Это режим по умолчанию. PDO просто предоставит вам код ошибки, который
можно получить методами PDO::errorCode() и
PDO::errorInfo(). Эти методы реализованы как в объектах
запросов так и в объектах баз данных. Если ошибка вызвана во время выполнения
кода объекта запроса, нужно вызвать метод
PDOStatement::errorCode() или
PDOStatement::errorInfo() этого объекта. Если ошибка
вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта. -
PDO::ERRMODE_WARNING
Помимо задания кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может
быть полезно при отладке или тестировании, когда нужно видеть, что произошло,
но не нужно прерывать работу приложения. -
PDO::ERRMODE_EXCEPTION
Помимо задания кода ошибки PDO будет выбрасывать исключение
PDOException, свойства которого будут отражать
код ошибки и ее описание. Этот режим также полезен при отладке, так как
сразу известно, где в программе произошла ошибка. Это позволяет быстро
локализовать и решить проблему. (Не забывайте, что если исключение
является причиной завершения работы скрипта, все активные транзакции
будут откачены.)Режим исключений также полезен, так как дает возможность структурировать
обработку ошибок более тщательно, нежели с обычными PHP предупреждениями, а
также с меньшей вложенностью кода, чем в случае работы в тихом режиме с
явной проверкой возвращаемых значений при каждом обращении к базе данных.Подробнее об исключениях в PHP см. в разделе Исключения.
PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE.
Отдельные PDO драйверы могут задавать соответствия своих собственных кодов
кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный
SQLSTATE код. Если необходима специфичная информация об ошибке, PDO предлагает
метод PDO::errorInfo(), который возвращает массив, содержащий
SQLSTATE код, код ошибки драйвера, а также строку ошибки драйвера.
Пример #1 Создание PDO объекта и задание режима обработки ошибок
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Подключение не удалось: ' . $e->getMessage();
}?>
Замечание:
Метод PDO::__construct() будет всегда бросать исключение PDOException,
если соединение оборвалось, независимо от установленного значенияPDO::ATTR_ERRMODE
.
Непойманные исключения фатальны.
Пример #2 Создание экземпляра класса PDO и задание режима обработки ошибок в конструкторе
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';/*
По прежнему оберните конструктор в блок try/catch, так как, даже при установке ERRMODE в WARNING,
PDO::__construct всегда будет бросать исключение PDOException, если соединение оборвалось.
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Соединение оборвалось: ' . $e->getMessage();
exit;
}// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
Результат выполнения данного примера:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 18
Вернуться к: PDO
Содержание
- PDOStatement::errorInfo
- Description
- Parameters
- Return Values
- Examples
- See Also
- User Contributed Notes 4 notes
- PDO::errorCode
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- PDO::errorInfo
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 3 notes
- Ошибки и их обработка
- MySQL Functions (PDO_MYSQL)
- Introduction
- Installation
- Predefined Constants
- Runtime Configuration
- Table of Contents
- User Contributed Notes 8 notes
PDOStatement::errorInfo
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDOStatement::errorInfo — Fetch extended error information associated with the last operation on the statement handle
Description
Parameters
This function has no parameters.
Return Values
PDOStatement::errorInfo() returns an array of error information about the last operation performed by this statement handle. The array consists of at least the following fields:
Element | Information |
---|---|
SQLSTATE error code (a five characters alphanumeric identifier defined in the ANSI SQL standard). | |
1 | Driver specific error code. |
2 | Driver specific error message. |
Examples
Example #1 Displaying errorInfo() fields for a PDO_ODBC connection to a DB2 database
/* Provoke an error — the BONES table does not exist */
$sth = $dbh -> prepare ( ‘SELECT skull FROM bones’ );
$sth -> execute ();
echo «nPDOStatement::errorInfo():n» ;
$arr = $sth -> errorInfo ();
print_r ( $arr );
?>
The above example will output:
See Also
- PDO::errorCode() — Fetch the SQLSTATE associated with the last operation on the database handle
- PDO::errorInfo() — Fetch extended error information associated with the last operation on the database handle
- PDOStatement::errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
User Contributed Notes 4 notes
Seriously errorInfo is your friend. Use it.
If these look like your google searches then you need errorInfo
«no database error showing in php»
«pdo selects from database but wont insert»
«pdo insert not working»
«isnt pdo just a big hype, should I go back to mysql?»
«how much do surgeons make?»
Trust me it will definitely save you hours of insanity if you make it a habit to use it in development. Forget E-ALL, it failed me since well, E-ALL apparently doesn’t know that I didn’t set a default value in my MySQL table and my query wasnt adding anything to it. So always do this
= ‘do something on a mysql table where foo = :bar’ ;
$stmt = prepare ( $sql );
$stmt -> bindValue ( ‘:bar’ , $foo , PDO :: PARAM_ [ DATA TYPE ]);
$stmt -> execute ();
// very important during development. But take it off in production
$foo_arr = $stmt -> errorInfo ();
print_r ( $foo_arr );
//Sample print_r return
/*
Array(
[0] => HY000
[1] => 1364
[2] => Field ‘phone’ doesn’t have a default value
)
Never have I been so happy to see an error
*/
?>
While its common practice for any decent developer to always watch out and try to catch for errors, even the best of us make mistakes. This is not a replacement for exceptions, but the simplicity is priceless.
Источник
PDO::errorCode
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::errorCode — Возвращает код SQLSTATE результата последней операции с базой данных
Описание
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает SQLSTATE — пятисимвольный идентификатор, определённый в стандарте ANSI SQL-92. Первые два символа SQLSTATE отвечают за класс ошибки, а следующие три определяют её подкласс. Класс ошибок 01 означает предупреждение, которому сопутствует возвращаемый код SQL_SUCCESS_WITH_INFO. Классы отличные от 01, за исключением ‘IM’, означают ошибки выполнения запросов к базе данных. Класс ‘IM’ свидетельствует об ошибках и предупреждениях, которые вызваны самой реализацией PDO (или, возможно, ODBC, если используется драйвер ODBC). Значение подкласса ‘000’ в любом классе означает, что подкласс для этого SQLSTATE отсутствует.
PDO::errorCode() выдаёт код ошибки только для операций, совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement методами PDO::prepare() или PDO::query() , и вызвать ошибку его методами, PDO::errorCode() эту ошибку не отобразит. Вам нужно вызвать PDOStatement::errorCode() , чтобы получить код ошибки для операции, выполняемой на определённом объекте PDOStatement.
Возвращает null , если никаких операций над базой данных средствами PDO-объекта не производилось.
Примеры
Пример #1 Получение кода SQLSTATE
/* Спровоцируем ошибку — таблицы BONES не существует */
$dbh -> exec ( «INSERT INTO bones(skull) VALUES (‘lucy’)» );
echo «nPDO::errorCode(): » , $dbh -> errorCode ();
?>
Результат выполнения данного примера:
Смотрите также
- PDO::errorInfo() — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
- PDOStatement::errorCode() — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
- PDOStatement::errorInfo() — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
Источник
PDO::errorInfo
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::errorInfo — Получает расширенную информацию об ошибке, произошедшей в ходе последнего обращения к базе данных
Описание
Список параметров
У этой функции нет параметров.
Возвращаемые значения
PDO::errorInfo() возвращает массив с информацией об ошибке, произошедшей в ходе выполнения последней операции с базой данных. Массив содержит как минимум следующие поля:
Элемент | Информация |
---|---|
Код ошибки SQLSTATE (пятисимвольный идентификатор, определённый в стандарте ANSI SQL). | |
1 | Код ошибки, заданный драйвером. |
2 | Сообщение об ошибке, заданное драйвером |
Если не задан SQLSTATE код или драйвер не сообщил об ошибке, то элементы следующие за нулевым будут иметь значение null .
PDO::errorInfo() выдаёт информацию об ошибке только для операций, совершаемых с базой данных напрямую из PDO. Если создать объект PDOStatement методами PDO::prepare() или PDO::query() , и вызвать ошибку его методами, PDO::errorInfo() эту ошибку не отобразит. Вам нужно вызвать PDOStatement::errorInfo() , чтобы получить информации об ошибках для операции, выполняемой на определённом объекте PDOStatement.
Примеры
Пример #1 Вывод полей массива errorInfo() для PDO_ODBC подключения к базе данных DB2
Результат выполнения данного примера:
Смотрите также
- PDO::errorCode() — Возвращает код SQLSTATE результата последней операции с базой данных
- PDOStatement::errorCode() — Получает код SQLSTATE, связанный с последней операцией в объекте PDOStatement
- PDOStatement::errorInfo() — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
User Contributed Notes 3 notes
Please note : that this example won’t work if PDO::ATTR_EMULATE_PREPARES is true.
You should set it to false
-> setAttribute ( PDO :: ATTR_EMULATE_PREPARES , false );
$stmt = $dbh -> prepare ( ‘bogus sql’ );
if (! $stmt ) <
echo «nPDO::errorInfo():n» ;
print_r ( $dbh -> errorInfo ());
>
?>
here are the error codes for sqlite, straight from their site:
The error codes for SQLite version 3 are unchanged from version 2. They are as follows:
#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
Some PDO drivers return a larger array. For example, the SQL Server driver returns 5 values.
For example:
= $db -> exec ( «DELETE FROM [TableName] WHERE ID between 6 and 17» );
print_r ( $db -> errorInfo ());
?>
Result:
Array
(
[0] => 00000
[1] => 0
[2] => (null) [0] (severity 0) []
[3] => 0
[4] => 0
)
Источник
Ошибки и их обработка
PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего стиля разработки приложений.
PDO::ERRMODE_SILENT
До PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который можно получить методами PDO::errorCode() и PDO::errorInfo() . Эти методы реализованы как в объектах запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения кода объекта запроса, нужно вызвать метод PDOStatement::errorCode() или PDOStatement::errorInfo() этого объекта. Если ошибка вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта.
PDO::ERRMODE_WARNING
Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.
PDO::ERRMODE_EXCEPTION
Начиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение PDOException , свойства которого будут отражать код ошибки и её описание. Этот режим также полезен при отладке, так как сразу известно, где в программе произошла ошибка. Это позволяет быстро локализовать и решить проблему. (Не забывайте, что если исключение является причиной завершения работы скрипта, все активные транзакции будут откачены.)
Режим исключений также полезен, так как даёт возможность структурировать обработку ошибок более тщательно, нежели с обычными предупреждениями PHP, а также с меньшей вложенностью кода, чем в случае работы в тихом режиме с явной проверкой возвращаемых значений при каждом обращении к базе данных.
Подробнее об исключениях в PHP смотрите в разделе Исключения.
PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE. Отдельные драйверы PDO могут задавать соответствия своих собственных кодов кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает метод PDO::errorInfo() , который возвращает массив, содержащий код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.
Пример #1 Создание PDO объекта и установка режима обработки ошибок
= ‘mysql:dbname=testdb;host=127.0.0.1’ ;
$user = ‘dbuser’ ;
$password = ‘dbpass’ ;
$dbh = new PDO ( $dsn , $user , $password );
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
// PDO выбросит исключение PDOException (если таблица не существует)
$dbh -> query ( «SELECT wrongcolumn FROM wrongtable» );
?>
Результат выполнения данного примера:
Метод PDO::__construct() будет всегда бросать исключение PDOException , если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE .
Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе
= ‘mysql:dbname=test;host=127.0.0.1’ ;
$user = ‘googleguy’ ;
$password = ‘googleguy’ ;
$dbh = new PDO ( $dsn , $user , $password , array( PDO :: ATTR_ERRMODE => PDO :: ERRMODE_WARNING ));
// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh -> query ( «SELECT wrongcolumn FROM wrongtable» );
?>
Источник
MySQL Functions (PDO_MYSQL)
Introduction
PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MySQL databases.
PDO_MYSQL uses emulated prepares by default.
When running a PHP version before 7.1.16, or PHP 7.2 before 7.2.4, set MySQL 8 Server’s default password plugin to mysql_native_password or else you will see errors similar to The server requested authentication method unknown to the client [caching_sha2_password] even when caching_sha2_password is not used.
This is because MySQL 8 defaults to caching_sha2_password, a plugin that is not recognized by the older PHP (mysqlnd) releases. Instead, change it by setting default_authentication_plugin=mysql_native_password in my.cnf . The caching_sha2_password plugin will be supported in a future PHP release. In the meantime, the mysql_xdevapi extension does support it.
Beware: Some MySQL table types (storage engines) do not support transactions. When writing transactional database code using a table type that does not support transactions, MySQL will pretend that a transaction was initiated successfully. In addition, any DDL queries issued will implicitly commit any pending transactions.
The MySQL driver does not properly support PDO::PARAM_INPUT_OUTPUT via PDOStatement::bindParam() ; while such parameters can be used, they are not updated (i.e. the actual output is ignored).
Installation
The common Unix distributions include binary versions of PHP that can be installed. Although these binary versions are typically built with support for the MySQL extensions, the extension libraries themselves may need to be installed using an additional package. Check the package manager that comes with your chosen distribution for availability.
For example, on Ubuntu the php5-mysql package installs the ext/mysql, ext/mysqli, and PDO_MYSQL PHP extensions. On CentOS, the php-mysql package also installs these three PHP extensions.
Alternatively, you can compile this extension yourself. Building PHP from source allows you to specify the MySQL extensions you want to use, as well as your choice of client library for each extension.
When compiling, use —with-pdo-mysql[=DIR] to install the PDO MySQL extension, where the optional [=DIR] is the MySQL base library. Mysqlnd is the default library. For details about choosing a library, see Choosing a MySQL library.
Optionally, the —with-mysql-sock[=DIR] sets to location to the MySQL unix socket pointer for all MySQL extensions, including PDO_MYSQL. If unspecified, the default locations are searched.
Optionally, the —with-zlib-dir[=DIR] is used to set the path to the libz install prefix.
SSL support is enabled using the appropriate PDO_MySQL constants, which is equivalent to calling the » MySQL C API function mysql_ssl_set(). Also, SSL cannot be enabled with PDO::setAttribute because the connection already exists. See also the MySQL documentation about » connecting to MySQL with SSL.
Predefined Constants
The constants below are defined by this driver, and will only be available when the extension has been either compiled into PHP or dynamically loaded at runtime. In addition, these driver-specific constants should only be used if you are using this driver. Using driver-specific attributes with another driver may result in unexpected behaviour. PDO::getAttribute() may be used to obtain the PDO::ATTR_DRIVER_NAME attribute to check the driver, if your code can run against multiple drivers.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY ( int ) If this attribute is set to true on a PDOStatement , the MySQL driver will use the buffered versions of the MySQL API. If you’re writing portable code, you should use PDOStatement::fetchAll() instead.
Example #1 Forcing queries to be buffered in mysql
PDO::MYSQL_ATTR_LOCAL_INFILE ( int )
Enable LOAD LOCAL INFILE .
Note, this constant can only be used in the driver_options array when constructing a new database handle.
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY ( string )
Allows restricting LOCAL DATA loading to files located in this designated directory. Available as of PHP 8.1.0.
Note, this constant can only be used in the driver_options array when constructing a new database handle.
PDO::MYSQL_ATTR_INIT_COMMAND ( string )
Command to execute when connecting to the MySQL server. Will automatically be re-executed when reconnecting.
Note, this constant can only be used in the driver_options array when constructing a new database handle.
PDO::MYSQL_ATTR_READ_DEFAULT_FILE ( int )
Read options from the named option file instead of from my.cnf . This option is not available if mysqlnd is used, because mysqlnd does not read the mysql configuration files.
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP ( int )
Read options from the named group from my.cnf or the file specified with MYSQL_READ_DEFAULT_FILE . This option is not available if mysqlnd is used, because mysqlnd does not read the mysql configuration files.
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE ( int )
Maximum buffer size. Defaults to 1 MiB. This constant is not supported when compiled against mysqlnd.
PDO::MYSQL_ATTR_DIRECT_QUERY ( int )
Perform direct queries, don’t use prepared statements.
PDO::MYSQL_ATTR_FOUND_ROWS ( int )
Return the number of found (matched) rows, not the number of changed rows.
PDO::MYSQL_ATTR_IGNORE_SPACE ( int )
Permit spaces after function names. Makes all functions names reserved words.
PDO::MYSQL_ATTR_COMPRESS ( int )
Enable network communication compression.
PDO::MYSQL_ATTR_SSL_CA ( int )
The file path to the SSL certificate authority.
PDO::MYSQL_ATTR_SSL_CAPATH ( int )
The file path to the directory that contains the trusted SSL CA certificates, which are stored in PEM format.
PDO::MYSQL_ATTR_SSL_CERT ( int )
The file path to the SSL certificate.
PDO::MYSQL_ATTR_SSL_CIPHER ( int )
A list of one or more permissible ciphers to use for SSL encryption, in a format understood by OpenSSL. For example: DHE-RSA-AES256-SHA:AES128-SHA
PDO::MYSQL_ATTR_SSL_KEY ( int )
The file path to the SSL key.
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT ( int )
Provides a way to disable verification of the server SSL certificate.
This exists as of PHP 7.0.18 and PHP 7.1.4.
PDO::MYSQL_ATTR_MULTI_STATEMENTS ( int )
Disables multi query execution in both PDO::prepare() and PDO::query() when set to false .
Note, this constant can only be used in the driver_options array when constructing a new database handle.
Runtime Configuration
The behaviour of these functions is affected by settings in php.ini .
PDO_MYSQL Configuration Options
Name | Default | Changeable |
---|---|---|
pdo_mysql.default_socket | «/tmp/mysql.sock» | PHP_INI_SYSTEM |
pdo_mysql.debug | NULL | PHP_INI_SYSTEM |
For further details and definitions of the PHP_INI_* modes, see the Where a configuration setting may be set.
Here’s a short explanation of the configuration directives.
Sets a Unix domain socket. This value can either be set at compile time if a domain socket is found at configure. This ini setting is Unix only.
Enables debugging for PDO_MYSQL. This setting is only available when PDO_MYSQL is compiled against mysqlnd and in PDO debug mode.
Table of Contents
User Contributed Notes 8 notes
There is an important undocumented attribute which disables certificate CN verification available after
5.6.22 (not sure), 7.0.18 (verified) and 7.1.15 (not sure)
possible values: true, false
default value: true
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. .
After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server’s box.
Upgraded the MySQL client on the web server to the current revision and the problem went away.
To use «PDO::MYSQL_ATTR_USE_BUFFERED_QUERY» you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
It will not work when passed into PDO::prepare()
Today’s PHP snapshot now has SSL support for PDO. Follow the directions here ( http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html ) to set up MySQL and then use the following connection options:
= new PDO (
‘mysql:host=hostname;dbname=ssldb’ ,
‘username’ ,
‘password’ ,
array(
PDO :: MYSQL_ATTR_SSL_KEY => ‘/path/to/client-key.pem’ ,
PDO :: MYSQL_ATTR_SSL_CERT => ‘/path/to/client-cert.pem’ ,
PDO :: MYSQL_ATTR_SSL_CA => ‘/path/to/ca-cert.pem’
)
);
?>
I have been getting the error below when performing multiple queries within a single page.
Setting the attribute below did not seem to work for me.
So building on previous example i am initilizing my stmt variable on every query and a fetch all into an array. Seems to be working for me.
Error:
PDO Error 1.1: Array ( [0] => xxx[1] => yyy[2] => Lost connection to MySQL server during query )
false));
$stmt = $dbh->prepare(«CALL getname()»);
// call the stored procedure
$stmt->execute();
// fetch all rows into an array.
$rows = $stmt->fetchAll();
foreach ($rows as $rs)
<
$id = $rs[‘id’];
>
//initilise the statement
unset($stmt);
$stmt = $dbh->prepare(«call secondprocedure(?);»);
$stmt->bindValue(1, $id);
if ( ! $stmt->execute() )
<
echo «PDO Error 1.1:n»;
print_r($stmt->errorInfo());
exit;
>
unset($stmt);
> catch (PDOException $e) <
print «Error!: » . $e->getMessage() . «
«;
die();
>
?>
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. .
This one can be a royal pain to deal with. Never stack statements to be executed in one go. Nobody ever mentions this possibility in all the posts I’ve seen dealing with this error.
This example is a Zend Framework example but the theory is the same.
= CREATE TABLE IF NOT EXISTS `ticket_hist` (
`tid` int(11) NOT NULL,
`trqform` varchar(40) NOT NULL,
`trsform` varchar(40) NOT NULL,
`tgen` datetime NOT NULL,
`tterm` datetime,
`tstatus` tinyint(1) NOT NULL
) ENGINE=ARCHIVE COMMENT=’ticket archive’;
CREATE TABLE IF NOT EXISTS `request_hist` (
`rqid` int(11) NOT NULL,
`rqtid` int(11) NOT NULL,
`rqsid` int(11) NOT NULL,
`rqdate` datetime NOT NULL,
`rqcode` tinyint(1) NOT NULL,
`rssid` int(11) NOT NULL,
`rsdate` datetime,
`rscode` tinyint(1)
) ENGINE=ARCHIVE COMMENT=’request archive’;
CREATE TABLE IF NOT EXISTS `relay_hist` (
`rqid` int(5) NOT NULL,
`sdesc` varchar(40) NOT NULL,
`rqemail` varchar(40) NOT NULL,
`sid` int(11) NOT NULL,
`rlsid` int(11) NOT NULL,
`dcode` varchar(5) NOT NULL
) ENGINE=ARCHIVE COMMENT=’relay archive’;
____SQL;
$result = $this -> db -> getConnection ()-> exec ( $sql );
?>
This will run fine but PDO will balk with the ‘unbuffered’ error if you follow this with another query.
= CREATE TABLE IF NOT EXISTS `ticket_hist` (
`tid` int(11) NOT NULL,
`trqform` varchar(40) NOT NULL,
`trsform` varchar(40) NOT NULL,
`tgen` datetime NOT NULL,
`tterm` datetime,
`tstatus` tinyint(1) NOT NULL
) ENGINE=ARCHIVE COMMENT=’ticket archive’;
____SQL;
$result = $this -> db -> getConnection ()-> exec ( $sql );
$sql = CREATE TABLE IF NOT EXISTS `request_hist` (
`rqid` int(11) NOT NULL,
`rqtid` int(11) NOT NULL,
`rqsid` int(11) NOT NULL,
`rqdate` datetime NOT NULL,
`rqcode` tinyint(1) NOT NULL,
`rssid` int(11) NOT NULL,
`rsdate` datetime,
`rscode` tinyint(1)
) ENGINE=ARCHIVE COMMENT=’request archive’;
____SQL;
$result = $this -> db -> getConnection ()-> exec ( $sql );
$sql = CREATE TABLE IF NOT EXISTS `relay_hist` (
`rqid` int(5) NOT NULL,
`sdesc` varchar(40) NOT NULL,
`rqemail` varchar(40) NOT NULL,
`sid` int(11) NOT NULL,
`rlsid` int(11) NOT NULL,
`dcode` varchar(5) NOT NULL
) ENGINE=ARCHIVE COMMENT=’relay archive’;
____SQL;
$result = $this -> db -> getConnection ()-> exec ( $sql );
?>
Chopping it into individual queries fixes the problem.
If you have the error ‘could not find driver’ and won’t able to install driver for newer linux(Fedora, Redhat, CentOS) with latest PHP7/MariaDB10/Apache2.4 get this package installed and get every things smooth.
First download latest version of epel and remi for your distribution. This links is for Fedora 26:
Than install them
rpm -Uvh remi-release-26.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
Know you can use remi repository to gest php-pdo and php-mysql.
yum —enablerepo=remi install php-pdo
yum —enablerepo=remi install php-mysql
Restart the Apache
systemctl stop httpd
systemctl start httpd
Источник
PDO offers you a choice of 3 different error handling strategies, to fit
your style of application development.
-
PDO::ERRMODE_SILENT
Prior to PHP 8.0.0, this was the default mode. PDO will simply set the error code for you
to inspect using the PDO::errorCode() and
PDO::errorInfo() methods on both the
statement and database objects; if the error resulted from a call on a
statement object, you would invoke the
PDOStatement::errorCode() or
PDOStatement::errorInfo()
method on that object. If the error resulted from a call on the
database object, you would invoke those methods on the database object
instead. -
PDO::ERRMODE_WARNING
In addition to setting the error code, PDO will emit a traditional
E_WARNING message. This setting is useful during debugging/testing, if
you just want to see what problems occurred without interrupting the
flow of the application. -
PDO::ERRMODE_EXCEPTION
As of PHP 8.0.0, this is the default mode.
In addition to setting the error code, PDO will throw a
PDOException
and set its properties to reflect the error code and error
information. This setting is also useful during debugging, as it will
effectively «blow up» the script at the point of the error, very
quickly pointing a finger at potential problem areas in your code
(remember: transactions are automatically rolled back if the exception
causes the script to terminate).Exception mode is also useful because you can structure your error
handling more clearly than with traditional PHP-style warnings, and
with less code/nesting than by running in silent mode and explicitly
checking the return value of each database call.See Exceptions for more
information about Exceptions in PHP.
PDO standardizes on using SQL-92 SQLSTATE error code strings; individual
PDO drivers are responsible for mapping their native codes to the
appropriate SQLSTATE codes. The PDO::errorCode()
method returns a single SQLSTATE code. If you need more specific
information about an error, PDO also offers an
PDO::errorInfo() method which returns an array
containing the SQLSTATE code, the driver specific error code and driver
specific error string.
Example #1 Create a PDO instance and set the error mode
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}?>
Note:
PDO::__construct() will always throw a PDOException if the connection fails
regardless of whichPDO::ATTR_ERRMODE
is currently set. Uncaught Exceptions are fatal.
Example #2 Create a PDO instance and set the error mode from the constructor
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';/*
Using try/catch around the constructor is still valid even though we set the ERRMODE to WARNING since
PDO::__construct will always throw a PDOException if the connection fails.
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}// This will cause PDO to throw an error of level E_WARNING instead of an exception (when the table doesn't exist)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
The above example will output:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 18
sylvain dot brunerie at gmail dot com ¶
2 years ago
Note that if you’re executing an SQL command containing multiple statements, PDO by default will not be able to correctly report errors in one of them.
More info (and a workaround) in this bug report: https://bugs.php.net/bug.php?id=61613
Praveen Raj ¶
7 years ago
Setting the PDO::ATTR_ERRMODE to PDO::ERRMODE_EXCEPTION applies to both PDO and PDO::PDOStatement objects. Also, exceptions are thrown by: PDO::beginTransaction(), PDO::prepare(), PDOStatement::execute(), PDO::commit(), PDOStatement::fetch(), PDOStatement::fetchAll() and so on... Some of these are specified in their respective documentations as to return 'false' in case of an error.
- Introduction
- Installing/Configuring
- Predefined Constants
- Connections and Connection management
- Transactions and auto-commit
- Prepared statements and stored procedures
- Errors and error handling
- Large Objects (LOBs)
- PDO
- PDOStatement
- PDOException
- PDO Drivers
PDO offers you a choice of 3 different error handling strategies, to fit
your style of application development.
-
PDO::ERRMODE_SILENT
This is the default mode. PDO will simply set the error code for you
to inspect using the PDO::errorCode and
PDO::errorInfo methods on both the
statement and database objects; if the error resulted from a call on a
statement object, you would invoke the
PDOStatement::errorCode or
PDOStatement::errorInfo
method on that object. If the error resulted from a call on the
database object, you would invoke those methods on the database object
instead. -
PDO::ERRMODE_WARNING
In addition to setting the error code, PDO will emit a traditional
E_WARNING message. This setting is useful during debugging/testing, if
you just want to see what problems occurred without interrupting the
flow of the application. -
PDO::ERRMODE_EXCEPTION
In addition to setting the error code, PDO will throw a
PDOException
and set its properties to reflect the error code and error
information. This setting is also useful during debugging, as it will
effectively «blow up» the script at the point of the error, very
quickly pointing a finger at potential problem areas in your code
(remember: transactions are automatically rolled back if the exception
causes the script to terminate).Exception mode is also useful because you can structure your error
handling more clearly than with traditional PHP-style warnings, and
with less code/nesting than by running in silent mode and explicitly
checking the return value of each database call.See Exceptions for more
information about Exceptions in PHP.
PDO standardizes on using SQL-92 SQLSTATE error code strings; individual
PDO drivers are responsible for mapping their native codes to the
appropriate SQLSTATE codes. The PDO::errorCode
method returns a single SQLSTATE code. If you need more specific
information about an error, PDO also offers an
PDO::errorInfo method which returns an array
containing the SQLSTATE code, the driver specific error code and driver
specific error string.
Example #1 Create a PDO instance and set the error mode
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}?>
Note:
PDO::__construct will always throw a PDOException if the connection fails
regardless of whichPDO::ATTR_ERRMODE
is currently set. Uncaught Exceptions are fatal.
Example #2 Create a PDO instance and set the error mode from the constructor
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';/*
Using try/catch around the constructor is still valid even though we set the ERRMODE to WARNING since
PDO::__construct will always throw a PDOException if the connection fails.
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}// This will cause PDO to throw an error of level E_WARNING instead of an exception (when the table doesn't exist)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
The above example will output:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 18
Errors and error handling
PDO offers you a choice of 3 different error handling strategies, to fit your style of application development.
- PDO::ERRMODE_SILENT
This is the default mode. PDO will simply set the error code for you to inspect using the PDO::errorCode() and PDO::errorInfo() methods on both the statement and database objects; if the error resulted from a call on a statement object, you would invoke the PDOStatement::errorCode() or PDOStatement::errorInfo() method on that object. If the error resulted from a call on the database object, you would invoke those methods on the database object instead.
- PDO::ERRMODE_WARNING
In addition to setting the error code, PDO will emit a traditional E_WARNING message. This setting is useful during debugging/testing, if you just want to see what problems occurred without interrupting the flow of the application.
- PDO::ERRMODE_EXCEPTION
In addition to setting the error code, PDO will throw a PDOException and set its properties to reflect the error code and error information. This setting is also useful during debugging, as it will effectively «blow up» the script at the point of the error, very quickly pointing a finger at potential problem areas in your code (remember: transactions are automatically rolled back if the exception causes the script to terminate).
Exception mode is also useful because you can structure your error handling more clearly than with traditional PHP-style warnings, and with less code/nesting than by running in silent mode and explicitly checking the return value of each database call.
Смотрите также Exceptions for more information about Exceptions in PHP.
PDO standardizes on using SQL-92 SQLSTATE error code strings; individual PDO drivers are responsible for mapping their native codes to the appropriate SQLSTATE codes. The PDO::errorCode() method returns a single SQLSTATE code. If you need more specific information about an error, PDO also offers an PDO::errorInfo() method which returns an array containing the SQLSTATE code, the driver specific error code and driver specific error string.
Пример #1 Create a PDO instance and set the error mode
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
Описание класса pdo,
примеры использования класса pdo.
Описание на ru2.php.net
Описание на php.ru