PHP“变量包装器”作为多个数据库上的SQL查询的数组

时间:2019-03-01 12:43:09

标签: php mysql arrays

我有50个具有相同设计和结构的数据库。为了对其中包含的数千个变量进行基准数据分析和评估,我需要构建SQL查询。我有一个SuperAdmin帐户,该帐户有权通过SSH访问来查看所有这些数据库。

现在,我可以使用UNION ALL这样(简化)来编写将一个数据库与另一个数据库的数据合并在一起的SQL查询:

SELECT * FROM db1.table WHERE blah
UNION ALL
SELECT * FROM db2.table WHERE blah
UNION ALL
[...]
SELECT * FROM db50.table WHERE blah

这些查询都在PHP环境中,并且像超级按钮一样工作-我得到了所有想要的数据分析和评估。

但是:

在我的情况下,单个SQL查询包含约1.000行查询语句和条件代码。以这种顺序的方式查询50个数据库意味着我的查询变得很大,并且每次复制一次SQL语句(将“ db1”调整为“ db50”)以及很多JOIN语句时,我都不得不做很多容易出错的事情。变得无处可去,变得费时。

我的问题:

没有一种方法可以告诉PHP将所有“ dbx”放入数组中,然后通过使用foreach或while或将“ dbx”从1交换为50来仅重申一个基本的SQL查询。类似的说法?

例如:

<?php
    function getResultValuesFromDatabase() {
        global $DATABASE;

        $db1 = "database1";
        $db2 = "database2";
        [...]
        $db50 = "database50";
        $no_of_databases = array($db1, $db2, [...], $db50);
        foreach ($no_of_databases as $value) {
            $sql_query = "SELECT * FROM $value.table WHERE blah";
        }
        $rQuery = mysql_query($qQuery, $oDatabase);
        $result = array("count" => mysql_num_rows($rQuery ), "result" => $rQuery);
        return $result;
    }

我收到一个影响重复过程的错误。有人可以告诉我我的逻辑错误在哪里吗?

2 个答案:

答案 0 :(得分:3)

您不需要名称数组。由于它们都很相似,因此一个简单的for循环应该可以为您工作。您还需要在循环中进行查询并累积结果,然后再返回它们。

for ($db = 1;$db <= 50;$db++) {
     $sql_query = 'SELECT * FROM database' . str_pad($db,2,'0',STR_PAD_LEFT) . '.table WHERE blah';
     $rQuery = mysql_query($qQuery, $oDatabase);
     $result[] = array("count" => mysql_num_rows($rQuery ), "result" => $rQuery);
}
return $result;

答案 1 :(得分:1)

当然可以,但是在执行任何请求之前必须更改数据库。

另外,请注意,mysql_*函数已被弃用,您必须考虑将其更改为mysqliPDO

这是您的方法:

function getResultValuesFromDatabase()
{
    $result = [];

    $con = mysqli_connect("localhost","my_user","my_password");

    for ($i = 1; $i <= 50; $i++) {
         $databaseName = 'database' . str_pad($i, 2, '0', STR_PAD_LEFT);

         mysqli_select_db($con, $databaseName);

         // Probably the database doesn't exist
         if (mysqli_errno($con) !== 0) {
             continue;
         }

         $queryResult = mysqli_query($con, "SELECT * FROM table WHERE blah");

         $result[$databaseName] = [
             'count'  => mysqli_num_rows($queryResult),
             'result' => mysqli_fetch_all($queryResult, MYSQLI_ASSOC)
         ];

         mysqli_free_result($queryResult);
    }

    mysqli_close($con);

    return $result;
}