2012-06-14 10 views
10

Estoy trabajando en el aprendizaje de PDO y haciendo la transferencia desde las funciones PHP MySQL estándar. Sin embargo, tengo una pregunta. Con respecto a los bloques try {}, ¿qué deberían incluir exactamente y qué deberían salir de él?MySQL PDO: ¿qué debería estar dentro de try {block}?

¿Debería todo lo que utiliza $sth-> ... estar dentro de try {}? ¿Debería ser solo desde el momento en que la declaración se prepara por completo hasta cuándo se ejecuta? Incluso menos que eso?

Cualquier ayuda sería muy apreciada. :)

Aquí hay un método de ejemplo que tengo en una clase. ¿Está organizado correctamente? Observe cómo puse todo dentro de try {}. ¿Es eso incorrecto? Me parece incorrecto, pero no estoy seguro de cómo debería cambiarlo.

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

¡Estaba haciendo la misma pregunta en el trabajo el otro día! ¿Todo va o no? – Drewdin

+0

Muy buena pregunta. Ese tema es algo que muchos desarrolladores no saben –

Respuesta

8

El intento de captura debe ser fuera de la función.

<?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); 
} 

No maneje las excepciones dentro de los métodos. Usted intente el método y capture la excepción resultante si ocurre.

+0

Hmm, está bien, eso tiene sentido en este caso. ¿Qué pasa cuando no está dentro de una función? En otro script que tengo, tengo varios bucles y condicionales anidados, etcétera, y tiene varios cientos de líneas de largo. En esa situación, ¿envolvería todo el bloque de código en un 'try {}'? En otras palabras, ¿debería TODO estar dentro de 'try {}' siempre - con "todo" siendo algo que haga uso de '$ dbh' o' $ sth'? – Nathanael

+0

¿Qué sucede si el método arroja algo más que una 'PDOException'? – Mike

+0

@Mike: Capturas una 'Excepción' también, que es del tipo genérico y captará todas las excepciones. Puede atrapar múltiples excepciones. –

Cuestiones relacionadas