Вы ловите исключения PDO, но указали ли вы PDO на их выброс?
Чтобы сделать исключения исключения PDO, вы должны настроить PDO errmode. Обратите внимание, что установка этого режима в качестве опции подключения позволит PDO исключать исключения из ошибок соединения, что очень важно.
Итак, вот пример для создания соединения PDO правильный путь:
$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// other options
);
$pdo = new PDO($dsn, $user, $pass, $opt);
Подключение таким образом, вы всегда будете в курсе всех ошибок базы данных, произошла во время выполнения запроса. Обратите внимание, что вы должны уметь видеть ошибки PHP вообще. На живом сайте вы должны заглянуть в журналы ошибок, поэтому, настройки должны быть
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
в то время как на локальном сервере разработки это нормально, чтобы сделать ошибки на экране:
error_reporting(E_ALL);
ini_set('display_errors',1);
и, конечно, никогда не должен использовать оператор подавления ошибок (@
) перед вашими заявлениями PDO.
Кроме того, из-за многие плохие примеры, рассказывающих вам обернуть каждое утверждение PDO в try..catch
блок, я должен сделать отдельную заметку:
НЕ используйте try..catch оператора просто повторить ошибку сообщение. Исключение исключений для этой цели уже отлично, поскольку оно будет действовать точно так же, как и другие ошибки PHP, поэтому вы можете определить поведение, используя параметры сайта, поэтому будет иметь ваше сообщение об ошибке без этого бесполезного кода.Хотя безоговорочное эхо-сообщение об ошибке может выявить некоторую конфиденциальную информацию потенциальному злоумышленнику, все же запутать честного посетителя.
- A custom exception handler может быть добавлен позднее, но не требуется. Специально для новых пользователей рекомендуется использовать необработанные исключения, поскольку они чрезвычайно информативны, полезны и безопасны.
- Используйте
try..catch
, только если вы собираетесь справиться с самой ошибкой - скажем, откат транзакции.
Вы уверены, что ваше $ name существует в базе? Запрос обновления может преуспеть, но обновить 0 строк, если строки не соответствуют – Anigel
Да, я на 100% уверен, я даже скопировал имя пользователя непосредственно из select, чтобы убедиться, что я не печатаю ничего неправильно. – Tom
Итак, если вы откликните свой запрос и запустите его в командной строке или phpmyadmin, он работает? – Anigel