6

我是 OOP 的新手,所以我正在尝试学习如何创建类和使用它们。目前我正在尝试从我的 MySQL 表中获取数据。

要创建与 MySQL 的连接,我使用的是 PDO。我为数据库连接创建了一个单独的类。我已经在我的 show.php 文件中包含了这个类。现在我想从 MySQL 数据库中获取数据。问题是当我运行我的 show.php 文件时,它会显示此错误消息

致命错误:在第 10 行调用 C:\xampp\htdocs\jm\show.php 中未定义的方法 DBConnection::prepare()`

但它应该只显示array.

这个问题的解决方案是什么?

文件db.class.php

<?php
    class DBConnection {

        function DBConnection(){

            $host = 'localhost';
            $dbname = 'srijon';
            $user = 'root';
            $pass = '';

            try {
                $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
                $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                return $DBH;
            }
            catch(PDOException $e) {

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

        } // function ends

    } // class ends
?>

文件show.php

<?php
    require_once 'db.class.php';

    function get_all(){

        $db = new DBConnection();

        $sql = "SELECT * FROM information";
        $STH = $db->prepare($sql);
        $STH->execute();
        $STH->setFetchMode(PDO::FETCH_ASSOC);

        return $STH;
    }

    echo get_all();
?>
4

2 回答 2

15

恕我直言,您可以将 PDO 连接注入需要它的函数中:

<?php

$dbHandle = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$dbHandle->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// always disable emulated prepared statement when using the MySQL driver
$dbHandle->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

function get_all($dbHandle) {
    $sql = "SELECT * FROM information";
    $stmt = $dbHandle->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);

    return $stmt;
}

get_all($dbHandle);

如果你真的认为你需要一些类来访问数据库(除了 PDO)(你不需要),你将不得不扩展 PDO:

<?php

class DBConnection extends PDO
{
    public function __construct()
    {
        parent::__construct("mysql:host=$host;dbname=$dbname", $user, $pass);
        $this->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // always disable emulated prepared statement when using the MySQL driver
        $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }
}

$dbHandle = new DBConnection();

function get_all($dbHandle) {
    $sql  = "SELECT * FROM information";
    $stmt = $dbHandle->prepare($sql);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);

    return $stmt;
}

get_all($dbHandle);
于 2012-11-05T21:31:56.643 回答
2

也许将 DBConnections FUNCTION 更改为 __contstruct() 函数。此外,您需要扩展 PDO 类以使用其中的所有方法。

于 2012-11-05T21:24:55.287 回答