2

MySQLiを使用していくつかの基本的なOOスクリプトを作成していますが、stmt_init()、prepare()、またはquery()のいずれかを使用するとUndefinedメソッドエラーが発生します...また、connect_errno()でもエラーが発生します。php.iniでmysqli拡張機能が有効(コメントなし)であり、phpinfo()でmysqliとmysqlndの両方が有効になっていることを知っています...したがって、メソッド/プロパティにアクセスできない理由がわかりません。私が得ているエラーは次のとおりです。致命的なエラー:未定義のメソッドmysqli :: connect_error()の呼び出し

class db {
    public $host = 'localhost';
    public $username = 'root';
    public $password = '';
    public $database = 'molecule';
    public $mysqli = '';
    function __construct() {
        $this->mysqli = new mysqli($this->host, $this->username, $this->password, $this->database);
    return $this->mysqli;
    }   
}

class nodeModel {
    function __construct() {
        $this->mysqli = new db;
        if($this->mysqli->connect_error()){ printf("Database Connection failed: %s\n", $this->mysqli->connect_error()); }
    }

    function insertNode() {
        $this->insert = $this->mysqli->stmt_init();
        $this->insert->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;
    }

したがって、insertNode()メソッドを機能させるために...これらは、nodeModelクラスに配置した他のメソッドです。

public function setNodeName($value) { $this->nodeName = $value; }
public function setNodeLink($value) { $this->nodeLink = $value; }
public function setNodeComment($value) { $this->nodeComment = $value; }
public function getNodeName() { return $this->nodeName; }
public function getNodeLink() { return $this->nodeLink; }
public function getNodeComment() { return $this->nodeComment; }

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

変数をメソッドに渡すにはどうすればよいですか?私はこれを試しています...

$connect = new db();
$db = new nodeModel($connect);
$db->setNodeName('My Node Title');
$db->setNodeLink('My Node Link');
$db->setNodeComment('My Node Comment. This one should be longer so I will write more stuff');
$db->insertNode($db->getNodeName(), $db->getNodeLink(), $db->getNodeComment());

しかし、それは機能していません。私の混乱は、実際にはクラスメソッド内のOOスコープに関するものです...私が何を渡すことになっているのかわかりません。

4

1 に答える 1

1

これを試してください。依存性注入を使用して、接続オブジェクトをモデルに渡します。

<?php 
class db{
    protected $mysqli;
    function __construct($host,$username,$password,$database) {
        if(!$this->mysqli instanceof mysqli){
            $this->mysqli = new mysqli($host, $username, $password, $database);
            if ($this->mysqli->connect_errno) {
                die("Failed to connect to MySQL: (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error);
            }
        }
    }
}

class nodeModel{
    function __construct($connection) {
        $this->mysqli = $connection;
    }

    function status() {
        return print_r($this,true);
    }
}
//Create the database object
$connect = new db('localhost','root','password','db');

//Inject the database object into the model
$db = new nodeModel($connect);

//Example method inside the model class
print_r($db->status());
/*
nodeModel Object
(
    [mysqli] => db Object
        (
            [mysqli:db:private] => mysqli Object
                (
                    [affected_rows] => 0
                    [client_info] => mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $
                    [client_version] => 50008
                    [connect_errno] => 0
                    [connect_error] => 
                    [errno] => 0
                    [error] => 
                    [field_count] => 0
                    [host_info] => localhost via TCP/IP
                    [info] => 
                    [insert_id] => 0
                    [server_info] => 5.5.16
                    [server_version] => 50516
                    [sqlstate] => 00000
                    [protocol_version] => 10
                    [thread_id] => 28
                    [warning_count] => 0
                )

        )

)
*/
?>
于 2012-06-13T23:58:56.940 に答える