Get pdo error message

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::errorInfo
Fetch extended error information associated with the last operation on the database handle

Description

public PDO::errorInfo(): array

Parameters

This function has no parameters.

Return Values

PDO::errorInfo() returns an array of error information
about the last operation performed by this database handle. The array
consists of at least the following fields:

Element Information
0 SQLSTATE error code (a five characters alphanumeric identifier defined
in the ANSI SQL standard).
1 Driver-specific error code.
2 Driver-specific error message.

Note:

If the SQLSTATE error code is not set or there is no driver-specific
error, the elements following element 0 will be set to null.

PDO::errorInfo() only retrieves error information for
operations performed directly on the database handle. If you create a
PDOStatement object through PDO::prepare() or
PDO::query() and invoke an error on the statement
handle, PDO::errorInfo() will not reflect the error
from the statement handle. You must call
PDOStatement::errorInfo() to return the error
information for an operation performed on a particular statement handle.

Examples

Example #1 Displaying errorInfo() fields for a PDO_ODBC connection to a DB2 database


<?php
/* Provoke an error -- bogus SQL syntax */
$stmt = $dbh->prepare('bogus sql');
if (!
$stmt) {
echo
"nPDO::errorInfo():n";
print_r($dbh->errorInfo());
}
?>

The above example will output:

PDO::errorInfo():
Array
(
    [0] => HY000
    [1] => 1
    [2] => near "bogus": syntax error
)

See Also

  • PDO::errorCode() — Fetch the SQLSTATE associated with the last operation on the database handle
  • PDOStatement::errorCode() — Fetch the SQLSTATE associated with the last operation on the statement handle
  • PDOStatement::errorInfo() — Fetch extended error information associated with the last operation on the statement handle

alagar86 at gmail dot com

12 years ago


Please note : that this example won't work if PDO::ATTR_EMULATE_PREPARES is true.

You should set it to false

<?php

$dbh
->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

$stmt = $dbh->prepare('bogus sql');

if (!
$stmt) {

    echo
"nPDO::errorInfo():n";

   
print_r($dbh->errorInfo());

}

?>


quickshiftin at gmail dot com

15 years ago


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 */


mazen at mindcraftinc dot com

14 years ago


Some PDO drivers return a larger array. For example, the SQL Server driver returns 5 values.

For example:

<?php

$numRows
= $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 объекта и установка режима обработки ошибок


<?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_ERRMODEPDO::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

MySQL Error
We can display error message in case of an error generated by MySQL query. This meaning full error message gives idea one the problem or bugs in the script. We can print the error message by using mysql function mysql_error(). This function returns the error message associated with most recently executed query. So it is a good idea to check for error before going to next query. We can even add the error number returned by mysql to this error message. This way we can generate a meaningful detail on the bugs on the script.

$querry = mysql_query("SELECT new_field FROM student");

echo "Error message = ".mysql_error();

In our student table there is no field as new_field. Here here is the message we will get

Error message = Unknown column 'new_field' in 'field list'

Note that mysql_error() is deprecated as of PHP 5.5.0 so better to avoid using this function. So if you are using PDO then we can use errorInfo() to display the returned error message from MySQL

Here is a sample code in PHP using PDO to display record and on failure to display error message.

require 'config-pdo.php'; // database connection string 
$pdo=$dbo->prepare('Select no_name from student');
if($pdo->execute()){
echo 'Success<br>';
$row = $pdo->fetch(PDO::FETCH_OBJ);
echo "Name : $row->name ";
}else{
print_r($pdo->errorInfo());
}

In the above code there is an error in sql , there is no column by name no_name. The output will be

Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'no_name' in 'field list' )

So to get correct result change the sql part like this .

$pdo=$dbo->prepare('Select * from student');

With this you will get desired output.

Handling PDO errors

If such error occurs what is to be done ? We have three options to handle in case of errors.

