PHP Conference Japan 2024

pg_affected_rows

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_affected_rows傳回受影響的記錄 (tuples) 數量

說明

pg_affected_rows(PgSql\Result $result): int

pg_affected_rows() 會傳回受 INSERTUPDATEDELETE 查詢影響的 tuple(實例/記錄/列)數量。

從 PostgreSQL 9.0 及以上版本開始,伺服器會傳回 SELECT 的列數。較舊的 PostgreSQL 版本對於 SELECT 會傳回 0。

注意事項:

這個函式以前稱為 pg_cmdtuples()

參數

result

一個 PgSql\Result 實例,由 pg_query()pg_query_params()pg_execute()(以及其他函式)傳回。

傳回值

受查詢影響的列數。如果沒有 tuple 受影響,則會傳回 0

更新日誌

版本 說明
8.1.0 result 參數現在需要一個 PgSql\Result 實例;以前需要的是 資源

範例

範例 #1 pg_affected_rows() 範例

<?php
$result
= pg_query($conn, "INSERT INTO authors VALUES ('Orwell', 2002, 'Animal Farm')");

$cmdtuples = pg_affected_rows($result);

echo
$cmdtuples . " 個 tuple 受影響。\n";
?>

上述範例將輸出

1 tuples are affected.

參見

  • pg_query() - 執行查詢
  • pg_query_params() - 將命令提交到伺服器並等待結果,可以將參數與 SQL 命令文字分開傳遞
  • pg_execute() - 傳送請求以使用給定參數執行準備好的語句,並等待結果
  • pg_num_rows() - 傳回結果中的列數

新增筆記

使用者貢獻的筆記 4 則筆記

匿名
17 年前
pg-affected-rows () 只會對執行的最後一個 SQL 陳述式生效。如果您將多個陳述式組合在一起,則 pg_affected_rows 可能不會傳回您預期的結果。

例如

<?php

$result
= pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\'); COMMIT');

echo (
pg_affected_rows ($result));

?>

將會導致印出 0,因為 Postgres 執行的最後一個陳述式是 COMMIT,它不會影響任何列。

我還沒試過,所以不確定是否有效,但如果您將查詢拆分,應該可以取得所需的列數。

例如

<?php

$result
= pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\');');

echo (
pg_affected_rows ($result));

pg_query ('COMMIT;');
?>

應該允許您取得受前一個查詢影響的列數。但我還沒試過,所以別太指望它。
Bruno Baguette
19 年前
請注意,當您在一個 BEGIN;COMMIT; 中提交多個 SQL 查詢時,像這樣:

$SQLQuery = 'BEGIN;';
$SQLQuery.= 'INSERT INTO a (a,b) VALUES (1,2);';
$SQLQuery.= 'INSERT INTO b (ref_b,c) VALUES (2,5);';
$SQLQuery.= 'COMMIT;';

$HandleResults = pg_query($SQLQuery);
echo(pg_affected_rows($HandleResults));

pg_affected_rows() 將會返回 0
匿名
16 年前
有一種稱為自動提交的機制,當您提供多個以分號 ; 分隔的查詢時,如果其中一個失敗,則會執行全有或全無的操作。執行單個查詢時不需要 BEGIN;COMMIT;ROLLBACK。對我來說,pg_affected_rows() 返回受影響的列數是合乎邏輯的,如果您想分別執行 2 個查詢... 請先執行 BEGIN,然後執行查詢 1 並取得 pg_affected_rows(),接著執行查詢 2 並取得 pg_affected_rows(),最後執行 COMMIT;
匿名
19 年前
這並不完全正確,我已經能夠在單次呼叫中順利執行多個查詢。事實上,這個函數返回的是最後執行的查詢所影響的列數,而不是單次呼叫 pg_query 時指定的最後一組查詢所影響的列數。
To Top