0

これは私のコードです:

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

そして今、ここで getAllUsers 関数を呼び出しています。

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

エラーが発生することを除いて:

警告: foreach() に無効な引数が指定されました

私がやっているvar_dumpときself::getbool(false)

誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

7

PDO :: queryは、クエリをデータベースに送信して有効な応答を返すことに成功した場合にのみPDOStatementオブジェクトを返します(つまり、ドライバーからSQLエラーが返されなかった場合)。ただし、失敗した場合はを返します。したがって、エラーを処理するには、これを確認する必要があります。また、オプションでPDOを例外モードにして、エラーが発生したときにいつでも例外をスローするようにすることができます。そうすれば、try / catchを使用して、PDOオブジェクトを呼び出すたびにエラーを処理できます。以下の例を参照してください...false

PDOのデフォルトのエラーモード(サイレント)の場合:

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

例外モードのPDOの場合:

/* 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();
}
于 2012-12-15T20:55:57.537 に答える