Меню

Обработка ошибок подключения к mysql

Правильная обработка ошибок позволяет сделать стабильное приложение, которое не будет завершаться неожиданно. В случае возникновения непредвиденной ситуации программа должна выдавать вменяемый ответ, почему она не хочет исполнится. И создание правильного механизма обработки ошибок — это задача программиста.

В этой статье рассмотрим два вида ошибок, которые могут возникнуть при программировании взаимодействия с базой данных. Первый тип — это ошибка подключения к базе данных. Второй тип — это ошибка выполнения запроса к базе данных. Для обработки этих ошибок будем использовать специальные функции для работы с базой.

Ошибка соединения с базой данных

Сразу приведём пример обработки ошибки с соединением с базой данных:

<?php 
   $host = 'localhost'; // адрес сервера
   $db_name = 'database'; // имя базы данных
   $user = 'user'; // имя пользователя
   $password = 'password'; // пароль

   // создание подключения к базе   
      $connection = mysqli_connect($host, $user, $password, $db_name);

   // проверка правильности подключения
      if(!$connection){ // при соединении с базой данных возникла ошибка
         echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
         echo 'Код ошибки: ' . mysqli_connect_errno();
      }else{ // соединение было установлено успешно
         // здесь можно делать запрос к базе, 
         // потому что соединение успешно установлено
      }
?>

В этом примере можно заметить функцию mysqli_connect_error. Она выводит текстовое описание ошибки подключения (на английском языке). В отличии от неё функция mysqli_connect_errno выводит числовой код ошибки, к примеру «1045».

Ошибка запроса к базе

Теперь попробуем доработать пример из предыдущего параграфа и добавить запрос к базе данных. Не будем вдаваться в детали, что будет записано в тексте SQL запроса, просто предположим, что он может завершиться ошибкой. К примеру, из-за неожиданного отключения сервера с базой данных от сети. В примере добавим проверку на наличие ошибок при выполнении запроса:

<?php 
   $host = 'localhost'; // адрес сервера
   $db_name = 'database'; // имя базы данных
   $user = 'user'; // имя пользователя
   $password = 'password'; // пароль

   // создание подключения к базе   
      $connection = mysqli_connect($host, $user, $password, $db_name);

      if(!$connection){ // проверка правильности подключения
         echo 'Ошибка соединения: ' . mysqli_connect_error() . '<br>';
         echo 'Код ошибки: ' . mysqli_connect_errno();
      }else{ // подключение успешно установлено

         // текст SQL запроса, который будет передан базе
            $query = 'SELECT * FROM `USERS`';

         // выполняем запрос к базе данных
            $result = mysqli_query($connection, $query);

            if(!$result){ // запрос завершился ошибкой
               echo 'Ошибка запроса: ' . mysqli_error($connection) . '<br>';
               echo 'Код ошибки: ' . mysqli_errno($connection);
            }else{ // запрос успешно выполнился
               while($row = $result->fetch_assoc()){
                  // обрабатываем полученные данные
               }
            }
         // закрываем соединение с базой
            mysqli_close($connection);
      }
?>

В этом примере есть две функции, которые работают с ошибками базы. Функция mysqli_error возвращает описание ошибки запроса (на английском языке), а функция mysqli_errno возвращает числовой код ошибки, к примеру, «1193».

Обратите внимание, что все функции обработки ошибок в этой статье (mysqli_connect_error, mysqli_connect_errno, mysqli_error, mysqli_errno) возвращают информацию только о последней ошибке. Но ошибок может быть несколько.

Была ли статья полезной?

Была ли эта статья полезна?

Есть вопрос?

хостинг для сайтов

Закажите недорогой хостинг

Заказать

всего от 290 руб

Is there any way to capture these error in to log file … ?

Yes. All PHP errors and warnings are written to the web server’s error log file, so there’s nothing else you need to do — it’s already being done.

To answer the second part of your question, if you don’t want the raw error message displayed on the screen, you can prevent this in one of two ways:

  1. Use the @ symbol in front of your function call — ie $db = @mysql_connect(...);. This will turn error reporting off just for that specific function call. It’s generally considered to be a bad idea to over-use this technique, but it is a legitimate thing to do occasionally.

  2. The better option may be to turn the global error reporting flag off, either in your PHP.ini, in your local .htaccess file, or using ini_set() within the program.

