1

db レイヤーを処理するモデル クラスがいくつかありますが、オブジェクト指向の方法でクエリへの db 接続を渡す方法に論理エラーがあります。Class1 は、class2 クエリ メソッドのコンストラクター内で呼び出している db_connect です。

class db {
    public $host = 'localhost';
    public $username = 'root';
    public $password = '';
    public $database = 'molecule';
    public $mysqli = '';

   function __construct() {
        $mysqli = new mysqli($this->host, $this->username, $this->password, $this->database);
            if (mysqli_connect_errno()) {
                printf("Database Connection failed: %s\n", mysqli_connect_error());
                exit();
            }
        return $mysqli;
    }   
}

class nodeModel {
    public $node;
    public $node_name;
    public $node_link;
    public $node_comment;
    public $mysqli;

    function __construct() {
        $mysqli = new db;
        return $mysqli;
    }

    public $insert;
    public $insert_id;
    function insertNode($node_name, $node_link, $node_comment) {
            $this->insert = $insert;
            $this->insert = $mysqli->prepare("INSERT INTO node(node_name, name_link, node_comment) VALUES (?, ?, ?)");
            $this->insert->bind_param("sss", $this->node_name, $this->node_link, $this->node_comment);
            if($this->insert->execute()) {
                $this->insert_id = $mysqli->insert_id;
            } 
            return $this->insert_id;
            print_r($this->insert_id);
            $this->insert->close();
        }}

しかし、$insert で未定義の変数エラーが発生します。

私は次のようにそのレイヤーを呼び出しています:

include 'node_model.php';
$dbTest = new nodeModel;
$node_name = 'My Node Title';
$node_link = 'My Node Link';
$node_comment = 'My Node Comment. This one should be longer so I will write more stuff';
$dbTest->insertNode($node_name, $node_link, $node_comment);

クエリクラスのコンストラクターと接続する方法は機能しているようですが、準備/バインド/実行ステートメントにアタッチするためにスコープ内でどの変数が必要かわかりませんか?

そして、私は PDO または別の ORMy タイプのツールを使用する必要があることを知っています。私はそうしますが、これは基本的なオブジェクト指向の取得/設定/取得のベストプラクティスに関するものです...助けてくれてありがとう。

4

2 に答える 2

1

あなたのコードにはいくつかの大きな問題があります...

1.モデル クラスのプロパティをプライベートにし、setter メソッドと getter メソッドを作成して、プロパティとの間で値を設定または取得します。また、メソッド insertNode が間違っています。

class nodeModel {
    private $node;
    private $nodeName;
    private $nodeLink;
    private $nodeComment;
    private $mysqli;

    function __construct() {
        $this->mysqli = new db;
    }

    public function getNodeName() {
        return $this->nodeName;
    }

    public function getNodeLink() {
        return $this->nodeLink;
    }

    public function getNodeComment() {
        return $this->nodeComment;
    }

    public function setNodeName($value) {
        $this->nodeName = $value;
    }

    public function setNodeLink($value) {
        $this->nodeLink = $value;
    }

    public function setNodeComment($value) {
        $this->nodeComment = $value;
    }

    function insertNode() {
        $this->insert = $this->mysqli->prepare("INSERT INTO node(node_name, node_link, node_comment) VALUES (?, ?, ?)");
        $this->insert->bind_param($this->node_name, $this->node_link, $this->node_comment);
        if($this->insert->execute()) {
            $this->insert_id = $this->mysqli->insert_id;
        }
        $this->insert->close();

        print_r($this->insert_id);

        return $this->insert_id;
    }}


}

2.クラスでは、接続を作成するときに、 だけでなく にdb保存します。$this->mysqli$mysqli

function __construct() {
    $this->mysqli = new mysqli($this->host, $this->username, $this->password, $this->database);
        if (mysqli_connect_errno()) {
            printf("Database Connection failed: %s\n", mysqli_connect_error());
            exit();
        }
    return $this->mysqli;
}

3. 3 番目のコードでは、メソッドに渡す変数のみを作成しますが、insertNodeこのメソッド内では、渡された変数を使用して何もしません。クラス プロパティが設定されていることを期待していますが、設定されていません。したがって、次のようにします。

include 'node_model.php';
$dbTest = new nodeModel;
$dbTest->setNodeName('My Node Title');
$dbTest->setNodeLink('My Node Link');
$dbTest->setNodeComment('My Node Comment. This one should be longer so I will write more stuff');
$dbTest->insertNode();

お役に立てれば...

于 2012-06-13T08:51:21.887 に答える
-1

しかし、$insert で未定義の変数エラーが発生します。

これは、関数の最初の行が

$this->insert = $insert;
$this->insert = $mysqli->prepare("INSERT INTO node(node_name, name_link, node_comment) VALUES (?, ?, ?)");

$insert は引数リストにないため、最初の行でエラーが発生します。そして、2行目で、とにかく変数を上書きします。

また、return ステートメントのに 2 行のコードがありますが、もちろん実行されることはありません。

そろそろ寝る時間なのかな。:)

于 2012-06-13T08:40:35.217 に答える