We can stop the execution of the script. ( Fatal error : stop execution of code )
We can display warning message ( Warning only, display message and no stoppage of execution )
Remain silent ( continue to execute and display error message if required )

Setting the PDO error handling attribute.

We can use setAttribute to tell how to handle the PDO errors.
Here is a sample

$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);   // gives warning only

Here is the complete code.

require 'config-pdo.php'; // database connection string 
//$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // generates fatal error
//$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);   // gives warning only
$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);  // remain silent 
 
$pdo=$dbo->prepare('Select no_name from student');
if($pdo->execute()){
echo 'Success<br>';
$row = $pdo->fetch(PDO::FETCH_OBJ);
echo "Name : $row->name ";
}else{
print_r($pdo->errorInfo());
}

Now we have given all the three options but commented two and set the attribute to Silent. You can change the commented status and see how the script is behaving in different setAttribute values.

It is clear that the above code will generate error message. We can store the error message in a database or we can post ( by mail ) to the programmer about these details.

Store the error message generated in an sql query or send email >>

In this tutorial we will learn about PHP PDO.

What is PDO?

PDO (PHP Data Objects) is a PHP extension used to access and work with different types of databases like MySQL, Oracle etc by writing same code.

It acts as a data abstraction layer that helps in issuing query and fetch data regardless of database.

How to connect to a database using PDO?

We call the PDO constructor to create database connection.

//constants
define('DB_DSN', 'mysql:host=localhost;dbname=mydb');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'root123');

try {
	//create pdo connection object
	$pdocon = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
} catch (PDOException $e) {
	printf("Error: " . $e->getMessage());
	die();
}

In the above code PDO constructor takes three arguments namely dsn, username and password.

The DB_DSN holds the Data Source Name which contains two items, a database driver name and the other is the database name. DB_USERNAME and DB_PASSWORD holds the username and password of the database respectively.

Throughout this tutorial we will use $pdocon as PDO object.

How to get PDO error code?

We use the errorCode() method to get the error code when error occurs. These error codes are standard SQLSTATE codes.

$pdocon->errorCode();

How to get PDO error message?

We use the errorInfo() method to get the error message when error occurs. This method will return an array. This array consists of three elements. The 0th element represents the SQLSTATE code. The 2nd element contains the database driver specific error code. And the 3rd element contains the database driver specific error message.

$pdocon->errorInfo();

Types of query execution

There are basically three type of query executions.

Query execution with no result set: Query like INSERT, UPDATE and DELETE returns no result set and only tells us about the number of row affected.

Query execution with result set: Query like SELECT generally returns a result set and also the number of rows returned.

Query executed multiple times: For instance, running INSERT query multiple time by passing different data.

INSERT, UPDATE and DELETE data

To insert, update and delete data we use the exec() method and it returns the number of rows affected.

In the following example we execute INSERT query.

//query
$query = sprintf("INSERT INTO student (`studentid`, `name`, `branch`) VALUES ('s001', 'Yusuf', 'CSE')");

//execute the query
$affectedRows = $pdocon->exec($query);

//number of rows affected
printf("Inserted Rows: %d", $affectedRows);		//this will print "Inserted Rows: 1"

In the following example we execute UPDATE query.

//query
$query = sprintf("UPDATE student SET name = 'Alice' WHERE studentid = 's2016'");

//execute the query
$affectedRows = $pdocon->exec($query);

//number of rows affected
printf("Updated Rows: %d", $affectedRows);		//this will print "Updated Rows: 1"

In the following example we execute DELETE query.

//query
$query = sprintf("DELETE FROM student WHERE studentid = 's101'");

//execute the query
$affectedRows = $pdocon->exec($query);

//number of rows affected
printf("Deleted Rows: %d", $affectedRows);		//this will print "Deleted Rows: 1"

SELECT data

To select data we use the query() method which returns a result set as PDOStatement object. To know about the total number of rows returned we use the rowCount() method.

