PHP MySQLi对象声明&恢复

时间:2012-06-13 08:04:10

标签: php oop mysqli this

我有几个处理数据库层的模型类,我在如何以OO方式将数据库连接传递给查询时遇到了逻辑错误。 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);

我与查询类的构造函数连接的方式似乎正在工作但不确定我需要在作用域中连接到prepare / bind / execute语句的哪个变量?

我知道我应该使用PDO或其他ORMy类型工具。我会这样做,但这更多是关于一些基本的OO获取/设置/检索最佳实践...感谢您的帮助。

2 个答案:

答案 0 :(得分: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. 在您的第三个代码中,您只创建一个传递给方法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();

希望这会有所帮助......

答案 1 :(得分:-1)

  

但是我用$ insert得到了一个未定义的变量错误。

那是因为你的函数的第一行是

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

$ insert不在您的参数列表中,因此第一行会导致错误。然后在第二行中,无论如何都要覆盖变量。

在 return语句之后还有2行代码,当然永远不会执行。

也许是时候睡觉了? :)