【问题标题】:PHP PDO MySQL Duplicate Key Update Multiple Rows and ValuesPHP PDO MySQL重复键更新多个行和值
【发布时间】:2017-03-19 00:25:27
【问题描述】:

我有以下 PDO 查询,但不知何故无法让 ON DUPLICATE 部分工作。

Slug 是唯一键。

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$statement = $db->prepare("INSERT INTO plugins (name, slug, version, author, author_profile, rating, num_ratings, active_installs, downloaded, last_updated, added, download_link, banners_high, banners_low, icons_default, icons_2x, icons_1x)
                             VALUES (:name, :slug, :version, :author, :author_profile, :rating, :num_ratings, :active_installs, :downloaded, :last_updated, :added, :download_link, :banners_high, :banners_low, :icons_default, :icons_2x, :icons_1x)
                             ON DUPLICATE KEY UPDATE version = :version, rating = :rating, num_ratings = :num_ratings, active_installs = :active_installs, downloaded = :downloaded, last_updated = :last_updated, download_link = :download_link");

                        foreach ($call_api->plugins as $keys) {
                                $statement->execute([
                                        'name' => $keys->name,
                                        'slug' => $keys->slug,
                                        'version' => $keys->version,
                                        'author' => sanitize_text_field($keys->author),
                                        'author_profile' => $keys->author_profile,
                                        'rating' => $keys->rating,
                                        'num_ratings' => $keys->num_ratings,
                                        'active_installs' => $keys->active_installs,
                                        'downloaded' => $keys->downloaded,
                                        'last_updated' => $keys->last_updated,
                                        'added' => $keys->added,
                                        'download_link' => $keys->download_link,
                                        'banners_high' => $keys->banners['high'],
                                        'banners_low' => $keys->banners['low'],
                                        'icons_default' => $keys->icons['default'],
                                        'icons_2x' => $keys->icons['2x'],
                                        'icons_1x' => $keys->icons['1x']
                                ]);
                        }

我收到错误消息:

致命错误:未捕获的 PDOException:SQLSTATE[HY093]:参数号无效

【问题讨论】:

  • 查询中 :placeholders 的数量与数组中的分配不匹配。此外,根据设置,PDO 不允许重复使用一个 :placeholder 分配 - 即,您需要执行 :version_select 和 :version_update 并在数组中分配两次。试试看。
  • 关于不匹配的分配:这是因为我只想在 DUPLICATE KEY 上更新一些值,如果我必须匹配所有分配,我该怎么做?我设置了以下属性,因此应该接受重复项: $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  • 好了,重复命名确实解决了问题!
  • 是的。那是因为 ATTR_EMULATE_PREPARES。将其设置为 false,您会得到一些权衡,例如不再可能重用相同的变量

标签: php mysql pdo


【解决方案1】:

试试这个

$statement = $db->prepare("INSERT INTO plugins (name, slug, version, author, author_profile, rating, num_ratings, active_installs, downloaded, last_updated, added, download_link, banners_high, banners_low, icons_default, icons_2x, icons_1x)
                         VALUES (:name, :slug, :version, :author, :author_profile, :rating, :num_ratings, :active_installs, :downloaded, :last_updated, :added, :download_link, :banners_high, :banners_low, :icons_default, :icons_2x, :icons_1x)
                         ON DUPLICATE KEY UPDATE version = :versionOne, rating = :ratingOne, num_ratings = :num_ratingsOne, active_installs = :active_installsOne, downloaded = :downloadedOne, last_updated = :last_updatedOne, download_link = :download_linkOne");

                    foreach ($call_api->plugins as $keys) {
                            $statement->execute([
                                    'name' => $keys->name,
                                    'slug' => $keys->slug,
                                    'version' => $keys->version,
                                    'author' => sanitize_text_field($keys->author),
                                    'author_profile' => $keys->author_profile,
                                    'rating' => $keys->rating,
                                    'num_ratings' => $keys->num_ratings,
                                    'active_installs' => $keys->active_installs,
                                    'downloaded' => $keys->downloaded,
                                    'last_updated' => $keys->last_updated,
                                    'added' => $keys->added,
                                    'download_link' => $keys->download_link,
                                    'banners_high' => $keys->banners['high'],
                                    'banners_low' => $keys->banners['low'],
                                    'icons_default' => $keys->icons['default'],
                                    'icons_2x' => $keys->icons['2x'],
                                    'icons_1x' => $keys->icons['1x'],

                                    'versionOne' => $keys->version,
                                    'ratingOne' => $keys->rating,
                                    'num_ratingsOne' => $keys->num_ratings,
                                    'active_installsOne' => $keys->active_installs,
                                    'downloadedOne' => $keys->downloaded,
                                    'last_updatedOne' => $keys->last_updated,
                                    'download_linkOne' => $keys->download_link

                            ]);
                    }

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 2014-10-09
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多