расширение класса PDO: почему метод возвращает 0 вместо сообщения об ошибке? - PullRequest
0 голосов
/ 03 марта 2011

После сообщения мне кажется, что мне удалось расширить класс 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! Зачем?? Как я могу это исправить?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Поскольку PDOStatement::execute не throw, он возвращает false только в случае сбоя.Следовательно, ваш код никогда не входит в блок catch.Должно быть больше в соответствии с этим:

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

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

return $stmt->rowCount();
0 голосов
/ 03 марта 2011

PDOStatement::execute возвращает false, если запрос приводит к ошибке, исключение не выдается. Вам, вероятно, следует написать код, чтобы проверить это возвращаемое значение, если вы хотите что-то сделать с ошибкой.

...