使用PHP / PDO进行PostgreSQL UPDATE的RETURNING子句

时间:2014-10-17 13:02:51

标签: php sql postgresql pdo

我执行一个简单的postgresql更新:

UPDATE data SET Gender=lower(tmp.champs2) 
FROM tmp WHERE data.email=tmp.champs1 
AND (data.Gender IS NULL OR data.Gender='') 
AND tmp.champs2 IS NOT NULL 
AND tmp.champs2!='' 
RETURNING Gender

PostgreSQL文档说我们可以获得受RETURNING子句影响的行数。

但是如何用PHP,PDO获得这个结果?

我试着像:

echo $requete = "UPDATE data 
    SET ".$value."=lower(tmp.champs".$num.") 
    FROM tmp 
    WHERE data.email=tmp.champs".$email." 
    AND (data.".$value." IS NULL OR data.".$value."='') 
    AND tmp.champs".$num." IS NOT NULL 
    AND tmp.champs".$num."!='' 
    RETURNING ".$value;

    $db->exec($requete);

    $db->fetch(PDO::FETCH_NUM);

    echo $row[0];

不会返回更新的正确行数。

2 个答案:

答案 0 :(得分:1)

根据PDO's doc

  

PDO :: exec()在单个函数调用中执行SQL语句,   返回受语句影响的行数。

您当前的代码$db->exec($requete);会忽略返回值,这是错误。这应该是例如:

$affected_rows = $db->exec($requete);

不需要RETURNING子句来获取受影响的行数(此外,它在PDO支持的某些后端中不存在)。 RETURNING的目的是除了更新之外还检索行,所有这些都在同一个查询中。

如果需要RETURNING子句且必须提取结果,则应使用PDO::query代替PDO:exec()。用于获取结果的PHP代码与查询是SELECT的相同。

答案 1 :(得分:-1)

根据文档,你应该使用

$count = $db->rowCount();