1

特定の為替レート サービスからの最新の通貨記号と値のペアを含む MySQL テーブルを 24 時間ごとに更新したいと考えています。

今、私は次のようなことをしています:

foreach ($currencies->rates as $currency => $rate) {
    $connection->addQuery("update/{$currency}", "UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?;", $rate, $currency);
}

$connection->output();

$currenciesJSON でエンコードされた応答からオブジェクトを取得します。これ$connectionは、データベース接続クラスへの参照です。

SQL クエリ グループ (一括コマンドを実行するために作成したクラス) を作成する場合、構文は次のようになります。

if (!empty($this->attributes["queries"])) {
    $queries = implode(" ", array_map(function ($input) { return (mb_strpos($input->attributes["query"], ";") !== false ? $input->attributes["query"] : "{$input->attributes["query"]};"); }, $this->attributes["queries"]));
    $parameters = [];

    foreach ($this->attributes["queries"] as $query) {
        if (!empty($query->attributes["parameters"])) {
            $parameters = array_merge($parameters, $query->attributes["parameters"]);
        }
    }
}

このように、次の一連のクエリがある場合 (クエリの後に最終的な値を指定):

UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; [1.7, AED]
UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; [2.1, BYR]
UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; [0.7, EUR]
UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; [1.1, GBP]

最終的な文字列は次のようになります。

UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?; [1.7, AED, 2.1, BYR, 0.7, EUR, 1.1, GBP]

クエリは次のように準備および実行されます。

if ($output = $this->attributes["references"]["parent"]->attributes["link"]->prepare($queries, [\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY])) {
    $result = ($output->execute((!empty($parameters) ? $parameters : null)) ? true : false);
}

しかし、それは機能していません。コードにさまざまな変更を加えてみましたが、探している解決策が得られないようです。

このようなパラメーターを渡す PDO で一括更新を行うことは本当に可能ですか? それとも、私がまだ発見していない別の方法ですか?多分それはまったく実行可能ではなく、私はただ頑固です。この更新スクリプトは、単一の SQL クエリで書き直すことができます。これは、接続クラスが最初から最後のものまでそれらを起動するためです。

ヒントを教えてください。

4

0 に答える 0