-1

データベースに接続するための私のコードは次のとおりです

function createConnection($DB_USER, $DB_PASSWORD){

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);

}

以下は、呼び出される関数のコードです

function checkIfUserExists($dbc, $username, $table){

    global $dbc;

    $stmt = $dbc->prepare("SELECT * FROM ? WHERE username = ?");
    $stmt = bindParam(1, $table);
    $stmt = bindParam(2, $username);
    $stmt->execute();

}

以下は私がそれらを呼び出すために使用するコードです

$connect = new databaseOperations;
$connect->createConnection($DB_USER, $DB_PASSWORD);
$connect->checkIfUserExists($dbc, login, Username);

私の質問は、ページの読み込み時に非オブジェクト エラーでメンバ関数 prepare() の呼び出しが発生するのはなぜですか?

4

2 に答える 2

3

これは、メソッド$dbcに渡すがcheckIfUserExistsグローバルスコープでは使用できず、メソッドが作成されたスコープ(この場合はスコープ)でのみ使用できるためですcreateConnection

解決策は簡単です。コードでグローバルを使用しないでください。グローバルを使用する必要がある最後のコードはOOPコードです。

次のようなものを使用します。

class DatabaseOperations
{
    private $dbc;

    public function createConnection(...)
    {
        $this->dbc = new PDO(...);
    }

    public function checkIfUserExists(...)
    {
        $this->dbc->prepare(...);
        // ...
    }
}

$db = new DatabaseOperations();
$db->createConnection(...);
$db->checkIfUserExists(...);

または、関数内の変数を返し、$dbcそれcreateConnectionを他の関数に渡します。

重要な補足事項:これは、クラスを使用する方法ではありません。OOPとそのようなプログラムについて何かを読んでください。その場合、通常、User(Active Record)またはUserMapper(DataMapper)オブジェクトにメソッドがあり、それが存在するかどうかを確認します。

于 2013-03-02T22:20:15.707 に答える
0
function createConnection($DB_USER, $DB_PASSWORD){

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD);
    return $dbc; // <---- add this...

}

function checkIfUserExists($dbc, $username, $table){

// ---> no need to use global, because you pass $dbc as an argument

呼び出しています...

$dbc = $connect->createConnection($DB_USER, $DB_PASSWORD);
于 2013-03-02T22:20:34.597 に答える