Пожалуйста. Чтобы добавить, 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