抽象PDO存储库文件错误

时间:2017-03-02 20:03:40

标签: php oop pdo

我是php的新手,我最近收到了一些错误。请参阅下面的代码。

我收到一些错误,说在不在对象上下文中时使用$ this

这是index.php

 <?php
        require_once ('setting.php');


        try{

            $sql = "CREATE TABLE users (
                user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                account VARCHAR(30) NOT NULL,
                password VARCHAR(30) NOT NULL,
                )";

            $result = $this->db->getConnection()->execute($sql);

        }catch(Exception $e){
            echo " " . $e->message();
        }

    ?> 

我将此名称命名为.php

<?php
    abstract class PDORepository{
        const USERNAME="xxxx";
        const PASSWORD="";
        const HOST="xxxxxx";
        const DB="xxxxx";

        private function getConnection(){
            $username = self::USERNAME;
            $password = self::PASSWORD;
            $host = self::HOST;
            $db = self::DB;
            $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
            return $connection;
        }

        protected function queryList($sql, $args){
            $connection = $this->getConnection();
            $stmt = $connection->prepare($sql);
            $stmt->execute($args);
            return $stmt;
        }

    }

?>

我应该怎么做才能访问该类PDORepository。我在这里找到了一些关于使用抽象类的讨论。但它与此并不相似。谢谢您的帮助!新手在这里!

2 个答案:

答案 0 :(得分:1)

第一个问题,你无法实例化一个抽象类,你必须有一个扩展抽象类的“具体”类。所以我会创建一个扩展UserRepository的<{1}}类:

PDORepository

现在,在你的userrepository中,我们将把你的代码放在index.php中,既然你现在在一个对象里面做的事情,你可以使用<?php //pdorepository.php abstract class PDORepository{ const USERNAME="xxxx"; const PASSWORD=""; const HOST="xxxxxx"; const DB="xxxxx"; private $conn; private function getConnection(){ if (!$this->conn) { $username = self::USERNAME; $password = self::PASSWORD; $host = self::HOST; $db = self::DB; $this->conn = new PDO("mysql:dbname=$db;host=$host", $username, $password); } return $this->connection; } protected function execute($sql, $args = null) { return $this->getConnection()->prepare($sql)->execute($args); } } ?> 而不会出现错误:

$this

现在,通过这两个类,您可以实例化<?php //userrepository.php require_once 'pdorepository.php'; class UserRepository extends PDORepository{ public function init() { $sql = "CREATE TABLE users ( user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, account VARCHAR(30) NOT NULL, password VARCHAR(30) NOT NULL, )"; try { $this->execute($sql); } catch(Exception $e){ echo " " . $e->message(); } } ?> 的实例,然后可以在其上调用方法:

UserRepository

答案 1 :(得分:-1)

我很欣赏Dave的答案,它正确地解释了正确的架构,但不幸的是,特定的代码是不可行的,因为它在OP中存在很多问题。

为了使其正确,我们需要3个文件:

pdo.php 我们将在其中创建一个PDO类的实例:

<?php
$user = 'root';
$pass = '';
$dsn  = "mysql:dbname=test;host=localhost;charset=utf8";
$opt  = array(
     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
     PDO::ATTR_EMULATE_PREPARES   => FALSE,
);
$pdo = new PDO($dsn, $user, $pass, $opt);

<强> pdorepository.php

<?php
abstract class PDORepository
{
    protected $pdo;

    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    protected function _sql($sql, $args = null)
    {
        if (!$args) {
            return $this->pdo->query($sql);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

<强> userrepository.php

<?php
require_once 'pdorepository.php';
class UserRepository extends PDORepository
{
    public function init()
    {
        $sql = "CREATE TABLE users (
                  user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                  account VARCHAR(30) NOT NULL,
                  password VARCHAR(30) NOT NULL
                )";
        $this->_sql($sql);
    }
}

最后是我们的申请文件:

<?php
require_once 'pdo.php';
require_once 'userrepository.php';

$repository = new UserRepository($pdo);
$repository->init();

此处数据库连接仅一次,这非常重要。还修复了很多小问题。这是工作和可用的代码。