2014-08-30 2 views
0

Я пытаюсь изменить следующий код, чтобы использовать MySqli вместо MySql. Я удалил несколько методов, которые кажутся несущественными для того, что я здесь рассматриваю.Обработка результатов запроса MySQLi после преобразования MySql в MySqli

class db { 
    var $hostname, 
     $database, 
     $username, 
     $password, 
     $connection, 
     $last_query, 
     $last_i, 
     $last_resource, 
     $last_error; 

    function db($hostname=DB_HOSTNAME,$database=DB_DATABASE,$username=DB_USERNAME,$password=DB_PASSWORD) { 
     $this->hostname = $hostname; 
     $this->database = $database; 
     $this->username = $username; 
     $this->password = $password; 

     $this->connection = mysql_connect($this->hostname,$this->username,$this->password) or $this->choke("Can't connect to database"); 
     if($this->database) $this->database($this->database); 
     } 

    function database($database) { 
     $this->database = $database; 
     mysql_select_db($this->database,$this->connection); 
     } 

    function query($query,$flag = DB_DEFAULT_FLAG) { 
     $this->last_query = $query; 

     $resource = mysql_query($query,$this->connection) or $this->choke(); 
     list($command,$other) = preg_split("|\s+|", $query, 2); 

     // Load return according to query type... 
     switch(strtolower($command)) { 
      case("select"): 
      case("describe"): 
      case("desc"): 
      case("show"): 
       $return = array(); 
       while($data = $this->resource_get($resource,$flag)) $return[] = $data; 
       //print_r($return); 
       break; 
      case("replace"): 
      case("insert"): 
       if($return = mysql_insert_id($this->connection)) 
        $this->last_i = $return; 
       break; 
      default: 
       $return = mysql_affected_rows($this->connection); 
      } 

     return $return; 
     } 

    function resource_get($resource = NULL,$flag = DB_DEFAULT_FLAG) { 
     if(!$resource) $resource = $this->last_resource; 
     return mysql_fetch_array($resource,$flag); 
     } 
    } 

Это то, что я получил до сих пор:

class db { 
    var $hostname = DB_HOSTNAME, 
     $database = DB_DATABASE, 
     $username = DB_USERNAME, 
     $password = DB_PASSWORD, 
     $connection, 
     $last_query, 
     $last_i, 
     $last_resource, 
     $last_error; 

    function db($hostname, $database, $username, $password) { 
     $this->hostname = $hostname; 
     $this->database = $database; 
     $this->username = $username; 
     $this->password = $password; 

     $this->connection = new mysqli($this->hostname, $this->username, $this->password, $this->database) or $this->choke("Can't connect to database"); 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 


     if($this->database) 
      $this->database($this->database); 
    } 

    function database($database) { 
     $this->database = $database; 
     mysqli_select_db($this->connection, $this->database); 
    } 

    function query($query, $flag = DB_DEFAULT_FLAG) { 
     $this->last_query = $query; 
//print_r($query); 
     $result = mysqli_query($this->connection, $query) or $this->choke("problem connecting to DB"); 
while($row=mysqli_fetch_assoc($result)) { 
$resource[]=$row; 
} 
//print($command); 
//print_r($resource);print("<br>"); 
     list($command, $other) = preg_split("|\s+|", $query, 2); 

     // Load return according to query type... 
     switch(strtolower($command)) { 
      case("select"): 
      case("describe"): 
      case("desc"): 
      case("show"): 
       $return = array(); 
       while($data = $this->resource_get($resource, $flag)) 
        $return[] = $data; 
       //print_r($return); 
       break; 
      case("replace"): 
      case("insert"): 
       if($return = mysqli_insert_id($this->connection)) 
        $this->last_i = $return; 
       break; 
      default: 
       $return = mysqli_affected_rows($this->connection); 
      } 

     return $return; 
     } 

    function resource_get($resource = NULL, $flag = DB_DEFAULT_FLAG) { 
     if(!$resource) 
      $resource = $this->last_resource; 
     return mysqli_fetch_array($resource, $flag); 
    } 

Так вот проблема: Я проверил результаты с print_r() и массив $ ресурс загружается правильно, но значение $ return при проверке с помощью print_r() просто заканчивается «Array()». Поэтому, насколько я могу понять, что-то не правильно обрабатывается в этой части кода, поэтому я включил resource_get() вызов функции:

  $return = array(); 
      while($data = $this->resource_get($resource, $flag)) 
       $return[] = $data; 
      //print_r($return); 
      break; 

Если я использую mysqli_fetch_row ($ ресурсов, $ flag) вместо mysqli_fetch_array ($ resource, $ flag) Я все равно получаю тот же результат, то есть print_r ($ return) дает просто «Array()».

+1

Похож на '$ resource' _already_ содержит массив результатов, потому что' while ($ row = mysqli_fetch_assoc ($ result)) {$ resource [] = $ row; } '. Когда вы передаете '$ resource' в' $ this-> resource_get() ', его вызов' mysqli_fetch_array() 'получает массив вместо ресурса результата. Не беспокойтесь о методе 'resource_get()', если вы уже извлекли строки. Чтобы проверить это для себя, просто 'print_r ($ resource)' перед 'switch' или в' switch: "show" '. –

+0

Это означает, что вы не включаете 'display_errors', потому что' resource_get() 'должен вызывать предупреждения. Всегда при разработке кода, 'error_reporting (E_ALL); ini_set ('display_errors', 1); ' –

+0

Спасибо, Майкл. Это решило. Я просто удалил цикл while и сделал $ return = $ resource, и он работает! Это был не мой код, и я, честно говоря, не понимал, зачем мне нужен вызов resource_get() и с MySqli, я думаю, я этого не делаю. – user1780242

ответ

1

Переменная $resource не представляет ресурсный объект mysqli_result во время передачи его в $this->resource_get(). Вместо этого, это уже 2D массив результатов, поскольку вы ранее запускали цикл mysqli_fetch_assoc().

Чтобы сделать эту работу с текущим кодом, вы можете либо удалить ранее цикла выборки:

$result = mysqli_query($this->connection, $query) or $this->choke("problem connecting to DB"); 
// Remove this 
//while($row=mysqli_fetch_assoc($result)) { 
// $resource[]=$row; 
//} 

И позже, проходят $result вместо $resource в ваш метод resource_get(), так как это $result, что является объектом ресурсов ,

Или вы можете просто полностью пропустить звонок resource_get() и вернуть $resource непосредственно с тех пор, как он уже содержит массив результатов.

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