2013-02-25 10 views
0

我一直在問我的同事做出PHP功能插到我們的Web應用程序來處理嵌套(環形)查詢無限量,使我們的生活更容易PHP函數而不用擔心失去當前和/或以前的結果。處理MySQL的無限和嵌套查詢

這裏是我分鐘後上來的代碼,它似乎工作得很好,但我仍然有一些問題:

  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查詢樣品。

+1

必須說:如果你甚至需要一個「處理嵌套查詢的解決方案」,那麼你的數據模型中可能會有更嚴重的問題。 – 2013-02-25 13:16:43

+0

遞歸是答案。 – 2013-02-25 13:17:48

+1

爲什麼不只是'return $ db-> query($ query);'?哪個首先分配給具有唯一名稱的局部變量? – 2013-02-25 13:17:51

回答

1

下面的代碼:

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

可以簡化爲

return $db->query($query); 

因爲這只是存儲查詢結果在這個獨特的名字局部變量返回之前。這沒有多大意義。

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功能?

肯定沒有。
你什麼都沒準備。

以這種方式處理這些嵌套查詢是否聰明?

不會。碰撞概率相當高。至少使用microtime而不是mktime。

使用以下方法有什麼優點和缺點?

有很多缺點

  • 沒有錯誤處理
  • 沒有佔位符支持
  • 亂碼
  • 整個qn()功能是沒用的。您可以單獨使用$ db-> query()。

此外,直到黑爾格Helwig是絕對正確的:所有的嵌套查詢可以(也應該)與連接(和分組)單查詢替換。

+0

你是對的所有情況下!謝謝! – Mahdi 2013-02-25 13:26:12