mysqli fetch_array不会迭代

时间:2016-01-11 04:59:51

标签: php mysql mysqli

请注意以下代码: CLASS

namespace hfdDB;
class HFD_DB
{
/**
 * @return \mysqli
 */
public static function getConnection()
{
    require_once('globals.php');

    return new \mysqli(DBHOST, DBUSER, DBPASSWORD, DBNAME);

}

/**
 *
 */
public static function getAllItems()

{
    $conn = self::getConnection();  //open connection
    $sql="SELECT * FROM HFD_ITEMS"; //command text
    $cmdAllItems = $conn->prepare($sql); // command
    $cmdAllItems->execute(); //execute command
    $allItems = $cmdAllItems->get_result(); //assign result
    echo $allItems->num_rows." rows returned<br>";
    $itemsArray = []; //array for storing result rows

    echo "result set (first row): ";
    var_dump($allItems);
    echo "<br>";

    if (!empty($allItems) ) {
        while ($item = $allItems->fetch_array(MYSQLI_ASSOC)) ;
        {
            echo "fetch result: ";
            var_dump($item);
            echo "<br>";
            array_push($itemsArray, $item);  //add to array
        }

        return json_encode($itemsArray); //return json
    } else {
        return "NO DATA"; //return error
    }
}

================================== login.php ====

<?php
/**
* Created by PhpStorm.
* User: Mark
* Date: 1/10/2016
* Time: 7:08 PM
*/



require_once("HFD_DB.php");
$allItems_json = \hfdDB\HFD_DB::getAllItems();
if (!empty($allItems_json)) {
    echo "Data: ";
echo $allItems_json;
} else {
    echo "NO DATA";

}

和我的结果:(从phpStorm IDE运行时)

6730 rows returned
result set (first row): 
object(mysqli_result)#3 (5) 
{
    ["current_field"]=> int(0)
    ["field_count"]=> int(10) 
    ["lengths"]=> NULL 
    ["num_rows"]=> int(6730) 
    ["type"]=> int(0) 
} 


fetch result: NULL

Data: [null] 

注意:6370是此查询的预期行数。那么为什么我不循环6370遍循环?

我对Coding或SQL并不陌生,尽管我是PHP的新手。

我在这里缺少什么?

感谢。

2 个答案:

答案 0 :(得分:0)

您获取了一个数组数组。你应该使用for - each循环。

while ($item = $allItems->fetch_array(MYSQLI_ASSOC)) ;
    {
        echo "fetch result: ";
        var_dump($item);
        echo "<br>";
        array_push($itemsArray, $item);  //add to array
    }

运行一次,分配整个数组结构数组。 - &gt; fetch_array一次性获取所有内容,而不是像fetch_assoc。

ForEach (($allItems->fetch_array(MYSQLI_ASSOC)) as $Item)
    {
        echo "fetch result: ";
        var_dump($item);
        echo "<br>";
        array_push($itemsArray, $item);  //add to array
    }

使用foreach迭代数组数组并将Named(Assoc)数组放入$ item变量中,这正是您所期望的。

答案 1 :(得分:0)

我发现我的问题很简单:json_encode需要第二个argyument:depth。事实证明,深度等于返回的最大行数。默认值为512.将代码更改为:

json_encode($itemsArray,10000)      

修复了问题。