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クラス内のすべてのメソッドを使用するには、PDOクラスを拡張する必要があります。

于 2012-11-05T21:24:55.287 に答える