2012-02-12 19 views
2

try catchブロックを使用しているときにPDOエラーをうまく処理するにはどうすればよいですか?PDOのtry-catchブロックの使用方法

現在、私はこのようなものがあります:

BlogModel.php

class BlogModel extends Model { 
     public function save($id, $value) { 
     $stmt = $this->getDb()->prepare('UPDATE setting SET name = :name WHERE id = :id'); 
     $stmt->bindParam(':id', $id); 
     $stmt->bindParam(':name', $values); 
     return ($stmt->execute() !== false) ? $id : false; 
     } 
    } 

ので、コントローラBlogController.phpで、私はこのようなものだろう:

<?php 
class Blog extends Controller { 

    public function comments() 
    { 
     $data = array(); 
     $model = new BlogModel; 

     if ($model->save(2,'test')) { 
       $data['result']['message'] = 'Settings saved'; 
       $data['result']['status'] = 'success'; 
     } else { 
       $data['result']['message'] = 'Could not save the settings'; 
       $data['result']['status'] = 'error'; 
     } 

     $view = new View("view.php", $data) 
     $view->render(); 
    } 
} 
?> 

これは私がif conditを使用してPDOエラーを処理する方法ですイオン。これをtry catchブロックに変換する適切な方法は何ですか?変数($data['result']['message']$data['result']['status'])を常にコーディングする必要はありません。

「スロー例外」をキャッチブロックに追加することは、どうにかできますか?

コントローラーにtry catchブロックがたくさんある場合は、見た目が乱雑になります。そうですか?

+0

ちょっと好奇心:このCakePHPですか?私は言うことができません。 –

+1

@SimpleCoder私が書いた自分のMVC;) –

+0

ああ、きちんとしている。私は、PDOの直接の使用は、ケーキのdbインターフェイスとは対照的に、それを与えているはずだと思います。 –

答えて

3

ここでの回答は間違っています。しかし実際には3つの組み合わせが本当の答えです。 CERADで言ったように あなたは間違いなく

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

を設定する必要があります。

これ以降、データベースに関するあらゆる問題については、PDOExceptionの例外を介してスローされます。あなたはただExceptionladarと言ったように自分自身を投げる必要はありません。なぜなら、それは役に立たないからです。ただ、LADARコードを取ると、

... 
$data = array(); 
$model = new BlogModel; 

    try{ 
     $model->save(2,'test'); 
     $data['result']['message'] = 'Settings saved'; 
     $data['result']['status'] = 'success'; 
    }catch(PDOException $e){ 
     $data['result']['message'] = 'Could not save the settings'; 
     $data['result']['status'] = 'error'; 
    } 

に変換し、自分で何かを捨ててはいけません。

次に、基本でリンクされたキャッチスクリプトを使用して、hereをもう一度見つけることができます。

これを組み合わせることで、柔軟性があり、きれいで簡単にデバッグできるようになり、すべてのエラーをキャッチできます。

3

何について:

class BlogModel extends Model { 
    public function save($id, $value) { 
    ... 
    if (!$stmt->execute()) { 
     throw new Exception($stmt->errorInfo()); 
    } 
    return $id; 

そして

... 
$data = array(); 
$model = new BlogModel; 

    try{ 
     $model->save(2,'test'); 
     $data['result']['message'] = 'Settings saved'; 
     $data['result']['status'] = 'success'; 
    }catch(Exception $e){ 
     $data['result']['message'] = 'Could not save the settings'; 
     $data['result']['status'] = 'error'; 
    } 
+0

実際に例を示していて、何かへのリンクを提供していないための+1 – cspray

+0

悪い例ではありません。 –

3

あなたはPDO自体が例外の代わりに、エラーがスローさせると考えたことがありますか?

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

コードが大幅に減少する可能性のあるPDOエラーを確認する必要がなくなりました。いくつかのtry/catchブロックを追加して、制約違反などから回復できる例外をキャッチすることができます。

残りの部分は、本当に例外的な例外をキャッチするために、フロントエンドコントローラのどこかで最高の試し/キャッチを使用してください。

私のアプローチの唯一の違いは、そのBlogModelであなただけではありません:

$stmt->execute(); 

ませチェックや他の何か。挿入が失敗した場合、PDOは例外をスローします。あなたのコントローラーでtry/catchを使用します。as shown by ladar

私の場合は、挿入が失敗しないとすれば、私はフロントコントローラーで一般的なtry/catchブロックを使用します考えられる各例外を手動で処理しようとする時間を費やします。

+0

一般的な要求の種類。エラーを生成する代わりに例外をスローするようにPDOに指示する方法を理解していますか?基本的には私の答えで示したsetAttributeメソッドを使用してください。そして、PDOが例外をスローすると、エラーを次のようなものからチェックする必要はなくなります:$ stmt-> execute(); – Cerad

関連する問題