Typically, error reporting on the web page should only be used while you’re developing the site. Once the site goes live, you should turn error reporting, so that you don’t get PHP errors showing up in random places in your carefully constructed page layout in front of your customers. Any errors that occur will still be written to the server error log, but won’t be displayed on the page.

For MySQL errors, such as the one you’ve got, you can still get at the error itself within the program by using the mysql_error() function. This will contain the details of the last error to occurr, so you can programmaticaly check for it and report a sensible error message.

В этой статье мы расскажем вам, как использовать обработчик MySQL для обработки исключений или ошибок, возникающих в хранимых процедурах.

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

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

  • Объявление обработчика
  • Примеры обработки ошибок MySQL
  • Пример обработчика MySQL в хранимых процедурах
    • Приоритет обработчиков MySQL
    • Использование проименованных условий ошибки

Чтобы объявить обработчик мы используем оператор DECLARE HANDLER:

DECLARE action HANDLER FOR condition_value statement;

Если значение условия совпадает со значением condition_value, MySQL выполнит оператор statement и продолжит или завершит текущий блок кода, исходя из значения action.

action может принимать следующие значения:

  • CONTINUE: исполнение блокированного кода (BEGIN … END) продолжается;
  • EXIT: выполнение блокированного кода, в котором был объявлен обработчик, завершается.

condition_value задает конкретное условие или класс условия, которые активируют обработчик.

condition_value может принимать одно из следующих значений:

  • код ошибки MySQL;
  • стандартное значение SQLSTATE. Или это может быть условие SQLWARNING, NOTFOUND или SQLEXCEPTION, которое является сокращением для класса значений SQLSTATE. Условие NOTFOUND используется для курсора или оператора SELECT INTO variable_list;
  • название условия, связанного либо с кодом ошибки MySQL, либо со значением SQLSTATE.

В качестве statement может использоваться простой оператор или составной оператор, вшитый с помощью ключевых слов BEGIN и END.

Давайте рассмотрим несколько примеров объявления обработчиков.

Обработчик, приведенный ниже, означает: когда происходит ошибка, устанавливается значение переменной has_error 1 и выполнение продолжается:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1;

Ниже приводится другой обработчик, который означает, что в случае возникновении любой ошибки, производится откат предыдущей операции, выдается сообщение об ошибке и осуществляется выход из текущего блока кода.

Если вы объявляете его внутри блока BEGIN END хранимой процедуры, он немедленно завершает хранимую процедуру:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'An error has occurred, operation rollbacked and the stored procedure was terminated';
END;

Если строк для вывода больше нет, для вариантов cursor или оператора SELECT INTO, значение переменной no_row_found устанавливается равным 1 и продолжается исполнение:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_row_found = 1;

При возникновении ошибки дублирования ключа, выдается ошибка MySQL 1062. Следующий обработчик выдает сообщение об ошибке и продолжает выполнение:

DECLARE CONTINUE HANDLER FOR 1062
SELECT 'Error, duplicate key occurred';

Во-первых, для демонстрации мы создаем новую таблицу с именем article_tags:

CREATE TABLE article_tags(
    article_id INT,
    tag_id     INT,
    PRIMARY KEY(article_id,tag_id)
);

В таблице article_tags хранятся связи между статьями и тегами. К каждой статье может относиться несколько тегов и наоборот.

Для простоты, мы не будем создавать таблицы articles и tags, а также внешние ключи в таблице article_tags.

Во-вторых, мы создаем хранимую процедуру, которая вставляет пару идентификаторов статьи и тега в таблицу article_tags:

DELIMITER $$
 
CREATE PROCEDURE insert_article_tags(IN article_id INT, IN tag_id INT)
BEGIN
 
    DECLARE CONTINUE HANDLER FOR 1062
    SELECT CONCAT('duplicate keys (',article_id,',',tag_id,') found') AS msg;
 
    -- insert a new record into article_tags
    INSERT INTO article_tags(article_id,tag_id)
    VALUES(article_id,tag_id);
 
    -- return tag count for the article
    SELECT COUNT(*) FROM article_tags;
END

В-третьих, для статьи 1 мы добавляем идентификаторы тега 1, 2 и 3, с помощью вызова хранимой процедуры insert_article_tags:

CALL insert_article_tags(1,1);
CALL insert_article_tags(1,2);
CALL insert_article_tags(1,3);

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

