検索

ホームページ  >  に質問  >  本文

他のクラスでPDO接続を使用する方法

<p>オブジェクト指向プログラミング (OOP) がどのように機能するかを理解するのが難しいように感じます。動作するようにコードを変更しましたが、それが正しい方法ではないと思います。以下にシナリオを示します (いいえ、ユーザー ログインを自分で作成しているわけではありません。これは OOP をよりよく理解するためだけです): </p> <p>database.php ファイルがあります:</p> <pre class="brush:php;toolbar:false;">クラス データベース { /* 属性 */ プライベート $conn; プライベート $dsn = 'mysql:dbname=test;host=127.0.0.1'; プライベート $user = 'root'; プライベート $パスワード = ''; /* データベース接続を作成します */ パブリック関数 __construct() { 試す { $this->conn = 新しい PDO($this->dsn, $this->ユーザー, $this->パスワード); } キャッチ (PDOException $e) { print "エラー!: " . $e->getMessage() . ""; 死ぬ(); } $this->connを返します; } }</pre> <p>このクラスでは、データベース接続を作成し、その接続 (オブジェクト?) を返します</p> <p>次に、2 番目のクラス、有名な User クラスを用意します (実際には自動ロードを使用しませんが、それについては知っています)。 </p> <pre class="brush:php;toolbar:false;">「database.php」を含める; クラス ユーザー { /* 属性 */ プライベート $conn; /* データベースアクセスを取得します */ パブリック関数 __construct() { $this->conn = 新しいデータベース(); } /* ログインユーザー */ パブリック関数login() { $stmt = $this->conn->prepare("SELECT username, usermail FROM user"); if($stmt->execute()) { while($rows = $stmt->fetch()) { $fetch[] = $rows; } $fetch を返します。 } それ以外 { false を返します。 } } }</pre> <p>これらは私の 2 つのクラスです。ご覧のとおり、大したことはありません。ここで、関数名 <code>login</code> に混乱しないでください。実際には、データベースからユーザー名とユーザーメールをいくつか選択して表示しようとしているだけです。私は次のようにしてそれを達成しようとしました: </p> <pre class="brush:php;toolbar:false;">$user = new User(); $list = $user->login(); foreach($list as $test) { echo $test["ユーザー名"]; }</pre> <p>ここで問題が発生します。このコードを実行すると、次のエラー メッセージが表示されます。 </p> <ブロック引用> <p>キャッチされないエラー: 未定義のメソッド Database::prepare() の呼び出し</p> </blockquote> <p>このエラーの原因を本当に理解しているかわかりません。</p> <p><strong>以下を変更するとコードは正常に動作します: </strong></p> <p>database.php の <code>$conn</code> を private から public に変更しました (これはダメだと思います...? しかし、private にすると、Database クラスでしか使用できなくなります。Query は内部的に実行されますよね? では、これらのクエリはすべて Database クラスに入れるべきでしょうか? 大きなプロジェクトでは非常に巨大になるため、これは良くないと思います...) </p> ; <p>2 番目の変更は次のとおりです: </p> <p>user.php ファイルの <code>$this->conn->prepare</code> を <code>$this->conn->conn->prepare< / に変更します。コード>。これについては本当にわかりません。 </p> <p>つまり、<code>user.php</code> のコンストラクターには、<code>$this->conn = new Database()</code> があります。新しいデータベースなのでDB クラスから接続オブジェクトを返しますが、なぜ 2 番目の <code>conn-></code></p> が必要なのか本当にわかりません。
P粉293550575P粉293550575517日前510

全員に返信(1)返信します

  • P粉451614834

    P粉4516148342023-08-25 11:13:39

    • Database のようなクラスはほとんど役に立たないため、作成しないでください。 PDO に追加機能を追加する場合、データベース ラッパー クラスを作成することは理にかなっています。ただし、現在のコードを考えると、生の PDO を使用する方が良いでしょう。
    • 元の PDO またはデータベース クラスから 単一の $db インスタンスを作成します。
    • これをコンストラクター パラメーター としてデータベース接続を必要とするすべてのクラスに渡します。

    データベース.php:

    リーリー

    user.php

    リーリー

    app.php

    リーリー ###出力:### リーリー

    PDO の詳細については、私の

    (唯一正しい) PDO チュートリアル

    を参照してください。

    返事
    0
  • キャンセル返事