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 *、データベース内のすべてのテーブルからすべてのレコードを 1 つの結果で選択しようとします。

実際にエラーやタイムアウト/警告が表示されないことに驚いています。その理由は、コンマ区切りのリストを使用すると、joinすべてのテーブル間で実行しようとするためです。マニュアルから:

INNER JOIN と , (コンマ) は、結合条件がない場合、意味的に同等です。どちらも、指定されたテーブル間のデカルト積を生成します (つまり、最初のテーブルのすべての行が 2 番目のテーブルのすべての行に結合されます)。 )。

table-list が 3 つまたは 4 つのテーブルにまで成長し、各テーブルに 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 に答える