Пожалуйста. Чтобы добавить, fetch () не генерирует исключение независимо от того, какой PDO :: ATTR_ERRMOD используется. Он всегда вернет ложь при неудаче. Даже если вы поместите свой stmt в блок try / catch и после этого вызовете fetch (), он все равно вернет false. fetchAll () также будет возвращать false при сбое, но я никогда не получал его, чтобы возвращать false. Даже в примере этого комментария он вернет пустой массив.

етствует документам php, методу PDOвыборки () возвращает значениеFALSE оба, когда записи не найденыА ТАКЖЕ при сбое (например, когда что-то идет не так в отношении доступа к базе данных).

Предположим, я настроил систему отчетов об ошибках PHP, чтобы она генерировала исключения при сбое:

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

Мне нужен случай, ситуация, в которойfetch() Метод сгенерирует исключение. Почему? Потому что я хочу проверить, чтобы быть на 100% уверенным, чтоfetch() выдает исключение при неудаче и не просто возвращаетFALSE на провал.

Если бы это было так, то я бы действительно рассмотрелFALSE вернулсяfetch() в результате не найти никаких записей в таблице БД.

Итак, мой вопрос: знаете ли вы способ имитации ситуации отказа дляfetch() мето, D?

Спасибо.

ПостскриптумОтвет на мой вопрос поможет мне найти ответ на другой мой вопрос:PHP PDO fetch возвращает FALSE, если не найдено ни одной записи И при ошибке

Изменить 1:

Я также подготовил пример, чтобы показать, как я обрабатываю исключения. Это простой SQL-запрос, извлекающий пользователя изusers Таблица:

<?php

// Activate error reporting.
error_reporting(E_ALL);
ini_set('display_errors', 1);

try {

    // Create a PDO instance as db connection to a MySQL db.
    $connection = new PDO(
            'mysql:host=localhost;port=3306;dbname=mydb;charset=utf8'
            , 'myuser'
            , 'mypass'
            , array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => FALSE,
        PDO::ATTR_PERSISTENT => TRUE
            )
    );

    // Define the sql statement.
    $sql = 'SELECT * FROM users WHERE name = :name';

    /*
     * Prepare and validate the sql statement.
     * 
     * --------------------------------------------------------------------------------
     * If the database server cannot successfully prepare the statement, PDO::prepare() 
     * returns FALSE or emits PDOException (depending on error handling settings).
     * --------------------------------------------------------------------------------
     */
    $statement = $connection->prepare($sql);

    if (!$statement) {
        throw new UnexpectedValueException('The sql statement could not be prepared!');
    }

    // Bind the input parameter to the prepared statement.
    $bound = $statement->bindValue(':name', 'Sarah', PDO::PARAM_STR);

    // Validate the binding of the input parameter.
    if (!$bound) {
        throw new UnexpectedValueException('An input parameter can not be bound!');
    }

    /*
     * Execute the prepared statement.
     * 
     * ------------------------------------------------------------------
     * PDOStatement::execute returns TRUE on success or FALSE on failure.
     * ------------------------------------------------------------------
     */
    $executed = $statement->execute();

    if (!$executed) {
        throw new UnexpectedValueException('The prepared statement can not be executed!');
    }

    /*
     * Fetch and validate the result set.
     * 
     * =========================================================
     * Note:
     * =========================================================
     * PDOStatement::fetch returns FALSE not only on failure,
     * but ALSO when no record is found!
     * 
     * Instead, PDOStatement::fetchAll returns FALSE on failure,
     * but an empty array if no record is found. This is the
     * natural, desired behaviour.
     * =========================================================
     */
    $resultset = $statement->fetch(PDO::FETCH_ASSOC);

    if ($resultset === FALSE) {
        throw new UnexpectedValueException('Fetching data failed!');
    }

    // Display the result set.
    var_dump($resultset);
    echo '<pre>' . print_r($resultset, TRUE) . '</pre>';

    // Close connection.
    $connection = NULL;
} catch (PDOException $exc) {
    echo '<pre>' . print_r($exc, TRUE) . '</pre>';
    exit();
} catch (Exception $exc) {
    echo '<pre>' . print_r($exc, TRUE) . '</pre>';
    exit();
}

Я использовал следующий синтаксис создания таблицы:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8;

и следующие значения таблицы:

INSERT INTO `users` (`id`, `name`)
VALUES
    (1,'Sarah'),
    (2,'John');

Итак, таблица выглядит так:

id  name
--------
1   Sarah
2   John

Ответы на вопрос(1)

Ваш ответ на вопрос