2016-12-10 42 views
1

我已经写在PostgreSQL这个UPSERT查询在PHP 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值?

+0

你试过用'我(...)选择i。* from i'? –

+0

这可以工作,但我想保持我的查询尽可能干净,而不是建立额外的周围它只是为了得到一个价值回来,它已被返回,并寻找PHP PDO – Pascale

+0

解决方案。 。我注意到查询返回一列,但你似乎正在阅读其中的很多。 –

回答

1

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

公共BOOL PDOStatement对象::执行([数组$ input_parameters])

得到返回VAL,尝试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(); 
+0

谢谢瓦奥,我希望能够在一次调用数据库的时候得到它,而不必在之后获取它,但我想那是不可能的。 因为我知道我只有一行返回只有一个值,我用fetchColumn()来代替。这给了我直接的id号码,并避免我不得不从fetchAll()或fetch()将返回的数组中取出 – Pascale