0

PHP 用のシングルトン データベース クラスを作成しました。そして、私はそれがうまく機能していると思っていましたが、実際にはそうではありませんでした。現在、3 つのクエリを含むページを作成しています。1 つはアルバムが存在するかどうかを確認するため、1 はユーザーがアルバムを所有しているかどうかを確認するため、もう 1 つはアルバムから写真を取得するためです。

3 番目のクエリでオブジェクトを設定しますが、最初の 2 つのクエリの結果もその配列にあるため、通知が表示されます。

例を次に示します。

Array
(
[0] => Array
    (
        [id] => 2
        [name] => My new album 1
        [slug] => my-new-album-1
        [user_id] => 1
        [views] => 0
        [datecreated] => 2013/03/23 16:00:43
    )

[1] => Array
    (
        [id] => 3
        [name] => My new album 1
        [slug] => my-new-album-1
        [user_id] => 1
        [views] => 0
        [datecreated] => 2013/03/23 23:51:58
    )

[2] => Array
    (
        [id] => 2
    )

[3] => Array
    (
        [id] => 117
        [title] => 
        [location_id] => 
        [date] => 2013-03-30 00:42:26
        [user_id] => 1
        [album_id] => 2
    )

そして、これは私がクエリを実行して配列を返す方法です:

mysqli_conn::getInstance()->query($sql)->all_assoc()

これは、クエリを実行して結果を返すデータベース クラスの一部です。

public function query( $sql ){

 $starttime = $this->time_to_float();        
 $this->query = mysqli_query($this->connection, $sql);          
 $endtime = $this->time_to_float();
 $exectime = ($endtime - $starttime);


 if (!$this->query){        
    throw new Exception(mysqli_error($this->connection));        
 } else {

    $this->arQueryLog[] = array ( 'query' => $sql, 
                                  'exectime' => $exectime, 
                                  'affected_rows' => mysqli_affected_rows($this->connection),
                                  'last_insert_id' => $this->lastID() );                                      


 }

 return $this;

}

public function all_assoc ()
{
    while($result = mysqli_fetch_assoc($this->query)){
        $this->result[] = $result;
    }

    return $this->result;

}

最後のクエリ結果のみが結果配列にあるようにするにはどうすればよいですか?

ありがとう!!

4

3 に答える 3

0

データベースのクラスに関係のない 2 つの主要な障害

  • すべての変数は、使用前に初期化する必要があります。このコードは失敗します。
  • ローカル データにローカル変数を使用している場合、PHP は上記の障害を許すことさえあります。

したがって、正しいコードは

public function all_assoc ()
{
   $result = array(); //initializing a local variable 
   while($result = mysqli_fetch_assoc($this->query)){
        $result[] = $result;
    }
    return $result;
}

この all_assoc 関数は、クラス プロパティを使用する代わりに $result 変数を使用する方が適切です。

データベース クラスに関連する 1 つの重大な障害。

  • プレースホルダーを使用していないため、クエリは SQL インジェクションに対して脆弱です。

したがって、すでにクラスを開始しているので、SafeMysqlを見てください。これにより、コードが短く安全になります。

于 2013-04-01T05:14:53.863 に答える
0

@Jueecy は設計に関して有効なポイントを持っていると思いますが、完全な実装にアクセスできないため、私たちが持っているもので作業しましょう。

データベース接続をシングルトンに保存することは理にかなっていますが、リクエストごとに複数のクエリを使用する可能性が非常に高いため、クエリ結果をシングルトンに保存することは適切ではありません (データベース接続シングルトンではないことは確かです)。

あなたが共有したコードから、私の最善の提案は、$query値を直接 ($this に保存せずに)単純に返し、 all_assoc()(および関連する関数) を受け入れて直接 ($this に保存せずに)$query返す$resultことです。

カスタム ロジック (関数内のandロジック)を提供する必要がある場合は、ラップするクラスと個々の結果セットをラップするQueryクラスを作成できますが、必要であることを示すコードはまだ提供していません。$queryResultexectimearQueryLogquery()

幸運を、

-デビッド・ファレル

于 2013-04-01T07:00:09.787 に答える
0

結果をクラスの結果プロパティにプッシュしています。シングルトンであるため、以前の値は結果プロパティに残り、all_assoc() メソッドを呼び出すたびに、新しい結果がプロパティにプッシュされます。

新しい結果をプッシュする前に、all_assoc() メソッドで結果プロパティの設定を解除する必要があります。

于 2013-04-01T04:50:20.853 に答える