【问题标题】:Strange for loop / array problem in PHPPHP中奇怪的for循环/数组问题
【发布时间】:2011-06-25 14:30:54
【问题描述】:

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

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

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

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

有人愿意帮助新手吗?

提前致谢,山姆

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;
        }
    }
}

【问题讨论】:

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


【解决方案1】:

任何你不能做的理由:

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

代替你的两个循环?与仅获取已包含字段名/值的关联行相比,像这样单独获取字段名/值非常慢。

就我个人而言,我更喜欢吃一碗cheerios,而不是单独从盒子里拿出一个,放进碗里,倒一滴牛奶,吃完,然后再回到盒子里再吃一个。

p>

【讨论】:

    【解决方案2】:

    你只是在我之前忘记了 $$this-&gt;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)并通知你

    【讨论】:

    • 难以置信!我知道我的错误一定是愚蠢的。非常感谢您的快速回复和编码建议! ;)
    【解决方案3】:

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

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

    【讨论】:

    • @Sam,不用担心。祝你好运^_^
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多