Использование PDO в объекте - PullRequest
2 голосов
/ 06 мая 2011

Пока

class PDOExtender
{
    private $_DBO;
    public function openConnection()
    {
        $dsn = "mysql:host=".DB_HOST.";dbname=".DB_NAME;
        $this->_DBO = new PDO($dsn, DB_USER, DB_PASS, array(PDO::ATTR_PERSISTENT => true));
    }
}

Я знаю, что класс на самом деле не расширяет объект pdo, я не знаю, почему я так его назвал.

Мой вопрос

Мне нужно добавить класс this, чтобы я мог выполнять некоторые запросы, в частности, используя подготовленные операторы. Может ли кто-нибудь дать мне обратную связь о том, что добавить для достижения этой цели.
В настоящее время я вызываю этот класс из другого класса, как этот,

$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");
}

Мой старый путь, без ЗОП

В моих старых проектах я просто использовал 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

Ответы [ 2 ]

1 голос
/ 06 мая 2011

У меня также есть одноэлементный класс для соединения с БД, вы можете проверить его:

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 ()» для INSERT, DELETE и UPDATE, а также «executeQuery ()»для выбора.Я знаю, что этот код может быть улучшен, но основная идея там есть = D

Я видел, что вы используете цикл , в то время как для преобразования результата запроса.Я бы посоветовал вам создать еще один класс, который управляет этим.Должен быть класс, который запрашивает базу данных, и другой, который сопоставляет результаты с тем, что вам нужно (массив, объект и т. Д.)

Удачи!

0 голосов
/ 09 мая 2011

Вы можете установить класс PDO в качестве параметра вашего конструктора класса.

Пример:

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

MyClass:

class MyClass {
    private $pdo;

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

и теперь вы можете использовать PDO в классе AS $ this-> pdo-> query &и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...