2012-06-14 11 views
10

Quindi sto lavorando all'apprendimento di PDO e al trasferimento dalle funzioni standard MySQL di PHP. Tuttavia, ho una domanda. Per quanto riguarda i blocchi try {}, cosa dovrebbero essere esattamente in essi e cosa dovrebbe andare al di fuori di esso?MySQL DOP - Cosa dovrebbe esserci nel try {block}?

Tutto ciò che utilizza $sth-> ... deve essere all'interno di try {}? Dovrebbe essere solo dal momento in cui la dichiarazione viene preparata per la prima volta fino a quando viene eseguita? Ancora meno?

Qualsiasi aiuto sarebbe molto apprezzato. :)

Ecco un metodo di esempio che ho in una classe. È organizzato correttamente? Si noti come ho messo nel all'interno di try {}. È sbagliato? Mi sembra sbagliato, ma non sono sicuro di come dovrei 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

Stavo facendo la stessa domanda al lavoro l'altro giorno! Tutto va o no? – Drewdin

+0

Ottima domanda. Quell'argomento è qualcosa che molti sviluppatori non conoscono –

risposta

8

Il tentativo di cattura dovrebbe essere di fuori della funzione.

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

Non gestire le eccezioni all'interno dei metodi. Si provare il metodo e catturare l'eccezione risultante se ciò accade.

+0

Hmm, okay, questo ha senso in questo caso. Che dire quando non è all'interno di una funzione? In un altro script ho, ho diversi loop e condizioni nidificati, eccetera, ed è lunga diverse centinaia di righe. In quella situazione, avrei avvolto l'intero blocco di codice in un 'try {}'? In altre parole, dovrebbe TUTTO essere all'interno di 'try {}' always - con "everything" essere qualsiasi cosa che faccia uso di '$ dbh' o' $ sth'? – Nathanael

+0

Cosa succede se il metodo genera qualcosa di diverso da un 'PDOException'? – Mike

+0

@Mike: si cattura anche un 'Exception', che è il tipo generico e cattura tutti i tipi di eccezioni. È possibile rilevare più eccezioni. –

Problemi correlati