//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");

//execute query
$result = $pdocon->query($query);

//total rows returned
printf("Selected Rows: %d", $result->rowCount());

//loop through the results
foreach ($result as $row) {
	printf("StudentID: %s Name: %s Branch: %s", $row['studentid'], $row['name'], $row['branch']);
}

Prepared Statement

We use prepared statement when we know that a same query will be executed multiple times with only change in parameters. For example, the INSERT query for a student table will always have the same template and only the insert data will change.

How to create a prepared statement?

We use the prepare() method to create a prepared statement. It is used to ready a query for execution.

$stmt = $pdocon->prepare($query);

How to execute a prepared statement?

We use the execute() method to execute a prepared statement. This method takes an array argument containing the placeholder and values. We will see that in the following example.

How to get the total number of affected rows?

To get the total number of affected rows we use rowCount() method.

UPDATE data using prepared statement

In the following example we execute an UPDATE query which has two placeholders :name and :studentid. When we execute the prepared statement we call the execute() method with an array containing the placeholders and values.

//query
$query = sprintf("UPDATE student SET name = :name WHERE studentid = :studentid");

//prepare the statement
$stmt = $pdocon->prepare($query);

//execute the prepared statement
$stmt->execute(array(
	":name" => "Alice",
	":studentid" => "s101"
));

//affected rows
printf("Updated Rows: %d", $stmt->rowCount());

Bind parameters

This is another way to assign value to the placeholders in the query. We use the bindParam() and pass the placeholder, value and the datatype.

Following are the list of some of the data types that can be passed to the bindParam() method.

  • PDO::PARAM_BOOL for boolean data
  • PDO::PARAM_INT for integer data
  • PDO::PARAM_STR for string data
  • PDO::PARAN_NULL for null data
$stmt->bindParam(":name", $name, PDO::PARAM_STR);

UPDATE data using the bind parameter

//query
$query = sprintf("UPDATE student SET name = :name WHERE studentid = :studentid");

//prepare the statement
$stmt = $pdocon->prepare($query);

//bind parameter
$name = "Alice";
$studentid = "101";
$stmt->bindParam(":name", $name, PDO::PARAM_STR);
$stmt->bindParam(":studentid", $studentid, PDO::PARAM_STR);

//execute the prepared statement
$stmt->execute();

//affected rows
printf("Updated Rows: %d", $stmt->rowCount());

Retrieve data

We can use two methods fetch() and fetchAll() to retrieve data.

In the following example we are using the fetch() methods to retrieve data from the student table. We are passing the argument PDO::FETCH_ASSOC to the fetch() method. This will make the method return result as an associative array.

//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");

//execute the query
$stmt = $pdocon->query($query);

//returned rows
printf("Selected Rows: %d", $stmt->rowCount());

//loop through the result
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
	printf("StudentID: %s Name: %s Branch %s", $row['studentid'], $row['name'], $row['branch']);
}

In the following example we are using the fetchAll() method and passing the argument PDO::FETCH_ASSOC to get associative array as result.

//query
$query = sprintf("SELECT studentid, name, branch FROM student LIMIT 0,10");

//execute the query
$stmt = $pdocon->query($query);

//returned rows
printf("Selected Rows: %d", $stmt->rowCount());

//get the result
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

//loop through the result
foreach ($result as $row) {
	printf("StudentID: %s Name: %s Branch %s", $row['studentid'], $row['name'], $row['branch']);
}

How to begin a transaction?

To begin a transaction we use beginTransaction() method.

$pdocon->beginTransaction();

How to commit a transaction?

To commit a transaction we use the commit() method.

$pdocon->commit();

How to rollback?

To perform rollback we use the rollback() method.

$pdo->rollback();

Понравилась статья? Поделить с друзьями:
  • Get known folder path error
  • Get key error hikvision
  • Get kernel port maui meta ошибка
  • Get fields error
  • Get error text python