0

ここでの投稿をフォローアップすると、pdoクラスを拡張できたようです。

class database_extended extends PDO
{

    #make a connection
    public function __construct($dsn,$username,$password)
    {
        try 
        { 
            parent::__construct($dsn,$username,$password);
            //$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            self::get_error($e);
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        try 
        {
            # create a prepared statement
            $stmt = parent::prepare($query);

            # execute query 
            $stmt->execute();

            # return the result
            return $stmt->rowCount();
        } 
        catch (PDOException $e) 
        {
            # call the get_error function
            self::get_error($e);
        }
    }

    # display error
    public function get_error($e) 
    {
        $this->connection = null;
        die($e->getMessage());
    }

    # closes the database connection when object is destroyed.
    public function __destruct()
    {

    }
}

しかし、それは完全には正しくないようです-意図的にクエリを間違えてメソッドをテストしたnum_rowsので、このメソッドはエラーメッセージを返す可能性があります。

# the host used to access DB
define('DB_HOST', 'localhost');

# the username used to access DB
define('DB_USER', 'root');

# the password for the username
define('DB_PASS', 'xx');

# the name of your databse 
define('DB_NAME', 'xx_2011');

# the data source name
define('DSN', 'mysql:dbname='.DB_NAME.';host='.DB_HOST);

include 'class_database.php';

$connection = new database_extended(DSN,DB_USER,DB_PASS);

$sql = "
    SELECT *
    FROM table_not_exist
    ORDER BY cnt_id DESC
    ";

echo $connection->num_rows($sql);

戻るはずです、

SQLSTATE [42S02]:ベーステーブルまたはビューが見つかりません:1146テーブル'xx_2011.table_not_exist'が存在しません

しかし、0代わりにそれが返されます!なぜ??どうすれば修正できますか?

ありがとう。

4

2 に答える 2

2

PDOStatement::executeではないため、失敗したthrow場合にのみ戻りfalseます。したがって、コードがcatchブロックに入ることはありません。これに沿ったものにする必要があります:

$stmt = parent::prepare($query);

if (!$stmt->execute()) {
    self::get_error();
}

return $stmt->rowCount();
于 2011-03-03T02:44:32.377 に答える
0

PDOStatement::executeクエリの結果がエラーの場合は false を返しますが、例外はスローされません。エラーで何かをしたい場合は、おそらくその戻り値をチェックするコードを書く必要があります。

于 2011-03-03T02:44:21.870 に答える