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 函数吗?

绝对没有。
你什么都不准备。

以这种方式处理这些嵌套查询是否明智?

不,碰撞的可能性非常高。至少使用 microtime 而不是 mktime。

使用以下方法有什么优点和缺点?

有很多缺点

  • 没有错误处理
  • 不支持占位符
  • 乱码
  • 整个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 回答