2013-10-15 2 views
-2

Я пытаюсь преобразовать свой класс sql в более подходящий. Конструктор класса выглядит следующим образом:Проблема с PHP mysqli class

class sql{ 

private $db_name = CONFIG_DB_NAME; 
private $db_user = CONFIG_DB_USER; 
private $db_pass = CONFIG_DB_PASS;  
private $db_host = CONFIG_DB_HOST; 
private $use_pconnect = CONFIG_DB_USEP; 


function __construct(){ 

    if($this->use_pconnect){ 

     $connection = new mysqli('p:'.$this->db_host, $this->db_user, $this->db_pass, $this->db_name); 
    }else{ 

     $connection = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name); 
    } 

    if($connection->connect_errno){ 

     $this->sql_handle_errors($connection->connect_error, __FILE__, __LINE__); 
     exit(); 
    } 

    $this->connection = $connection; 

    // Set DB charset 
    if(!mysqli_set_charset($this->connection, CONFIG_CHARSET)){ 

     $this->sql_handle_errors(mysqli_error($this->connection), __FILE__, __LINE__); 
    } 

    if(file_exists(PATH_LOGS.'sql.txt')){ 

     $this->test_query = true; 
    } 
} 
} 

$sql = new sql; 

И результат я тестирование выглядит следующим образом:

$result = $sql->connection->prepare("SELECT * FROM admin WHERE id = :id LIMIT 1"); 
$result->bind_param(':id', '1'); 
$result->execute(); 
$result->store_result(); 
$result->fetch(); 

Его говоря функция bind_param не может быть найдена. Почему? Благодарю.

+0

Вы проверили ошибку после того, как вы «подготовили» свое заявление? – Jon

ответ

0

если весь код находится в выше, и вы хотите, чтобы сделать класс наследование от MySQL сделать ниже изменения:

class sql 

к

class sql extends mysqli 

И создать новый экземпляр из SQL класса

$sql = new sql(//); 
$result ...///// 

хорошее блокирование

+0

Я просто попробовал это, и я все еще получаю ту же ошибку. :( – Jay

+0

это все ваше определение класса? Где вы определили db_host и другую переменную? – Aqil

+0

Они определены в классе как 'private'. Все подключается и работает, потому что у меня есть система db, работающая без подготовленных операторов, теперь я пытаюсь преобразуйте класс в готовый оператор. – Jay

1

В вашем классе SQL есть несколько проблем.

Начиная с конца: конструктор никогда ничего не возвращает! return $connection; не служит никакой цели. Убери это.

Затем вы используете несколько свойств класса, которые не объявлены: $this->use_pconnect, $this->db_host и т. Д. Вы опустили их в своем коде или их действительно нет? Это тоже будет ошибкой.

Также вы вызываете несколько методов, которые также отсутствуют в вашем коде, например $this->sql_handle_errors().

Вы должны быть в состоянии избежать использования процедурного стиля в этой строке: if(!mysqli_set_charset($this->connection, CONFIG_CHARSET)) должен быть if(!$this->connection->set_charset(CONFIG_CHARSET)), потому что это правильный объектно-ориентированный стиль.

И последнее, но не менее важное: ваше использование вашего класса невелика. В основном вы используете его для создания экземпляра mysqli, а затем хотите всегда использовать этот экземпляр. Хотя это не так уж плохо, в этом нет никакой реальной ценности, потому что все вещи, которые вы обычно хотели бы на вершине mysqli, требуют обертывания этого экземпляра, не подвергая его воздействию и напрямую используя его.

Один последний намек: вы должны научиться отлаживать. Используйте var_dump(), чтобы узнать, какое значение находится внутри вашей переменной. Дамп возвращаемого значения $sql->connection->prepare(), чтобы узнать, является ли он экземпляром mysqli_stmt или нет.

+0

Все, что вы упомянули о том, что не в классе, есть, я просто взял его, чтобы вы, ребята, могли читать меньше. Спасибо за ваш вклад. Каким образом вы бы предложили сделать этот класс, чтобы я мог, по возможности, использовать только '$ sql' в качестве глобальной переменной в любом месте сайта. Спасибо mate – Jay

+0

'var_dump' дает мне так:' boolean false' – Jay

+0

Что-то пошло не так, и ошибка не была обработана. Это то, что я имею в виду, когда вы работаете с оригинальным экземпляром mysqli. Вам необходимо запрограммировать метод 'prepare()' в вашем собственном классе, который передает SQL во внутренний экземпляр mysqli и проверяет наличие ошибок и обрабатывает их для вас. Если ошибок нет, вероятно, стоит вернуться не к исходному объекту mysqli_stmt, а к другому завернутому объекту, который может помочь вам в дальнейшем.Кроме того: наличие конфигурации, жестко закодированной в свойствах, не очень помогает, потому что вы не можете изменить их до создания экземпляра, а затем слишком поздно. – Sven

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