PHP中的循环/数组问题很奇怪

时间:2011-02-11 14:31:40

标签: php multidimensional-array for-loop 3-tier

这是我在StackOverflow上的第一个问题,坦率地说,我对PHP很新。只是为了给你一个简短的提醒;)

我正在构建一个基于OOP的网站,采用3层架构。在我的数据抽象层中,我有一个名为DbAdapter的对象,它包含与数据库通信所需的所有功能。其中一个函数如下:read($ sql),它接受一个SQL查询并将结果存储在一个二维数组中。

为此,它使用两个嵌套的for循环(一个用于行,一个用于每行的列)。而迭代器$ i像往常一样递增,不知何故,数组的最后一个元素被覆盖。

我完全不知道这是怎么可能的,所以我犯的错误必须非常愚蠢。

有人想帮助新手吗?

先谢谢你,Sam

public $loadedRows;
public function read($sql)
{
    if ($this->connect())
    {
        $result = mysql_query($sql);
        if ($result)
        {
            $totalRows = mysql_num_rows($result);
            $totalFields = mysql_num_fields($result);

            for ($i = 0; $i < $totalRows; $i++)
            {
                for ($j = 0; $j < $totalFields; $j++)
                {
                    $fieldName = mysql_field_name($result, $j);
                    $loadedFields["$fieldName"] = mysql_result($result, $i, $fieldName);
                }

                $this->loadedRows[i] = $loadedFields;
            }

            $this->closeConnection();
            return $this->loadedRows;
        }
    }
}

4 个答案:

答案 0 :(得分:5)

你在$this->loadedRows[$i]

之前忘了$

并且此代码应该更短:

public function read($sql)
{
    $a = array();
    $result = mysql_query($sql);
    if ($result)
    {
        while($row = mysql_fetch_assoc($res)) $a[]=$row;
    }
    return $a;
}

那就是全部。

要自己捕获这些错误,您应该将错误报告级别设置为E_ALL
要做到这一点,你可以添加这一行

error_reporting(E_ALL);
配置文件中的

它将告诉PHP观察此类错误(在这种情况下使用未定义的常量i)并通知您

答案 1 :(得分:2)

你不能做任何理由:

while($row = mysql_fetch_assoc()) {
    $this->loadedRows[] = $row;
}

代替你的两个循环?与仅获取其中已具有fieldname / values的关联行相比,像这样单独获取字段名/值是非常慢的。

就我个人而言,我更喜欢吃一碗麦片,而不是单独从盒子里拿出一盒,把它放在碗里,倒在一滴牛奶上,吃掉它,然后再回到另一个盒子里。

答案 2 :(得分:2)

我的猜测是$之前缺少i这是你的罪魁祸首:

           $this->loadedRows[i] = $loadedFields;

答案 3 :(得分:1)

如果我是你,我会使用PDO而不是这些旧的mysql函数。 PDOStatement::fetchAll可以满足您的需求。