2013-07-31 2 views
0

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

У меня есть базовое заявление об обновлении PDO внутри публичной функции :

public function editRank($name, $rank){ 
$query = "UPDATE `chat_mod` SET `chat_mod_rank` = :rank WHERE `chat_mod_ign` = :username"; 
$prepare = $this->_db->prepare($query); 
$array = array(
    ':rank'  => $rank, 
    ':username' => $name 
); 

try { 
    $prepare->execute($array); 
} catch (PDOException $e){ 
    echo 'Error: ' . $e->getMessage(); 
    return false; 
} 
return true; // If no PDO Exception is thrown.. 

}

исключение не отбрасывается, так что функция всегда возвращает истину; но строки не обновляются. Да, я проверил, что строки названы правильно, а значения не являются нулями.

Thanks, Tom.

P.S Другие запросы, такие как Select, Add & Удалить работу отлично.

+0

Вы уверены, что ваше $ name существует в базе? Запрос обновления может преуспеть, но обновить 0 строк, если строки не соответствуют – Anigel

+0

Да, я на 100% уверен, я даже скопировал имя пользователя непосредственно из select, чтобы убедиться, что я не печатаю ничего неправильно. – Tom

+0

Итак, если вы откликните свой запрос и запустите его в командной строке или phpmyadmin, он работает? – Anigel

ответ

2

Вы ловите исключения 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, только если вы собираетесь справиться с самой ошибкой - скажем, откат транзакции.
Смежные вопросы