0

URLから取得したものに基づいてクエリを作成するPHPを作成しようとしています。私はそれを完了するために必要なコードに近づいていると確信していますが、正しい構文を得ることができません. アイデアは、URL ?companies=bla,bla,bla (私はこれを配列に格納しました) 内のすべての企業をループし、それぞれに対して $query の SQL ステートメントの一部をエコーするというものです。私は自分のコードが悪くなることを知っています。私はそれを完全に認識していますが、正しい構文がないとデバッグできません。誰かが私の構文を修正できれば、非常に感謝しています!

ありがとう

$companies = $_GET['companies'];
$companiesArray = explode(',', $companies);
$companiesArrayLength = count($companiesArray);

$query = $db->query(
    for ($i = 0; $i < $companiesArrayLength; $i++) {
        echo "SELECT * FROM " . $companiesArray[$i] . " UNION ALL";
    }
    //echo " ORDER BY timestamp DESC LIMIT 50";
);
4

5 に答える 5

1

したがって、あなたのコードは最終的に

SELECT * FROM a UNION ALL
...
SELECT * FROM k UNION ALL

最後の UNION ALL は必要ありません。そのため、エラーが発生しています。次のように削除します。

SELECT * FROM a UNION ALL
...
SELECT * FROM k

実行する必要があります。各テーブルの列数も同じであることを確認してください。

于 2013-06-03T11:22:16.537 に答える
1

echofunction-parameter (query()この場合) に入ることができません。代わりに、文字列を構築し、その後クエリ全体を実行します。

$querystring = "";
for ($i = 0; $i < $companiesArrayLength; $i++) {
    $querystring .= "SELECT * FROM " . $companiesArray[$i];
    // no UNION ALL after the last part
    if($i != $companiesArrayLength-1){
        $querystring .= " UNION ALL";
    }
}
$querystring .= " ORDER BY timestamp DESC LIMIT 50";

$query = $db->query($querystring);
于 2013-06-03T11:23:27.313 に答える
1

したがって、最後のサブクエリは で終わるべきではありませUNION ALLん。次のようなことができますか:

$parts = array();

foreach ($companiesArray as $company)
    $parts[] = "SELECT * FROM " . $company;

$query = implode(" UNION ALL ", $parts) . " ORDER BY timestamp DESC LIMIT 50";
于 2013-06-03T11:26:17.747 に答える
0

多分あなたはできる

foreach ($companiesArray as $company) {
    $sqls[] = "SELECT * FROM ".$company;
}
$sql = implode(" UNION ALL ", $sqls);
$query = $db->query($sql);

でも、おっしゃる通り、すごく汚いです。

于 2013-06-03T11:24:30.773 に答える