0

私は同僚から、現在および/または以前の結果を失うことを心配することなく、無限の量のネストされた (ループされた) クエリを処理するPHP関数を Web アプリケーションにプラグインして処理するように依頼されました。

数分後に思いついたコードは次のとおりです。問題なく動作しているようですが、まだ次の質問があります。

  1. mysqli_prepare関数を再発明していますか?
  2. このようにネストされたクエリを処理するのは賢明でしょうか?
  3. 次のアプローチを使用することの長所と短所は何ですか?

実際の機能:

function qn($query) {
    global $db;
    $rand_var = 'r' . mktime() . mt_rand();
    $$rand_var = $db->query($query);
    return $$rand_var;
}

そして実際に:

if (($db instanceof mysqli) != true) {
   $db = new mysqli(DB_ADDRESS, DB_USER, DB_PASS, DB_NAME);
}

$a = qn('SELECT DISTINCT ***');

while ($row_a = $a->fetch_assoc()) {
    // do some stuff
    $b = qn('SELECT ***' . $row_a['foo']);
    while ($row_b = $b->fetch_assoc()) {
        $c = qn('SELECT COUNT(id)' . $row_b['bar']);
        // keep going ...
    }
}

注: SQL クエリはサンプルです。

4

2 に答える 2

2

どうぞ: SafeMysqlはあなたが探しているものであり、他にもたくさんあります!

if (!($db instanceof safemysql)) {
   $db = new safemysql(...);
}

$a = $db->getCol('SELECT DISTINCT ***');
foreach ($a as $foo) {
    // do some stuff
    $b = $db->getAll('SELECT ***', $foo);
    foreach ($b as $row_b) {
        $c = $db->getOne(('SELECT COUNT(id)', $row_b['bar']);
         // keep going ...
    }
}

あなたの質問に答えるために

mysqli_prepare 関数を再発明していますか?

間違いなくいいえ。
あなたは何も準備していません。

このようにネストされたクエリを処理するのは賢明でしょうか?

いいえ、衝突の可能性はかなり高いです。少なくとも、mktime の代わりに microtime を使用してください。

次のアプローチを使用することの長所と短所は何ですか?

デメリットが多い

  • エラー処理なし
  • プレースホルダーのサポートなし
  • 乱雑なコード
  • 機能全体qn()が役に立たない。代わりに $db->query() を単独で使用できます。

また、 Till Helge Helwigは完全に正しいです。すべてのネストされたクエリは、結合 (およびグループ化) を使用した単一のクエリに置き換えることができます (また、置き換える必要があります)。

于 2013-02-25T13:17:57.950 に答える
1

次のコード:

$rand_var = 'r' . mktime() . mt_rand();
$$rand_var = $db->query($query);
return $$rand_var;

に簡略化できます

return $db->query($query);

クエリ結果を返す前に、一意の名前のローカル変数に格納するだけです。これはあまり意味がありません。

于 2013-02-25T13:29:35.507 に答える