2016-12-17 1 views
0

Я знаю, что это основной вопрос, но из-за недостатка знаний я хочу знать, как mysqli_result преобразован в массив и результат был восстановлен.Результат вычисления Mysqli foreach resultset преобразован в массив

Вот база данных:

CREATE TABLE IF NOT EXISTS `slider` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 

INSERT INTO `slider` (`id`, `title`) VALUES 
(1, 'Slider 1'), 
(2, 'Slider 2'), 
(3, 'Slider 3'), 
(4, 'Slider 4'), 
(5, 'Slider 5'), 
(6, 'Slider 6'), 
(7, 'Slider 7'), 
(8, 'Slider 8'); 

Вот PHP файл:

$mysqli = new mysqli('host', 'user', 'pass', 'db',port); 

if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
      . $mysqli->connect_error); 
} 

$query = "SELECT * FROM slider ORDER BY id"; 
if ($result = $mysqli->query($query)) { 
    echo "<pre>"; print_r($result); //This is mysqli_result Object 

    foreach($result as $row) { //Here is the magic how it is converted and row is retrieved 
     //echo "<pre>"; print_r($row); 
     printf ("<br>%s (%s)\n", $row["id"], $row["title"]); 
    } 

    while ($row = $result->fetch_assoc()) { //Normal way 
     //echo "<pre>"; print_r($row); 
     printf ("<br>%s (%s)\n", $row["id"], $row["title"]); 
    } 

    $result->free(); 
} 

Когда мы пересекаем через некоторое время, мы должны получить результат, используя fetch_ * методы, но когда я пройти через foreach, как результат получается? Как неявно, цикл foreach вызывает fetch_ *?

+0

Это класс, который реализует интерфейс 'Traversable', поэтому использование' foreach() 'автоматически выбирается. – Barmar

+0

Интересно знать, я пройду через это. – Kamal

ответ

0

Этот вопрос не является основным на самом деле, поскольку это поведение является довольно новым, и на самом деле оно использует магию.

Как вы можете прочитать на manual page, объект mysqli_result поддерживает Traversable interface, так может повторяться через. И когда он повторяется, он вызывает внутреннюю линию fetch().

Поэтому он не преобразован, а скорее замаскирован под массив.

+0

Спасибо за ваш ответ, я проверю его. – Kamal

0

Это класс PHP, который я использую RTmysqli.

Использование:

$RTmysqli= new RTlib\RTphp\RTmysqli(); 
$RTmysqli->config(DB_HOST, DB_UNAME, DB_PWORD, DB_NAME); 

$result = $RTmysqli->query("SELECT * FROM slider ORDER BY id"); 

if (!empty($result)) { 
    foreach($result as $row) { 
     print "<br>" . $row["id"] . "(" . $row["title"] . ")\n"; 
    } 
} 

Надеется, что это помогает. :)