2012-12-15 2 views
-1

Ceci est mon code:AOP objet vide

class DB { 
static $instance; 

function get() { 
    if (self::$instance === null) { 
     self::$instance = new PDO('mysql:host=localhost;dbname=forum', 'root', 'root'); 
    } 
    return self::$instance; 
} 

function getAllUsers() { 
    $users = array(); 
    $sql = "SELECT * FROM users"; 
    foreach (self::get()->query($sql) as $row) { 
     $users[] = new User($row); 
    } 
    return $users;  
} 
} 

Et maintenant, je vous appelle la fonction getAllUsers ici:

class App { 
function showUsers() { 
    $users = DB::getAllUsers(); 
} 

Sauf sa me donner une erreur:

Warning: Invalid argument supplied for foreach()

Quand je fais var_dump sur self::get im obtenir un bool(false)

que quelqu'un peut me dire ce que je fais mal?

+0

Je voudrais souligner que var_dump (self :: get()) affiche objet (AOP) # 2 (0) {} –

+0

Pourquoi n'êtes-vous pas [ 'essayer/catch'ing et déclencher des exceptions] (http://stackoverflow.com/questions/8343141/quoi-la-bonne-façon-d'utiliser-un-nouveau-pdo-dans-une-classe-contexte)? Vous ne donnez aucune route à votre classe pour échouer gracieusement ici. –

+0

Si vous appelez votre instance de classe en utilisant 'self :: get()', alors 'get()' devrait être déclaré 'static'. – Tchoupi

Répondre

7

PDO::query retourne un objet PDOStatementque si elle réussit à envoyer la requête à la base de données et récupérer une réponse valide (à savoir qu'il n'y avait pas d'erreurs SQL renvoyées par le pilote). Toutefois, dans le cas où il échoue, il retournera false. Donc vous devez vérifier cela afin de gérer les erreurs. En outre, vous pouvez éventuellement mettre PDO into Exception Mode pour qu'il lève une exception chaque fois qu'il rencontre une erreur. De cette façon, vous pouvez utiliser try/catch pour gérer les erreurs à chaque appel d'objets PDO. Voir l'exemple ci-dessous ...

Avec le mode d'erreur par défaut de PDO (silencieux):

if ($result = self::get()->query($sql)) { 
    /* Iterate here */ 
    foreach ($result as $row) { 
     /* Do whatever you want with $row */ 
    } 
} else { 
    /* Handle errors here */ 
    echo "There was an error with the query!"; 
    var_dump(self::get()->errorInfo()); 
} 

avec AOP en mode Exception:

/* Put PDO Into Exception Mode */ 
self::get()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    foreach (self::get()->query($sql) as $row) { 
     /* Do whatever you want with $row */ 
    } 
} catch(PDOException $e) { 
    /* If PDO fails we handle it here */ 
    echo "Your query failed: " . $e->getMessage(); 
} 
+0

'+ 1' pour les trois premières déclarations. Exactement mes pensées. ':)' –