如何扩展PHP PDO数据库连接类以执行查询

时间:2015-02-18 11:36:58

标签: php mysql pdo

到目前为止,这是我们的课程:

class DB {
    private $DBUser = 'xxx';
    private $DBPass = 'xxx';
    private $DBServer = 'xxx';
    private $DBName = 'xxx';
    public $sql;
    public $id;

    public function __construct($sql,$id){
        $this->sql = $sql;
        $this->id = $id;
    } //end variables

    public function select() {
        try {  
            $strDSN = "mysql:host=$this->DBServer;dbname=$this->DBName;";  
            $username = $this->DBUser;
            $pass = $this->DBPass;
            $conn = new PDO($strDSN, $username, $pass);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            /*return $conn;*/

            $stmt = $conn->prepare($this->sql);
            $id = $this->id;
            $stmt->execute(array('id'=>$id));
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $result;

         }   
        catch (PDOException $e) {  
            echo 'Error: ' . $e->getMessage();   
        }  
    } //end method

} //end class

我们用它来称呼它:

$db = new DB;
$result = $db->select('SELECT * FROM tbl_xxx WHERE myid = :id',$_GET['id']);

但我收到以下错误:

  

警告:缺少DB :: __ construct()的参数1警告:缺少   DB :: __ construct()

的参数2

我确定答案很简单,但我看不清楚。我在这里想念的是什么?

1 个答案:

答案 0 :(得分:0)

我通常像

那样扩展PDO类
class DB extends PDO {...}

然后确保构造函数使用连接字符串调用父(PDO)。但是,一旦我需要使用单独的功能连接到数据库。这样做:

// Establish the connection.
try {
    $this->str="";
    switch ($this->proto){
    case "mysql":
        $this->str = "mysql:host=$this->host;dbname=$this->db";
        break;
    default:
        throw new PDOException("Wrong protocol '$proto'");
    }

    parent::__construct($this->str,
            $this->user, $this->pw,$opts);
}catch (PDOException $e) {
    $this->last_error = $e->getMessage();
    error_log($e->getMessage());
    return false;
}

另外,请确保每次选择时都不连接!因此,您可能需要单独使用selectconnect函数。最后,代替selectdelete等函数,我通常会创建一个泛型/基础(但有点不安全)的成员,它将返回任何查询结果:

public function send_query($query){
    $result = $this->query($query);

    if ($result === false){
        $this->last_error = $this->errorInfo();
        return false;
    }
    $ret = $result->fetchAll();
    $result->closeCursor();
    return $ret;

}

以上是“不安全”,因为$query字符串中的任何内容都将在数据库上运行。包装函数应确保正确转义字符串并且不包含恶意代码。我建议您为所有查询使用预准备语句,但上述方法应该按照您的要求进行。