2013-09-02 2 views
-1

Я новичок в объектно-ориентированном PHP, и у меня возникают проблемы со следующим кодом. Запросы базы данных с Mysqli не работают в классе, но работают отлично. Итак, мой вопрос: что я делаю неправильно?Проблема с использованием Mysqli в классе PHP

class webFile { 

    private $sql, $query; 

    function __construct() { 
     $sql = new mysqli('host','user','pass','dbname'); 
    } 

    function doQuery() { 
     $queryText = "SELECT * FROM blog_posts WHERE number = '2'"; 
     if($query = $this->sql->query($queryText)) { 
      $results = $query->fetch_array(); 
      return $results['post_id']; 
     } else { 
      return "Error"; 
     } 
    } 
} 

$object = new webFile(); 
echo $object->doQuery(); 

Журнал ошибок сервера говорит: «PHP Фатальная ошибка: Вызов функции запроса члена() на не-объект» ... я сделал еще одну тупую ошибку? Я посмотрел в Интернете, но не могу найти ничего, связанного с этой проблемой. Любая помощь будет оценена.

ответ

5

в конструкторе установить MySQLi локальной переменной $sql

изменения ваш конструктор

function __construct() { 
     $this->sql = new mysqli('host','user','pass','dbname'); 
    } 
+0

Спасибо, что сработал – 96ethanh

-2

По какой-то причине кажется, что ваш $ SQL Переменная не устанавливается на экземпляр объект MySQLi.

Я лично не использую MySQLi слишком часто; поскольку я предпочитаю mysql_connect.

Я хотел бы предложить что-то вроде следующего:

$this->sql = mysql_connect($host,$user,$pass) or die(mysql_error()); 
$this->db = mysql_select_db($db) or die(mysql_error()); 

Или, если вы установите на MySQLi объект -

try 
{ 
    $this->sql = new mysqli('host','user','pass','dbname'); 
} 
catch(Exception $e) 
{ 
    // throw another exception or something 
} 

Если предположить, что соединение выдает ошибку - это даст вам знать, что он потерпел неудачу и позволил вам внести исправления.

+0

все функции mysql_ * устарели – Miguelo

+0

Очень жаль, что вы не обновляетесь в документации по PHP - я не знал, что это означает, что это недействительное решение. Спасибо за это. DigitalJedi805

+0

Ответ действительно, но вы отправляете его на закрытую дорогу – Miguelo

0

Как сказал Miguelo, проблема в том, что вы написали $ SQL вместо $ this-> SQL в конструкторе.

Но есть и другие проблемы.

Как вы можете видеть, в своем коде вы получили

private $sql, $query 

Я не думаю, что вы хотите использовать $ Query между функциями в классе, так что я бы удалить его и оставить:

private $sql; 

Но если вы хотите использовать его между функциями, что функция doQuery() должно выглядеть так:

function doQuery() { 
    $queryText = "SELECT * FROM blog_posts WHERE number = '2'"; 
    if($this->query = $this->sql->query($queryText)) { 
     $results = $this->query->fetch_array(); 
     return $results['post_id']; 
    } else { 
     return "Error"; 
    } 
} 
0

Это проблема с PHP. Начиная с этого поста PHP не поддерживает вложенные классы. Есть шанс, который может измениться в версии 7.0, но, насколько мне известно, он не находится в стадии разработки.

Я думаю, что вам лучше всего было бы просто использовать свой класс, чтобы расширить класс MySQLi как в:

class webFile extends mysqli { 

Вы можете заблокировать его некоторые. Говоря об этом, обратите внимание, что конструкция MySQLi автоматически не будет вызвана вашим собственным методом __construct(), поэтому вам, возможно, придется обойти это.

Вы также можете использовать процедурные функции MySQLi для достижения желаемого результата без расширения класса MySQLi, в который я искал, когда нашел этот пост, который в настоящее время имеет более 2600 просмотров и окончательно не отвечает на ваш вопрос.

Ориентация объектов PHP не такая надежная, как некоторые, надеюсь, это изменится в ближайшие годы. PHP 7.0 поддерживает анонимный экземпляр класса, который является признаком того, что он может вскоре поддерживать вложенные классы.

EDIT: Я нашел ссылку на PHP.net, которая охватывает переопределение конструкции. Видимо ваша собственная конструкция не будет перезаписывать MySQLi, но вы должны вызвать его вручную, как в:

parent::__construct($host,$user,$pass,$db); 

http://php.net/manual/en/mysqli.construct.php

-1

В PHP 5.3 делает инициализацию Mysqli объект внутри конструктора класса ломает код. Мне пришлось передать объект mysqli в качестве параметра класса для его работы. Это недопустимо:

function __construct() { 
    $this->sql = new mysqli('host','user','pass','dbname'); 
} 

Но это будет работать:

function __construct($mysqli) { 
    $this->sql = new mysqli('host','user','pass','dbname'); 
} 

где параметр $ MySQLi может быть

new mysqli('host','user','pass','dbname'); 

передается от исполняющего PHP скрипта. У класса mysqli, похоже, есть проблема. Я надеюсь, что они исправит это в php 7. Другой способ работы - расширить его как план на страницах справочника php.

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