CALL insert_article_tags(1,3);

Мы получили сообщение об ошибке. Однако, поскольку мы объявили тип обработчика CONTINUE, хранимая процедура продолжает исполняться.

В результате, мы все равно получили список тегов для статьи:

Пример обработчика MySQL в хранимых процедурах

Если мы в объявлении обработчика изменим команду CONTINUE на EXIT, мы получим только сообщение об ошибке:

DELIMITER $$
 
CREATE PROCEDURE insert_article_tags_2(IN article_id INT, IN tag_id INT)
BEGIN
 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    SELECT 'SQLException invoked';
 
    DECLARE EXIT HANDLER FOR 1062 
        SELECT 'MySQL error code 1062 invoked';
 
    DECLARE EXIT HANDLER FOR SQLSTATE '23000'
    SELECT 'SQLSTATE 23000 invoked';
 
    -- insert a new record into article_tags
    INSERT INTO article_tags(article_id,tag_id)
       VALUES(article_id,tag_id);
 
    -- return tag count for the article
    SELECT COUNT(*) FROM article_tags;
END

Теперь, мы можем попробовать добавить дубликат ключа, чтобы увидеть результат:

CALL insert_article_tags_2(1,3);

Пример обработчика MySQL в хранимых процедурах - 2

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

Ошибка всегда обозначается одним из кодов ошибки MySQL, так что MySQL в этом плане имеет возможность четко их идентифицировать.

Обозначения SQLSTATE для многих кодов ошибок MySQL менее специфичны. SQLEXCPETION или SQLWARNING представляют собой сокращения класса значений SQLSTATES, поэтому они имеют общий характер.

На основании правил приоритета обработчиков обработчик кода ошибки MySQL, обработчик SQLSTATE и обработчик SQLEXCEPTION имеют приоритеты один, два и три соответственно.

Предположим, что в хранимой процедуре insert_article_tags_3 мы объявляем три обработчика:

DELIMITER $$
 
CREATE PROCEDURE insert_article_tags_3(IN article_id INT, IN tag_id INT)
BEGIN
 
    DECLARE EXIT HANDLER FOR 1062 SELECT 'Duplicate keys error encountered';
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT 'SQLException encountered';
    DECLARE EXIT HANDLER FOR SQLSTATE '23000' SELECT 'SQLSTATE 23000';
 
    -- insert a new record into article_tags
    INSERT INTO article_tags(article_id,tag_id)
    VALUES(article_id,tag_id);
 
    -- return tag count for the article
    SELECT COUNT(*) FROM article_tags;
END

Теперь мы пробуем добавить в таблицу article_tags дубликат ключа через вызов хранимой процедуры:

CALL insert_article_tags_3(1,3);

Как видите, вызывается обработчик кода ошибки MySQL:

Приоритет обработчиков MySQL

Начинаем с объявления обработчика ошибки:

DECLARE EXIT HANDLER FOR 1051 SELECT 'Please create table abc first';
SELECT * FROM abc;

Что означает код 1051? Представьте, что у вас есть большая хранимая процедура, по всему коду которой разбросаны некорректные значения. Настоящий кошмар для разработчиков обслуживания.

К счастью, MySQL предоставляет нам оператор DECLARE CONDITION, который объявляет проименованное условие ошибки, связанное с условием.

Синтаксис оператора DECLARE CONDITION выглядит следующим образом:

DECLARE condition_name CONDITION FOR condition_value;

condition_value может представлять собой код ошибки MySQL, например 1015, или значение SQLSTATE. condition_value представляется с помощью condition_name.

После объявления вы можете обращаться к condition_name вместо condition_value.

Таким образом, мы можем переписать код, приведенный выше, следующим образом:

DECLARE table_not_found CONDITION for 1051;
DECLARE EXIT HANDLER FOR  table_not_found SELECT 'Please create table abc first';
SELECT * FROM abc;

Этот код, очевидно, более удобен для чтения, нежели предыдущий. Отметим, что объявление условия должно размещаться перед объявлением обработчика или объявлением курсора.

Подключения и управление подключениями

Соединения устанавливаются автоматически при создании объекта PDO от
его базового класса. Не имеет значения, какой драйвер вы хотите использовать;
вы всегда используете имя базового класса. Конструктор класса принимает
аргументы для задания источника данных (DSN), а также необязательные
имя пользователя и пароль (если есть).

