PHP 内爆数组以创建查询

PHP implode array to create query

想法是创建以下内容:

$sql = "SELECT column1, column2 FROM table1
UNION SELECT column1, column2 FROM table2
UNION SELECT column1, column2 FROM table3
ORDER BY 'column3'";

不过我想让它保持干燥,所以我已经想到了以下我可能会使用的可能的几十个表:

$tables = array('table1', 'table2', 'table3');
$array_of_tables = array('SELECT column1, column2 FROM ', $tables[0]);

for($i = 1; $i < count($tables); $i++){
    array_push($array_of_tables, "UNION SELECT column1, column2 FROM " . $tables[$i]);
}

array_push($array_of_tables, "ORDER BY 'eng'" . '"');

$sql = implode('', $array_of_tables);

我得到了正确的字符串,但是我无法使用它。任何人都可以告诉我发生了什么以及如何解决它 - 请用新手术语解释!我是 PHP 的新手并决定试一试,尽管一半的互联网都说这不值得。干杯!

你的想法是对的,就是细节有问题:

  1. 你正在内爆的片段之间没有空格,所以它最终像 ... FROM table1UNION SELECT ...。使用 implode(' ', $array_of_tables).
  2. ORDER BY 子句中的列有引号。这将按文字字符串而不是列值排序。参见 When to use single quotes, double quotes, and backticks in MySQL

如果您需要经常组合这些 table,您可能需要考虑使用 MySQL 的 MERGE Storage Engine。这允许您创建一个虚拟 table,其内容是其他几个 table 的组合。

试试这个

<?php
$tables = array('table1', 'table2', 'table3');
$array_of_tables = array('SELECT column1, column2 FROM ', $tables[0]);

for ($i = 1; $i < count($tables); $i++) {
    array_push($array_of_tables, " UNION SELECT column1, column2 FROM " . $tables[$i]);
}

array_push($array_of_tables, " ORDER BY 'eng'");

$sql = implode('', $array_of_tables);

我不明白 for 循环的意图。我会这样解决:

$tables = array('table1', 'table2', 'table3');
$sel = "SELECT column1, column2 FROM ";
$sql = $sel . implode(" UNION $sel",$tables) . " ORDER BY 'eng'";