Я пытаюсь изменить следующий код, чтобы использовать 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()».
Похож на '$ 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" '. –
Это означает, что вы не включаете 'display_errors', потому что' resource_get() 'должен вызывать предупреждения. Всегда при разработке кода, 'error_reporting (E_ALL); ini_set ('display_errors', 1); ' –
Спасибо, Майкл. Это решило. Я просто удалил цикл while и сделал $ return = $ resource, и он работает! Это был не мой код, и я, честно говоря, не понимал, зачем мне нужен вызов resource_get() и с MySqli, я думаю, я этого не делаю. – user1780242