2013-09-17 3 views
0

Я получаю ошибку ниже при выполнении подготовленное заявлениеПодключение к серверу MySQL во время исключения запроса

(2013) Потеряно соединение с сервером MySQL во время queryexception
Я проверил почти все вопросы размещены на этом перед публикацией, но не смог найти ответ. поэтому, пожалуйста, не закрывайте.

Я новичок в PHP и MYSQL так, пожалуйста, поправьте, если я сделал какую-либо ошибку
мой код: -

<?php 
class sanitize_insert{ 
protected $prepared_stmt; 
protected $db_sqli; 
public function prepare_sanitized_insert($created_by) 
{ 
    if(!is_integer($created_by)) 
    { 
     throw new InvalidArgException("Invalid argument(s) type. Expected integer(s)"); //to be defined 
    } 



    $query = "insert into requests_v(user_id,property_id,request_type,description,to_user_id,created_on,last_update_date,created_by,last_updated_by) values (?,?,?,?,?,now(),now(),8,8);"; 
      if(!is_resource($this->db_sqli)) 
    { 
     $this->db_sqli = mysqli_connect('host','user','password','dbname'); 
    } 
    if(!$this->prepared_stmt = $this->dbh->prepare($query)) 
    { 
     return false; 
    } 
    $this->prepared_stmt->bind_param('iiisi', $user_id, $property_id, $req_type, $desc,$to_id); 
    //$result = $this->db_sqli->execute($this->prepared_stmt); 
    return true; 
} 

public function execute_insert() 
{ 
    if(!is_object($this->prepared_stmt)) 
    { 
     return false; 
    } 
    if(!is_resource($this->db_sqli)) 
    { 
     $this->db_sqli = mysqli_connect('host','user','password','dbname'); 
    } 
    $result = $this->prepared_stmt->execute(); 
    return $result; 
} 


} 

Когда я исполняю подготовленное заявление внутри метода «prepare_sanitized_insert», он получает выполняется без ошибок, но когда я исполню ее внутри метода «execute_insert» он терпит неудачу с ошибкой: -

(2013) Затерянный подключение к серверу MySQL во время запроса

var_dump подготовленного оператора перед выполнением
объект (mysqli_stmt) # 4 (10) {["affected_rows"] => int (0) ["insert_id"] => int (0) ["num_rows "] => int (0) [" param_count "] => int (5) [" field_count "] => int (0) [" errno "] => int (2013) [" error "] => string (44) «Потерянное соединение с сервером MySQL во время запроса» ["error_list"] => array (1) {[0] => array (3) {["errno"] => int (2013) ["sqlstate"] => string (5) "HY000" ["error"] => string (44) «Потерянное подключение к серверу MySQL во время запроса»}} ["sqlstate"] => string (5) "HY000" ["id"] => int (1)}

Не могли бы вы помочь?

+0

ли казнить вы 'prepare_sanitized_insert()' перед 'execute_insert()'? – 01e

+0

Да, я выполнил prepare_sanitized_insert() до execute_insert(). –

+0

Почему вы используете 'mysqli_connect' для назначения db_sqli в' prepare_sanitized_insert() 'и' db_factory :: get_db_sqli() 'в' execute_insert() '? Можете ли вы log/echo в инструкции if, чтобы узнать, пытается ли переназначить переменную? – aynber

ответ

0

Вы перепутали объектно-ориентированный стиль и процедурный стиль.

объектно-ориентированный стиль
Обратите внимание на новый

$this->db_sqli = new mysqli('host','user','password','dbname'); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$query = "insert into requests_v(user_id, ...) values (?,?,?,?,?,now(), ...)"; 

неправильно

if(!$this->prepared_stmt = $this->dbh->prepare($query)) { 

правильно

if ($this->prepared_stmt = $this->db_sqli->prepare($query)) { 

    $this->prepared_stmt->bind_param('iiisi', $user_id, $property_id, ..., ...); 

стиль

Prozedural (Процедурный стиль был использован в вопросе)
Примечание без нового

$this->db_sqli = mysqli_connect('host','user','password','dbname'); 
... 
$query = "insert into requests_v(user_id, ...) values (?,?,?,?,?,now(), ...)"; 

неправильно

if (!$this->prepared_stmt = $this->db_sqli->prepare($query)) { 

правильно

if (!$this->prepared_stmt = mysqli_prepare($this->db_sqli, $query)) { 

неправильно

$this->prepared_stmt->bind_param('iiisi', $user_id, $property_id, ...,...); 

правильно

mysqli_stmt_bind_param($this->prepared_stmt,'iiisi',$user_id, ..., ...,...); 

неправильно

$result = $this->prepared_stmt->execute(); 

правильно

$result = mysqli_stmt_execute($this->prepared_stmt); 

Вы должны решить для одного из двух object-oriented style или procedural style.


можно использовать конструктор (также упоминается @Saber Хадж Rabiee)
объектно-ориентированный стиль

class sanitize_insert{ 

    protected $prepared_stmt; 
    protected $db_sqli; 
    public $OK = TRUE; 

    public function __construct($host, $user, $pass, $db) 
    { 
    $this->db_sqli = new mysqli($host, $user, $pass, $db); 
    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     $this->OK = FALSE; 
    } 
    } 

называют это как

$sanitizeclass = new sanitize_insert($host, $user, $pass, $db); 
if ($sanitizeclass->OK) { 
    .... 
} 
+0

спасибо за помощь. Первоначально я использовал только оо подход, но затем я столкнулся с этой ошибкой, я переместил код подключения к базе данных в этот файл и смешал оба стили, пытаясь избавиться от ошибки. –

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