PHP函数用于处理MySQL无限&嵌套查询

时间:2013-02-25 13:13:54

标签: php mysqli nested

我的同事要求我创建一个 PHP 函数来插入我们的Web应用程序来处理无限量的嵌套(循环)查询,让我们的生活更轻松,而不用担心关于失去当前和/或以前的结果。

以下是我在几分钟后提出的代码,似乎它运行正常,但我仍然有这些问题:

  1. 我是否正在重新发明mysqli_prepare功能?
  2. 以这种方式处理这些嵌套查询是否明智?
  3. 使用以下方法可能有什么优点和缺点?
  4. 实际功能:

    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查询是样本。

2 个答案:

答案 0 :(得分: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()。

此外, Till Helge Helwig 绝对正确:所有嵌套查询都可以(并且应该)替换为带有join(和分组)的单个查询。

答案 1 :(得分:1)

以下代码:

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

可以简化为

return $db->query($query);

因为它只是在返回之前将查询结果存储在具有唯一名称的本地变量中。这没有多大意义。