我有50个具有相同设计和结构的数据库。为了对数据分析进行基准测试和评估其中包含的几千个变量,我需要构建SQL查询。我有一个SuperAdmin帐户,他有权通过SSH访问查看所有这些数据库。
现在,我可以编写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个数据库以这种顺序的方式意味着我的查询变得很大,我必须做很多容易出错的问题,以将" DB1"调整为" DB10"的SQL查询语句在许多加入中加上" DB50",因此变成你知道的痛苦,变得既耗时。
我的问题:
我没有一种方法可以告诉PHP将所有" dbx"放入数组中并重申,然后仅通过使用foreach或while或while或a或类似的陈述?
例如:
<?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;
}
我收到一个影响重申过程的错误。有人可以告诉我我的逻辑错误在哪里?
您不需要名称的数组。由于它们都是相似的,因此简单的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;
当然,您可以这样做,但是您必须在执行任何请求之前更改数据库。
另外,请注意,mysql_*
功能已弃用,您必须考虑将其更改为mysqli
或PDO
。
这是您可以做到的:
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;
}