php - 在 PHP PDO 中如何获取 PostgreSQL upsert 查询的 "RETURNING"子句值

标签 php postgresql pdo

我有这个用 postgreSQL 编写的 upsert 查询

$statement = 'INSERT INTO "CharactersUnlockToBuyLevels"
                ("CharacterId", "LevelId", "AmountToBuy", "EagleStatueId", "Location", 
                 "MapCoordinateTop", "MapCoordinateLeft")
              VALUES 
                (:CharacterId, :LevelId, :AmountToBuy, :EagleStatueId, :Location, 
                 :MapCoordinateTop, :MapCoordinateLeft)
              ON CONFLICT
                ("CharacterId")
              DO UPDATE 
                SET 
                  "LevelId" = EXCLUDED."LevelId",
                  "AmountToBuy" = EXCLUDED."AmountToBuy",
                  "EagleStatueId" = EXCLUDED."EagleStatueId",
                  "Location" = EXCLUDED."Location",
                  "MapCoordinateTop" = EXCLUDED."MapCoordinateTop",
                  "MapCoordinateLeft" = EXCLUDED."MapCoordinateLeft"                            
              RETURNING "CharacterUnlockToBuyLevelId"
             ';

查询工作正常,如果我在 PgAdmin 中运行它,我会按预期返回“CharacterUnlockToBuyLevelId”。但是,如果我准备它并使用 PHP 的 PDO 执行它,那么我似乎无法取回 RETURNING 值。

$stmt = $this->db->prepare($statement);
$returnedId = $stmt->execute(array(
     'CharacterId' => $characterId,
     'LevelId' => $unlockMethod['LevelId'],
     'AmountToBuy' => $unlockMethod['AmountToBuy'],
     'EagleStatueId' => $unlockMethod['EagleStatueId'],
     'Location' => $unlockMethod['Location'],
     'MapCoordinateTop' => $unlockMethod['MapCoordinateTop'],
     'MapCoordinateLeft' => $unlockMethod['MapCoordinateLeft'],
));

这只会返回 true,因此 $returnedId 实际上不会保存 id,而只会保存值 true。如何使用 PDO 的准备好的语句从 upsert 查询中获取 RETURNING 值?

最佳答案

来自 http://php.net/manual/en/pdostatement.execute.php :

public bool PDOStatement::execute ([ array $input_parameters ] )

要获得返回值,请尝试 fetchAll

$stmt = $this->db->prepare($statement);
$returnedId = $stmt->execute(array(
     'CharacterId' => $characterId,
     'LevelId' => $unlockMethod['LevelId'],
     'AmountToBuy' => $unlockMethod['AmountToBuy'],
     'EagleStatueId' => $unlockMethod['EagleStatueId'],
     'Location' => $unlockMethod['Location'],
     'MapCoordinateTop' => $unlockMethod['MapCoordinateTop'],
     'MapCoordinateLeft' => $unlockMethod['MapCoordinateLeft'],
));
$yourVal=$stmt->fetchAll();

关于php - 在 PHP PDO 中如何获取 PostgreSQL upsert 查询的 "RETURNING"子句值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41077901/

相关文章:

node.js - 将点几何添加到 Postgresql

postgresql - PG/hibernate : operator does not exist: character varying = bytea

php - 循环基于用户的过滤器来提取产品 MYSQL

php - MYSQL : Selecting from Multiple Databases (an error occured)

c# - php str_word_count 到 c# 的端口

php - 仅选择 min(date) 时 SQL 返回各种日期

php - 查询后立即应用更改

有效选择非完美重复项的 SQL 查询

PHP-PDO try/catch 插入动态 html 链接

php - 从 PHP 数组向 MySQL 插入 500 行