2012-06-13 2 views
1

У меня есть пара классов моделей, обрабатывающих слой db, и у меня есть логическая ошибка в том, как передать соединение db с запросом способом OO. Class1 является db_connect, который я звоню внутри конструктора методов запроса class2:PHP MySQLi Object Declaration & Retrieval

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(); 
     }} 

Но я получаю неопределенную переменную ошибку с $ вкладыша.

Я называю этот слой со следующим:

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. Что я буду, но это больше о некоторых базовых OO get/set/retrieve best practice ... спасибо за вашу помощь.

+0

PDO не является инструментом типа ORMy. И я [не согласен] (http://stackoverflow.com/a/5864000/727208) с вашим пониманием того, что такое модель. –

ответ

1

Есть некоторые серьезные проблемы с вашим кодом ...

1. сделать ваши свойства модели класса приватным и создать-акцессоры методы для установки или получения значения в/из собственности. Также ваш метод 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(); 

Надеюсь, что это помогает ...

+0

Спасибо за ваш тщательный ответ. Вы можете видеть, что мое замешательство было связано с установками get/set в ООП и дополнительной работой, которую она создает, когда вы делали что-то в процедурной форме. – shotdsherrif

+0

Что мне интересно, так это то, что вам нужно назначить переменные с функциями, а затем они входят в область видимости /, то есть часть объекта класса, поэтому метод вставки не обязательно должен быть передан в качестве аргументов. – shotdsherrif

+0

Да. Это один из подходов. Намного проще, чтобы все свойства были общедоступными, тогда вам не нужно иметь методы getter/setter и напрямую присваивать значения как '$ node-> title = 'My Title';', а затем снова вызвать '$ node-> insertNode(); 'сохранить его как новый ... – shadyyx

-1

Но я получаю неопределенную переменную ошибку с помощью $ insert.

Это потому, что первые строки вашей функции являются

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

$ вставки нет в списке аргументов, так что первая строка вызывает ошибку. А затем во второй строке вы все равно перезаписываете переменную.

У вас также есть 2 строки кода после оператора возврата, который, конечно же, никогда не выполняется.

Возможно, пришло время поспать? :)

+0

Проблема не в том, что первые строки метода 'insertNode' ...-1 – shadyyx

+0

Извините, это единственная проблема, которую я вижу, о которой вы спрашиваете. –

+0

Ах, извините, вы не OP. Это, однако, единственная ошибка, о которой он сообщал. –