0

我是 PHP 中的 OOP 新手,我正在尝试了解它是如何工作的。我正在尝试将 PDO 实现到我自己的类中。

这就是我正在做的事情:

class db {

    private $options;

    function __construct() {
        $this->options = array(
            'database_host' => DATABASE_HOST,
            'database_name' => DATABASE_NAME,
            'database_user' => DATABASE_USER,
            'database_pass' => DATABASE_PASS
        );

    }

    private function connect() {
        try {
            $pdo = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->exec("set names utf8");
        } catch (PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function select($table, $what, $where, $custom) {

        $query = "SELECT " . $what . " FROM " . $table;
        $child = "1";
        $param = array();
        if ($where)
            foreach ($where as $data => $value) {
                if ($child == "1") {
                    $query .= " WHERE " . $data . " = '" . $value . "'";
                    $param[":" . $data] = $value;
                    $child = "next";
                } else {
                    $query .= " AND " . $data . " = '" . $value . "'";
                    $param[":" . $data] = $value;
                }
            }

        if ($custom)
            $query .= ' ' . $custom;

        $statement = $pdo->prepare($query);
        if ($statement->execute($param))
            return $statement->fetchAll(PDO::FETCH_ASSOC);
        return false;
    }

}

问题是我不知道如何使函数connect()与下面的函数通信select() 当我尝试调用该select()函数时,我收到此错误:

Fatal error: Call to a member function prepare() on a non-object in /Applications/MAMP/htdocs/game/api/class.db.php on line 47

我希望当我调用该select()函数时,该函数connect()连接到数据库并使其所有变量可用于该类的其他函数……但我迷路了。

4

2 回答 2

1

$pdo变量存储为属性。目前它只是该connect()方法的局部变量。

class db {
    private $options;
    private $pdo;
}

然后使用$this->pdo从任何方法访问它。例如在你的connect()

private function connect() {
    try {
        $this->pdo = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo->exec("set names utf8");
    } catch (PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
}

对您的其他方法执行相同操作,例如:

$statement = $this->pdo->prepare($query);

您可能更喜欢扩展 PDO 类,而不是拥有一个保留 PDO 对象属性的新类。不同之处在于,在扩展它时,您的db类的行为将与PDO该类相同,除了它将提供您的其他方法。而对于您当前的代码,db该类仅具有您明确定义的方法。

于 2013-07-10T09:11:44.090 回答
0

尝试这个

class db {

private $options;
private $oPDO;

function __construct() {
    $this->options = array(
        'database_host' => DATABASE_HOST,
        'database_name' => DATABASE_NAME,
        'database_user' => DATABASE_USER,
        'database_pass' => DATABASE_PASS
    );

    $this->connect();
}

private function connect() {
    try {
        $this->oPDO = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']);
        $this->oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->oPDO->exec("set names utf8");

    } catch (PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
}

public function select($table, $what, $where, $custom) {

    $query = "SELECT " . $what . " FROM " . $table;
    $child = "1";
    $param = array();
    if ($where)
    foreach ($where as $data => $value) {
        if ($child == "1") {
            $query .= " WHERE " . $data . " = '" . $value . "'";
            $param[":" . $data] = $value;
            $child = "next";
        } else {
            $query .= " AND " . $data . " = '" . $value . "'";
            $param[":" . $data] = $value;
        }
    }

    if ($custom)
    $query .= ' ' . $custom;

    $statement = $this->oPDO->prepare($query);
    if ($statement->execute($param))
    return $statement->fetchAll(PDO::FETCH_ASSOC);
    return false;
}

}

于 2013-07-10T09:14:29.847 回答