0

クラスで PDO ステートメントを使用しようとしています。私は oop が初めてで、それがどのように行われるべきかを理解しようとしています。このサイトのいくつかの例を見て、それらのロジックを使用しましたが、どれも機能していないようです。ソース コードに致命的なエラーや警告はありませんでしたが、SQL ステートメントは実行されませんでした。ですから、まだ学んでいない小さなことが 1 つ欠けているだけだと感じています。

これまでに学んだことは、PDO 接続はクラスで作成する必要があり、コンストラクター メソッドを介して呼び出す必要があるということです。データベース クラスのコードは他の人から入手しました。

class Database
{
    protected static $Connection;

    public static function Connect()
    {
        if((self::$Connection instanceof PDO) === false)
        {
            $dbhost = 'host';
            $dbname = 'name';
            $dbuser = 'user';
            $dbpass = 'pass';

            self::$Connection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
        }
        return self::$Connection;
    }
}

そして、これは単なるコンストラクターであり、クラスの関数の 1 つの PDO ステートメントの例です。

class blahJR extends blah
{       
    private $Database;

    function __construct ($sUser)
    {
        parent::__construct($sUser);

        //Updated below: $this->Database = Database::Connect();
        $this->Database = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); //All the variables are given and the connection is definitely being made
    } //end __construct

public function foo($sString)
{
    try 
    {
         $Statement = $this->Database->prepare("INSERT INTO table (column) VALUES (?)");
         $Statement->execute(array($sString));
    }
    catch (PDOexception $e)
    {
         DatabaseError($e);
    }
}

どんな助けでも大歓迎です。お時間をいただきありがとうございます。

更新:より明確にするために、tryステートメントの周りに関数を追加しました。常にそこにあり、質問をしたときに追加しませんでした。それが明確になることを願っています。まだエラーは報告されていません。なぜこれがうまくいかないのか分かりません。

4

1 に答える 1

2

データベースに接続するために別のクラスを作成する理由はありません。のインスタンスを作成し、PDOそれを必要とするクラス/メソッドに挿入するだけです。

Databaseまた、そのクラスは OOP とはあまり関係がないことに注意してください。

class BlarJR extends blah
{
    private $connection;

    public function __construct(\PDO $connection, $user)
    {
        parent::__construct($user);

        $this->connection = $connection;
    }

    public function foo($someValue)
    {
        $stmt = $this->connection->prepare("INSERT INTO table (column) VALUES (?)");
        $stmt->execute(array($someValue));
    }
}

$connection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$blarJR = new blahJR($connection, $user);

try {
    $blarJR->foo('my value');
} catch (\PDOexception $e) {
    echo $e->getMessage();
}

ご覧のとおり、PDO 接続で例外を有効にし、エミュレートされた準備済みステートメントを無効にしました。現在、スローされない例外をキャッチしようとしています。デフォルトでは、PDO は以下を使用しますPDO::ERRMODE_SILENT

これがデフォルトのモードです。PDO は、ステートメント オブジェクトとデータベース オブジェクトの両方で PDO::errorCode() メソッドと PDO::errorInfo() メソッドを使用して検査するエラー コードを設定するだけです。ステートメント オブジェクトの呼び出しが原因でエラーが発生した場合は、そのオブジェクトで PDOStatement::errorCode() または PDOStatement::errorInfo() メソッドを呼び出します。データベース オブジェクトでの呼び出しが原因でエラーが発生した場合は、代わりにデータベース オブジェクトでこれらのメソッドを呼び出します。

メソッドに含まれずにクラスに座っているだけのものがあるため、現在持っているものはエラーを生成します。

解析エラー: 構文エラー、予期しない 'try' (T_TRY)、関数 (T_FUNCTION) が必要です...

于 2013-01-23T20:15:52.503 に答える