0

我正在使用PHP中的搜索功能,所以我确实希望能够研究所有数据库表中的任何关键字,但我无法获取 SQL 语句的结果:

SELECT * FROM All_Tables

这是我的代码:

$getTables = $this->db->query("show tables");
$tmpString = '';

while ($table_data = $getTables->fetch(PDO::FETCH_NUM))
{
    $tmpString.=$table_data[0].',';
}

$ALL_DATABASE_TABLES = substr($tmpString,0,strlen($tmpString)-1); //Remove the last ,

echo " $ALL_DATABASE_TABLES "; //  Works, it shows all database tables

$query = "SELECT * FROM $ALL_DATABASE_TABLES" ; 

$stmt = $this->db->query($query) or die(print_r($this->db->errorInfo())) ;

echo "Cool1"; // Works
echo "$ALL_DATABASE_TABLES "; //Works

// This Loop doesn't work-----------------------
while ($row = $stmt->fetch(PDO::FETCH_NUM)) 
{
    echo "Cool2"; // Doesn't work

    echo "$row[0]" ; // Doesn't work
}
//----------------------------------------------

$stmt->closeCursor();

你对此有什么想法吗?感谢你们

4

1 回答 1

2

您的代码执行以下操作:

  1. 选择数据库中表的完整列表。
  2. 将 #1 中的完整列表组合成一个逗号分隔的列表。
  3. 在查询中使用来自 #2 的逗号分隔列表SELECT *,从而尝试在单个结果中从数据库中的每个表中选择每条记录。

我很惊讶您实际上没有收到错误或超时/警告。原因是因为使用逗号分隔的列表将尝试join在每个表之间进行。从手册:

在没有连接条件的情况下,INNER JOIN 和 ,(逗号)在语义上是等效的:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都连接到第二个表中的每一行)。

当您的表列表增长到甚至三个或四个表并且每个表中有 5 或 6 列以及很长的行列表时,您的查询将永远运行。现在,一个普通的数据库有 10 多个表(至少)——所以 MySQL 要么抛出错误,要么只是超时(根据我的经验)——这就是为什么我觉得你没有收到一个表很奇怪。

除了从数据库中的每个表中选择每条记录之外,您的目标到底是什么?

如果您真的只想列出每个表中的每条记录,则可SELECT *以为每个表执行单独的操作:

$getTables = $this->db->query("show tables");
$tables = array();

while ($table_data = $getTables->fetch(PDO::FETCH_NUM)) {
    $tables[] = $table_data[0];
}

foreach ($tables as $table) {
    $stmt = $this->db->query('SELECT * FROM ' . $table) or die(print_r($this->db->errorInfo()));
    while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
        echo $row[0] . '<br />';
    }
    $stmt->closeCursor();
}
于 2012-11-07T15:21:45.270 回答