2015-01-30 3 views
-1

У меня возникла проблема с использованием объекта mysqli, который был создан в одном методе моего класса во втором методе класса. Может ли кто-нибудь помочь мне понять, что я могу делать неправильно? Вот как выглядят мои методы из двух классов:Объект класса PHP внутри метода

function connect() { 
    $mysqli = new mysqli($this->host, $this->user, $this->pass, $this->db); 

    if($mysqli->connect_errno) { 
     printf("Connect failed: %s\n", $mysqli->connect_error); 
     exit(); 
    } 
    else { 
     echo 'Successful'; 
    } 

} 

public function query($sql) { 
    $this->sql = $sql; 
    $mysqli->connect(); 
    $result = $mysqli->query($this->sql); 

    while ($row = $result->fetch_assoc()) { 
     printf ("$s (%s)\n", $row['name']); 
     echo "<br>"; 
    } 

    $result->free(); 

    $mysqli->close(); 
} 

Я думаю, что моя проблема заключается в том, чтобы создать экземпляр объекта.

**** ОБНОВЛЕНО: Это в настоящее время весь класс, что у меня есть и сценарий умирает при попытке выполнить строку внутри метода запроса:

$this->mysqli->connect(); 

class database { 
    public $host = "host"; 
    public $user = "user"; 
    public $pass = "pw"; 
    public $db = "dbname"; 
    public $sql; 
    private $mysqli; 

    function __construct() { 
     echo "new class object created"; 
     echo "<br><br>"; 
    } 

    function connect() { 
     $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->db); 

     if($this->mysqli->connect_errno) { 
      printf("Connect failed: %s\n", $mysqli->connect_error); 
      exit(); 
     } 
     else { 
      echo 'Successful'; 
     } 

    } 

    public function query($sql) { 
     $this->sql = $sql; 
     echo "test1"; 
     $this->mysqli->connect(); 
     echo "test2"; 
     $result = $this->mysqli->query($this->sql); 
     echo "test3"; 

     while ($row = $result->fetch_assoc()) { 
      printf ("$s (%s)\n", $row['name']); 
      echo "<br>"; 
     } 

     $result->free(); 

     $this->mysqli->close(); 
    } 
} 

echo "test2"; does not execute. 

ответ

4

Вы проблема с переменным охватом. Вы не можете получить к нему доступ так, как хотите, не указав его. global 'ly.

Вы бы лучше придерживаться лучшей практики и сделать что-то вроде этого:

private $mysqli; 

function connect() { 
    $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->db); 

    if($this->mysqli->connect_errno) { 
     printf("Connect failed: %s\n", $mysqli->connect_error); 
     exit(); 
    } 
    else { 
     echo 'Successful'; 
    } 

} 

Вы заметили, как мы определили его $this (в пределах объекта). Теперь у вас есть доступ к этому:

public function query($sql) { 
    $this->sql = $sql; 
    $this->connect(); 
    $result = $this->mysqli->query($this->sql); 

    while ($row = $result->fetch_assoc()) { 
     printf ("$s (%s)\n", $row['name']); 
     echo "<br>"; 
    } 

    $result->free(); 

    $this->mysqli->close(); 
} 
+0

Спасибо @Fred, всегда получил мою спину ;-) – Darren

+1

Si, signore ;-) –

+1

Спасибо за ответ ребята. На самом деле у меня была такая настройка вначале. Теперь я внедрил предложенные вами изменения. Однако у меня все еще есть проблемы с этим. Сценарий, кажется, умирает, когда функция запроса вызывается сразу после $ this-> mysqli-> query ($ this-> sql) –

0

Метод является функцией. Как и любая другая функция, переменные, которые вы объявляете внутри функции, не могут быть доступны за пределами этой функции.

Смежные вопросы