Пример #1 Подключение к MySQL


<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

В случае возникновения ошибки при подключении будет выброшено исключение
PDOException. Его можно перехватить и обработать, либо
оставить на откуп глобальному обработчику ошибок, который вы задали
функцией set_exception_handler().

Пример #2 Обработка ошибок подключения


<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
foreach(
$dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
$dbh = null;
} catch (
PDOException $e) {
print
"Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

Внимание

Если ваше приложение не перехватывает исключение PDO конструктора, движок
zend выполнит стандартные операции для завершения работы скрипта и вывода
обратной трассировки. В этой трассировке будет содержаться детальная
информация о соединении с базой данных, включая имя пользователя и пароль.
Ответственность за перехват исключений лежит на вас. Перехватить исключение
можно явно (с помощью выражения catch), либо неявно, задав
глобальный обработчик ошибок функцией
set_exception_handler().

При успешном подключении к базе данных в скрипт будет возвращён созданный
объект PDO. Соединение остаётся активным на протяжении всего времени жизни
объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления
всех ссылок на него (этого можно добиться, присваивая null всем переменным,
указывающим на объект). Если не сделать этого явно, PHP автоматически
закроет соединение по окончании работы скрипта.

Замечание:

Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement
или другие переменные, ссылающиеся на него), они также должны быть удалены
(например, присвоением null переменной, ссылающейся на PDOStatement).

Пример #3 Закрытие соединения


<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// здесь мы каким-то образом используем соединение
$sth = $dbh->query('SELECT * FROM foo');// соединение больше не нужно, закрываем
$sth = null;
$dbh = null;
?>

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

Пример #4 Постоянные соединения


<?php
$dbh
= new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>

Значение параметра PDO::ATTR_PERSISTENT преобразуется в
логическое значение (bool) (включить/отключить постоянные подключения),
если это не числовая строка (string), которая в этом случае позволяет использовать несколько пулов постоянных подключений.
Это полезно, если разные соединения используют несовместимые настройки,
например, разные значения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.

Замечание:

Чтобы использовать постоянные соединения, необходимо добавить константу
PDO::ATTR_PERSISTENT в массив параметров драйвера,
который передаётся конструктору PDO. Если просто задать этот атрибут
функцией PDO::setAttribute() уже после создания объекта,
драйвер не будет использовать постоянные соединения.

Замечание:

Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают
объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows
точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных
соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям
текущего процесса; если PDO сам кеширует соединение, то это соединение
будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль
будет создавать дополнительные подключения для своих нужд.

There are no user contributed notes for this page.

Вернуться к: PDO

Соединения устанавливаются автоматически при создании объекта PDO от
его базового класса. Не имеет значения, какой драйвер вы хотите использовать;
все что требуется, это имя базового класса. Конструктор класса принимает
аргументы для задания источника данных (DSN), а также необязательные
имя пользователя и пароль (если есть).

Пример #1 Подключение к MySQL


<?php
$dbh 
= new PDO('mysql:host=localhost;dbname=test'$user$pass);
?>

В случае ошибки при подключении будет выброшено исключение
PDOException. Его можно перехватить и обработать, либо
оставить на откуп глобальному обработчику ошибок, который вы задали
функцией set_exception_handler().

Пример #2 Обработка ошибок подключения


<?php
try {
    
$dbh = new PDO('mysql:host=localhost;dbname=test'$user$pass);
    foreach(
$dbh->query('SELECT * from FOO') as $row) {
        
print_r($row);
    }
    
$dbh null;
} catch (
PDOException $e) {
    print 
"Error!: " $e->getMessage() . "<br/>";
    die();
}
?>

Внимание

Если ваше приложение не перехватывает исключение PDO конструктора, движок
zend выполнит стандартные операции для завершения работы скрипта и вывода
обратной трассировки. В этой трассировке будет содержаться детальная
информация о соединении с базой данных, включая имя пользователя и пароль.
Ответственность за перехват исключений лежит на вас. Перехватить исключение
можно явно (с помощью выражения catch), либо неявно, задав
глобальный обработчик ошибок функцией
set_exception_handler().

