2016-12-10 43 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