PHP MySQLi对象声明与检索

PHP MySQLi对象声明与检索,php,oop,mysqli,this,Php,Oop,Mysqli,This,我有两个模型类处理一个db层,在如何以OO方式将db连接传递给查询时出现了一个逻辑错误。Class1是一个db_连接,我在class2查询方法的构造函数中调用它: class db { public $host = 'localhost'; public $username = 'root'; public $password = ''; public $database = 'molecule'; public $mysqli = ''; fun

我有两个模型类处理一个db层,在如何以OO方式将db连接传递给查询时出现了一个逻辑错误。Class1是一个db_连接,我在class2查询方法的构造函数中调用它:

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);
我与query类的构造函数的连接方式似乎是可行的,但不确定我需要在作用域中将哪个变量附加到prepare/bind/execute语句

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

但是$insert有一个未定义的变量错误

这是因为函数的第一行是

$this->insert = $insert;
$this->insert = $mysqli->prepare("INSERT INTO node(node_name, name_link, node_comment) VALUES (?, ?, ?)");
$insert不在参数列表中,因此第一行导致错误。然后在第二行中,无论如何都要覆盖变量

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


也许该睡觉了

您的代码存在一些主要问题

一,。将模型类属性设置为私有,并创建setter和getter方法来设置或检索属性的值。另外,您的方法insertNode是错误的

类节点模型{ 私有$节点; 私有$nodeName; 私人$nodeLink; 私人$nodeComment; 私人$mysqli; 函数构造{ $this->mysqli=newdb; } 公共函数getNodeName{ 返回$this->nodeName; } 公共函数getNodeLink{ 返回$this->nodeLink; } 公共函数getNodeComment{ 返回$this->nodeComment; } 公共函数setNodeName$value{ $this->nodeName=$value; } 公共函数setNodeLink$value{ $this->nodeLink=$value; } 公共函数setNodeComment$值{ $this->nodeComment=$value; } 函数插入节点{ $this->insert=$this->mysqli->prepareINSERT到节点节点名称、节点链接、节点注释值?、?、?; $this->insert->bind_param$this->node_name,$this->node_link,$this->node_comment; 如果$this->insert->execute{ $this->insert_id=$this->mysqli->insert_id; } $this->insert->close; 打印\r$this->插入\u id; 返回$this->insert_id; }} } 二,。在类db中创建连接时,将其存储到$this->mysqli中,而不仅仅是$mysqli

三,。在第三段代码中,您只创建了一个传递给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();

希望这有帮助…

问题肯定不是因为insertNode方法的第一行-1对不起,这是我能看到你问的唯一问题。啊,对不起,你不是OP。但这是他报告的唯一错误。你确定他的代码完全正常,并且在修复前两行代码后,会执行OP希望执行的操作吗?我不这么认为。。。如果SE只是回答问题,那么任何人都可以来回答问题。。。但是我们应该帮助解决问题,让OPs了解问题所在……我只是觉得你有点苛刻,认为一个新来者的回答没有帮助——因为OP显然对PHP中的变量范围有一些误解,但这并不意味着处理问题a——他报告的问题a——当问题的根源是samePDO不是我的类型工具时——是没有帮助的。我希望你能理解什么是模型。谢谢你详尽的回答。您可以看到,我的困惑在于OOP中的get/set约定,以及在过程中执行操作时所产生的额外工作。我发现有趣的是,您必须使用函数分配变量,然后这些变量位于作用域/即类对象的一部分,因此insert方法不需要将它们作为参数传入。是的。这是一种方法。更简单的是将所有属性都公开,这样就不必使用getter/setter方法,直接将值赋值为$node->title='mytitle';然后再次调用$node->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();