0

これは StackOverflow に関する私の最初の質問であり、率直に言って、私は PHP にかなり慣れていません。簡単な注意事項をお伝えします ;)

3 層アーキテクチャで OOP ベースの Web サイトを構築しています。データ抽象化レイヤーには、データベースとの通信に必要なすべての機能を含む、DbAdapter という名前のオブジェクトがあります。これらの関数の 1 つが次のとおりです。read($sql) は、SQL クエリを受け取り、結果を 2 次元配列に格納します。

このために、ネストされた 2 つの for ループ (行ごとに 1 つと列ごとに 1 つ) を使用します。イテレータ $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;
        }
    }
}
4

4 に答える 4

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

あなたの設定ファイルで。
そのような間違いを (この場合は未定義の定数 i を使用して) 監視し、通知するように PHP に指示します。

于 2011-02-11T14:39:18.943 に答える
2

あなたができない理由:

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

両方のループの代わりに?このようにフィールド名/値を個別にフェッチすると、フィールド名/値が既に含まれている連想行をフェッチする場合に比べて、非常に遅くなります。

個人的には、チェリオを箱から取り出してボウルに入れ、牛乳を一滴垂らして食べ、箱に戻って別のチェリオを食べるよりも、ボウル一杯のチェリオを食べる方が好きです.

于 2011-02-11T14:37:47.700 に答える
2

ここにあなたの犯人がいる$前に、私の推測では行方不明です:i

           $this->loadedRows[i] = $loadedFields;
于 2011-02-11T14:39:36.643 に答える
1

私があなたなら、これらの古い mysql 関数の代わりに PDO を使用します。 PDOStatement::fetchAllは必要なことを行います。

于 2011-02-11T14:40:13.597 に答える