我想每 24 小时更新一次包含来自给定汇率服务的最新货币符号和值对的 MySQL 表。
现在,我做这样的事情:
foreach ($currencies->rates as $currency => $rate) {
$connection->addQuery("update/{$currency}", "UPDATE `i18n/currencies` SET `rate` = ? WHERE `code` = ?;", $rate, $currency);
}
$connection->output();
我$currencies
从 JSON 编码的响应中获取对象,$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 传递这样的参数来进行 BULK 更新吗?还是我还没有发现的另一种方式?也许这根本不可行,我只是很固执。我可以用单个 SQL 查询重写这个更新脚本,因为我的连接类将启动它们,从第一个到最后一个。
你能给我一个提示吗?