0

そのため、DBアクセスが必要なときにいつでもDBオブジェクトを作成できるように、単純なPDO接続クラスを構築しようとしていますが、何を試しても同じエラーが発生し続けます。

これがDBクラスの私のコードです

<?php
class DbConnect
{
// Database login vars
private $dbHostname = 'localhost';
private $dbDatabase = 'database';
private $dbUsername = 'username';
private $dbPassword = 'password';
public $db = null;

public function connect()
{
    try
    {
        $db = new PDO("mysql:host=".$this->dbHostname.";dbname=".$this->dbDatabase, $this->dbUsername, $this->dbPassword); // Establish DB connection
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set error handling
        return $db;
    }
    catch(PDOException $e)
    {
        echo "It seems there was an error.  Please refresh your browser and try again. ".$e->getMessage();
    }
}
}
?>

そして、これが私がそれを使用しようとしているクラスの私のコードです:

<?php
session_start();
require 'DbConnect.php';

class User
{
    public function bindParams()
    {
        $DbConnect = new DbConnect();
        $sql = $DbConnect->connect();

        $sql->prepare("insert into dbobjectex(firstName, lastName) values (:firstName, :lastName)");
        $sql->bindParam(':firstName', $_SESSION['firstName']);
        $sql->bindParam(':lastName', $_SESSION['lastName']);
        $sql->execute();
    }
}
?>

次に、Userクラスを作成した場所からbindParams()が呼び出されます。私が繰り返し発生する2つのエラーは、「NetworkError:500InternalServerError」と「HTMLドキュメントの文字エンコードが宣言されていません」です。私がここで間違っていることについて何か考えはありますか?アドバイスありがとうございます。

4

1 に答える 1

1

What am I doing wrong here?-多くのことがありますが、見逃しがちなのはこれです。のクラス定義の最後でDbConnect、phpタグを閉じます。これは、インクルードファイルとインクルードファイルで可能な限り回避?>する必要があります。あなたの場合にそれらを持っていることの結果は、ヘッダーが時期尚早に送信され、2番目のエラーを説明することです。

それ以外の場合は、ユーザークラスをインスタンス化するたびに、新しいPDOインスタンスを作成します。これをconnectメンバー関数のローカル変数に割り当て、少なくとも。に置き換え$dbます$this->db。しかし、何よりも、私は@sabreに同意します:なぜPDOは追加のラッパーを必要とするのでしょうか?特に、pdoインスタンスをインスタンス化して返すだけの場合は、必要に応じて接続を処理する抽象クラスを作成するだけです。

天気を確認するか、インクルードパスが正しいかどうかを確認し、クラスの自動読み込みに関するドキュメントを読んでください。充実したクラスライブラリがあれば、トラブルの世界を救うことができます。?>これは、タグと同様に最初のエラーを説明する可能性がありますが、念のために言っておきますが、:を含めるのrequire_onceではなく、を使用requireして、クラスを2回目に再定義することは、あなたがやりたいことではありません。

于 2012-08-13T09:54:11.637 に答える