扩展PDO类 [英] extending PDO class

查看:62
本文介绍了扩展PDO类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是到目前为止我得到的数据库连接类,但是我将通过扩展PDO类本身来改进它,

Below is the db connection class I came out with so far, but I am going to improve it by extending the PDO class itself,

<?php
class database
{
    protected $connection = null;

    #make a connection
    public function __construct($hostname,$dbname,$username,$password)
    {
        try 
        {
            # MySQL with PDO_MYSQL  
            $this->connection = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        }
        catch (PDOException $e) 
        {
            $this->connection = null;
            die($e->getMessage());
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        # create a prepared statement
        $stmt = $this->connection->prepare($query);

        if($stmt) 
        {
            # execute query 
            $stmt->execute();

            return $stmt->rowCount();
        } 
        else
        {
            return self::get_error();
        }
    }

    #display error
    public function get_error() 
    {
        $this->connection->errorInfo();
    }

    # closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this->connection = null;
    }
}
?>

扩展类

class database extends PDO
{

    #make a connection
    public function __construct($hostname,$dbname,$username,$password)
    {
        parent::__construct($hostname,$dbname,$username,$password);

        try 
        { 
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        }
        catch (PDOException $e) 
        {
            die($e->getMessage());
        }
    }

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

        if($stmt) 
        {
            # execute query 
            $stmt->execute();

            return $stmt->rowCount();
        } 
        else
        {
            return self::get_error();
        }
    }

    #display error
    public function get_error() 
    {
        $this->connection->errorInfo();
    }

    # closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this->connection = null;
    }
}

这就是我实例化类的方式,

This is how I instantiate the class,

# 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', 'xxx');

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

include 'class_database.php';

$connection = new database(DB_HOST,DB_NAME,DB_USER,DB_PASS);
$sql = "
    SELECT *
    FROM root_contacts_cfm
    ORDER BY cnt_id DESC
    ";

$connection->num_rows($sql);

但是当我调用这个扩展的pdo类时出现错误,

But I have errors when I call this extended pdo class,

警告:PDO :: __ construct()预期 参数4为数组,给定字符串 在C:\ wamp \ www \ xx \ class_database.php中 在第XX行

Warning: PDO::__construct() expects parameter 4 to be array, string given in C:\wamp\www\xx\class_database.php on line xx

致命错误:调用成员函数 setAttribute()在非对象中 C:\ wamp \ www \ xx \ class_database.php在 xx行

Fatal error: Call to a member function setAttribute() on a non-object in C:\wamp\www\xx\class_database.php on line xx

我已经在网上进行了一些研究,发现了扩展pdo的基本结构,但我不理解...

I have done some research online, I found this basic structure of extending pdo but I dont understand it...

class myPDO extends PDO
{
   public function __construct($dsn, 
                               $username=null, 
                               $password=null, 
                               $driver_options=null)
   {
      parent::__construct($dsn, $username, $password, $driver_options);
   }

   public function query($query)
   {
      $result = parent::query($query);
      // do other stuff you want to do here, then...
      return($result);
   }
}

$ds n变量的作用是什么?如何将$hostname变量传递给扩展的pdo类?

What is $dsn variable for? How can I pass my $hostname variable into extended pdo class?

另一个问题: 如何制作扩展pdo类中显示错误的方法? 如何在扩展的pdo类中关闭连接?

Another questions: How can I make a method for displaying error in the extended pdo class? How can I close the connection in the extended pdo class?

从mysqli迁移到pdo是如此困难!

It is so difficult to move from mysqli to pdo!

谢谢.

推荐答案

$ dsn是数据源名称.它为您处理您的主机名.您可以这样使用它:

$dsn is data source name. It handles your hostname for you. You use it like this:

$dsn = 'mysql:dbname=YOUR_DB_NAME;host=YOUR_HOSTNAME'

使用$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);行,您设置了发生错误时引发的异常(我喜欢),因此在扩展类中,您可以处理异常处理程序中的错误.如果您在扩展的PDO类中有一个名为getAssoc的方法,则它将看起来像这样:

With the line $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); You have set exceptions to be raised when errors occur (which I like), so in your extended class you can handle errors in exception handlers. If you had a method called getAssoc in your extended PDO class then it would look like this:

/// Get an associative array of results for the sql.
public function getAssoc($sql, $params=array())
{
   try
   {
      $stmt = $this->prepare($sql);
      $params = is_array($params) ? $params : array($params);
      $stmt->execute($params);

      return $stmt->fetchAll(PDO::FETCH_ASSOC);
   }
   catch (Exception $e)
   {
      // Echo the error or Re-throw it to catch it higher up where you have more
      // information on where it occurred in your program.
      // e.g echo 'Error: ' . $e->getMessage(); 

      throw new Exception(
            __METHOD__ . 'Exception Raised for sql: ' . var_export($sql, true) .
            ' Params: ' . var_export($params, true) .
            ' Error_Info: ' . var_export($this->errorInfo(), true),
            0,
            $e);
   }
}

这篇关于扩展PDO类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