2012-06-14 5 views
10

So arbeite ich an PDO Lernen und macht die Übertragung von den Standard-PHP-MySQL-Funktionen. Ich habe jedoch eine Frage. In Bezug auf die try {} Blöcke, was genau sollte in ihnen sein, und was sollte außerhalb gehen?MySQL PDO - Was sollte in der try {Block} sein?

Should alles, was $sth-> ... innerhalb try {} sein verwendet? Sollte es nur von der Vorbereitung der Anweisung bis hin zur Ausführung sein? Noch weniger als das?

Jede Hilfe würde sehr geschätzt werden. :)

Hier ist ein Beispiel Methode, die ich in einer Klasse haben. Ist es richtig organisiert? Beachten Sie, wie ich alles innen try {} setzen. Ist das falsch? Es fühlt sich falsch an, aber ich bin mir nicht sicher, wie ich es ändern sollte.

protected function authorized() 
{ 
    try 
    { 
     // Attempt to grab the user from the database. 
     $sth = $dbh->prepare(" 
      SELECT COUNT(*) AS num_rows 
      FROM users 
      WHERE user_id = :user_id 
      "); 

     $sth->bindParam(':user_id', $this->user_id); 
     $sth->execute(); 

     // Check if user exists in database. 
     if ($sth->fetch()->num_rows > 0) 
     { 
      // User exists in database, and is therefore valid. 
      return TRUE; 
     } 
     else 
     { 
      // User does not exist in database, and is therefore invalid. 
      return FALSE; 
     } 
    } 
    catch (PDOException $e) 
    { 
     pdo_error($e); 
    } 
} 
+1

ich frage neulich diese gleiche Frage bei der Arbeit! Geht alles oder nicht? – Drewdin

+0

Sehr gute Frage. Dieses Thema ist etwas, das nicht viele Entwickler kennen –

Antwort

8

Der Versuch fangen sollte außerhalb der Funktion sein.

<?php 

protected function authorized() { 
    // Attempt to grab the user from the database. 
    $sth = $dbh->prepare(" 
      SELECT COUNT(*) AS num_rows 
      FROM users 
      WHERE user_id = :user_id 
      "); 

    $sth->bindParam(':user_id', $this->user_id); 
    $sth->execute(); 

    // Check if user exists in database. 
    if ($sth->fetch()->num_rows > 0) { 
     // User exists in database, and is therefore valid. 
     return TRUE; 
    } 
    else { 
     // User does not exist in database, and is therefore invalid. 
     return FALSE; 
    } 
} 

... 

try { 
    authorized() 
} 
catch (PDOException $e) { 
    pdo_error($e); 
} 

Behandeln Sie keine Ausnahmen innerhalb der Methoden. Sie versuchen die Methode und Fang die resultierende Ausnahme, wenn es passiert.

+0

Hmm, okay, das macht in diesem Fall Sinn. Was ist, wenn es nicht in einer Funktion ist? In einem anderen Skript, das ich habe, habe ich mehrere verschachtelte Schleifen und Bedingungen, und so weiter, und es ist mehrere hundert Zeilen lang. Würde ich in diesem Fall den gesamten Codeblock in ein "try {}'? Mit anderen Worten, sollte ALLES innerhalb des 'try {}' immer sein - wobei "alles" etwas ist, was "$ dbh" oder "$ sth" benutzt? – Nathanael

+0

Was passiert, wenn die Methode etwas anderes als eine 'PDOException' auslöst? – Mike

+0

@Mike: Sie fangen auch eine 'Exception', die der generische Typ ist und alle Ausnahmen abfangen wird. Sie können mehrere Ausnahmen erfassen. –

Verwandte Themen