При успешном подключении к базе данных в скрипт будет возвращен созданный
PDO объект. Соединение остается активным на протяжении всего времени жизни
объекта. Чтобы закрыть соединение, необходимо уничтожить объект путем удаления
всех ссылок на него (этого можно добиться, присваивая NULL всем переменным,
указывающим на объект). Если не сделать этого явно, PHP автоматически
закроет соединение по окончании работы скрипта.

Пример #3 Закрытие соединения


<?php
$dbh 
= new PDO('mysql:host=localhost;dbname=test'$user$pass);
// здесь мы каким-то образом используем соединение

// соединение больше не нужно, закрываем

$dbh null;
?>

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

Пример #4 Постоянные соединения


<?php
$dbh 
= new PDO('mysql:host=localhost;dbname=test'$user$pass, array(
    
PDO::ATTR_PERSISTENT => true
));
?>

Замечание:

Чтобы использовать постоянные соединения, необходимо добавить константу
PDO::ATTR_PERSISTENT в массив параметров драйвера,
который передается конструктору PDO. Если просто задать этот атрибут
функцией PDO::setAttribute() уже после создания объекта,
драйвер не будет использовать постоянные соединения.

Замечание:

Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают
объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows
точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных
соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям
текущего процесса; если PDO сам кэширует соединение, то это соединение
будет недоступно другим модулям и не попадет в пул. В результате каждый модуль
будет создавать дополнительные подключения для своих нужд.

Вернуться к: PDO

First of all, it’s a good thing that you asked, only a few do care about handling errors.

Unfortunately, the way you choose is frowned upon, in both cases. Luckily, I’ve got a couple articles that cover your question in every possible detail:

  • a generalized one, PHP error reportig will show you the right approach for handling errors in general
  • a direct answer to your question, How to connect to MySQL using PDO would provide a ready-made connection code

Error handling

The idea here is that a module or a part of code should never treat errors by itself. This function should be delegated to the application level. Your database interaction code should only raise an error, which would be handled according to the site-wide configuration elsewhere.

So your goal with PDO is just to make it throw an error (in the form of Exception). As to how it will be handled should be defined elsewhere. It will make your error reporting uniform and both programmer- and user-friendly.

Connection

Another issue is a function.

I use it as a function and call it always when I need a database connection.

If you call it more than once, it will create many connections to the database server and this number is not infinite. A connection should be made only once. So in its current form this function is rather useless. Given you have to create a $pdo variable only once, an include file would serve as well.

So let’s create it

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
     throw new PDOException($e->getMessage(), (int)$e->getCode());
}

Handling query errors.

Like it was said above, do not handle errors in your code. We already configured PDO to throw exceptions in case of error, that’s all. So just write your query execution code right away, without any conditions:

$stmt = $pdo->prepare("SELECT a FROM b WHERE c = :c")) {
$stmt->execute(array(':c' => $c));
$result = $stmt->fetch();
echo 'All fine.';

First of all, it’s a good thing that you asked, only a few do care about handling errors.

Unfortunately, the way you choose is frowned upon, in both cases. Luckily, I’ve got a couple articles that cover your question in every possible detail:

  • a generalized one, PHP error reportig will show you the right approach for handling errors in general
  • a direct answer to your question, How to connect to MySQL using PDO would provide a ready-made connection code

Error handling

The idea here is that a module or a part of code should never treat errors by itself. This function should be delegated to the application level. Your database interaction code should only raise an error, which would be handled according to the site-wide configuration elsewhere.

So your goal with PDO is just to make it throw an error (in the form of Exception). As to how it will be handled should be defined elsewhere. It will make your error reporting uniform and both programmer- and user-friendly.

Connection

Another issue is a function.

I use it as a function and call it always when I need a database connection.

If you call it more than once, it will create many connections to the database server and this number is not infinite. A connection should be made only once. So in its current form this function is rather useless. Given you have to create a $pdo variable only once, an include file would serve as well.

So let’s create it

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
     throw new PDOException($e->getMessage(), (int)$e->getCode());
}

Handling query errors.

Like it was said above, do not handle errors in your code. We already configured PDO to throw exceptions in case of error, that’s all. So just write your query execution code right away, without any conditions:

$stmt = $pdo->prepare("SELECT a FROM b WHERE c = :c")) {
$stmt->execute(array(':c' => $c));
$result = $stmt->fetch();
echo 'All fine.';

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Обработка ошибок на стороне клиента
  • Обработка ошибок запросов mysql