Php 在对象中使用PDO 目前为止

Php 在对象中使用PDO 目前为止,php,mysql,oop,pdo,Php,Mysql,Oop,Pdo,我知道这个类实际上并没有扩展pdo对象,我不知道为什么我这么叫它 我的问题 我需要添加这个类,以便我可以进行一些查询,特别是使用准备好的语句。有人能给我一些反馈,告诉我要做些什么来完成这个任务。 我现在从另一个类中调用这个类 $this->_siteRegistry = Registry::singleton(); $this->_siteRegistry->storeObject("PDOExtender", "DBO"); $this->_DBO = $this-&g

我知道这个类实际上并没有扩展pdo对象,我不知道为什么我这么叫它

我的问题 我需要添加这个类,以便我可以进行一些查询,特别是使用准备好的语句。有人能给我一些反馈,告诉我要做些什么来完成这个任务。
我现在从另一个类中调用这个类

$this->_siteRegistry = Registry::singleton();
$this->_siteRegistry->storeObject("PDOExtender", "DBO");
$this->_DBO = $this->_siteRegistry->getObject("DBO");
try {
    $this->_DBO->openConnection();
} catch(Exception $e) {
throw new Exception("server");
}
我的老方法,没有PDO 在我以前的项目中,我只使用了mysql,但我自己创建了代码,我确信这不是完成任务的最佳方式,因此我宁愿不使用我与pdo集成的代码。
就是这样

public function runQuery($query, $functionArray = array(), $needResults)
{
    $stmtParam = "";
    $parameters = array();
    $results = array();
    foreach ($functionArray as $v) {
        $stmtParam .= "s";
    }
    array_unshift($functionArray, $stmtParam);
    $stmt = $this->_dbConnection->prepare($query);
    call_user_func_array(array($stmt, 'bind_param'), $functionArray);
    $stmt->execute();
    if($needResults) {
        $meta = $stmt->result_metadata();
        while ( $field = $meta->fetch_field() ) {
            $parameters[] = &$row[$field->name];
        }
        call_user_func_array(array($stmt, 'bind_result'), $parameters);
        while ( $stmt->fetch() ) {
            $x = array();  
            foreach( $row as $key => $val ) {
                $x[$key] = $val;
            }
            $results[] = $x; 
        }
        return $results;
    } else return true;
}
结束 我需要帮助将我的旧代码转换为与pdo一起使用。
如果有人知道任何伟大的教程,显示如何做到这一点,请链接他们,我看了,但找不到任何

感谢您抽出时间

Chris

我还有一个用于db连接的单例类,您可能需要检查它:

class DBConnection extends Singleton{

    private $connexion_pdo=null;

    protected function initialize(){
        $this->connexion_pdo = null;
        try{
            $this->connexion_pdo = new PDO(PDO_DSN,PDO_USR,PDO_PSW);
        }
        catch(PDOException $erreur){
            throw new Exception($erreur->getMessage());
        }
        $this->connexion_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->connexion_pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    }


    public function execute($query,$values=array()){
        try {
            $this->connexion_pdo->beginTransaction();
            $prepare_execute = $this->getPDOStatement($query);
            $prepare_execute->execute($values);
            $this->connexion_pdo->commit();
        } catch(PDOException $erreur){
            throw new Exception($erreur->getMessage());
        }
    }


    public function executeQuery($query,$values=array()){
        try {
            $resp = array();
            //$this->connexion_pdo->beginTransaction();
            $prepare_execute = $this->getPDOStatement($query);
            $prepare_execute->execute($values);
            $resp = $prepare_execute->fetchAll();
            //$this->connexion_pdo->commit();
            return $resp;
        } catch(PDOException $erreur){
            throw new Exception($erreur->getMessage());
        }
    }

    public function getPDOStatement($query){
        try {
            $prepare_execute = null;
            $prepare_execute = $this->connexion_pdo->prepare($query,array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            return $prepare_execute; 
        } catch(PDOException $erreur){
            throw new Exception($erreur->getMessage());
        }
    }
}
我使用“execute()”进行插入、删除和更新,使用“executeQuery()”进行选择。我知道这段代码可以改进,但主要思想是有=D

我看到您正在使用while循环来转换查询结果。。我建议您创建另一个类来管理它。必须有一个类询问数据库,另一个类将结果映射到所需内容(数组、对象等)


祝你好运

您可以将PDO类设置为类构造函数的参数

例如:

$pdo = "...connect... & etc.";
$myClass = new MyClass($parameters, $pdo);

MyClass:

class MyClass {
    private $pdo;

    public function __construct($parameters, $pdo) {
         $this->pdo = $pdo;
    }
}

现在,您可以在类中使用PDO作为$this->PDO->query等等。

1。你有什么不起作用的?2.为什么您觉得需要将PDO(一个类)封装到另一个类中?您打算添加的功能缺失了哪些?@Erick我认为他现在使用单例模式将提高性能,因为他不会为每个查询初始化连接。干杯@如果您需要为每个查询初始化连接,那么您只是做错了(tm)。此外,.@teresko,这就是我说的=)初始化连接是web开发人员(至少我知道的开发人员)的一个常见问题。该视频主要应用于Java开发,在Java开发中,您可以拥有应用程序范围内的实例。。而在Php中,每个请求都是一个“main()”。。就像视频中说的“拥有一个单一的实例并没有什么错,当它与一个全球国家紧密相连时,它就成了一个问题”。。我猜DB连接是单例模式的一个很好的候选者:)至少在php@pleasedontbelong没有什么是单身汉的好选择。您应该为构造函数中需要它的所有对象提供相同的连接对象。
$pdo = "...connect... & etc.";
$myClass = new MyClass($parameters, $pdo);

MyClass:

class MyClass {
    private $pdo;

    public function __construct($parameters, $pdo) {
         $this->pdo = $pdo;
    }
}