2024 日本 PHP 研討會

PDO::exec

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::exec 執行 SQL 陳述式並返回受影響的列數

說明

public PDO::exec(字串 $statement): 整數|false

PDO::exec() 在單一函式呼叫中執行 SQL 陳述式,並返回受陳述式影響的列數。

PDO::exec() 不會傳回 SELECT 語句的結果。對於程式中只需要執行一次的 SELECT 語句,請考慮使用 PDO::query()。對於需要執行多次的語句,請使用 PDO::prepare() 準備一個 PDOStatement 物件,並使用 PDOStatement::execute() 執行該語句。

參數

statement

要準備和執行的 SQL 語句。

查詢內的資料應該正確跳脫

傳回值

PDO::exec() 傳回被執行的 SQL 語句修改或刪除的資料列數。如果沒有資料列受到影響,PDO::exec() 會傳回 0

警告

此函式可能傳回布林值 false,但也可能傳回評估為 false 的非布林值。請閱讀關於布林值的章節以了解更多資訊。使用 === 運算子來測試此函式的傳回值。

以下範例錯誤地依賴 PDO::exec() 的傳回值,其中影響 0 列的語句會導致呼叫 die()

<?php
$db
->exec() or die(print_r($db->errorInfo(), true)); // 錯誤
?>

錯誤/例外

如果屬性 PDO::ATTR_ERRMODE 設定為 PDO::ERRMODE_WARNING,則會發出層級為 E_WARNING 的錯誤。

如果屬性 PDO::ATTR_ERRMODE 設定為 PDO::ERRMODE_EXCEPTION,則會擲出 PDOException 例外。

範例

範例 #1 執行 DELETE 語句

計算沒有 WHERE 子句的 DELETE 語句刪除的資料列數。

<?php
$dbh
= new PDO('odbc:sample', 'db2inst1', 'ibmdb2');

/* 從 FRUIT 表格中刪除所有資料列 */
$count = $dbh->exec("DELETE FROM fruit");

/* 傳回已刪除的資料列數 */
print "Deleted $count rows.\n";
?>

上述範例將輸出

Deleted 1 rows.

另請參閱

新增註解

使用者貢獻的註解 5 則註解

david at acz dot org
18 年前
此函式無法用於任何會傳回結果的查詢。這包括 SELECT、OPTIMIZE TABLE 等。
Sbastien
2 年前
請注意,使用 MySQL 時,您可以使用 INSERT 偵測重複鍵值 (1 = INSERT,2 = UPDATE)

<?php

// MySQL 特有的類似 INSERT UPDATE 的語法
$sql = <<<SQL
INSERT INTO customers
SET
id =
{$pdo->quote($id)},
name =
{$pdo->quote($name)},
address =
{$pdo->quote($address)}
AS new
ON DUPLICATE KEY UPDATE
name = new.name,
address = new.address
SQL;

$result = $pdo->exec($sql);

if (
$result === 1) {
// 已新增一列
} elseif ($result === 2) {
// 已更新現有的一列
}
soletan at toxa dot de
18 年前
除了上述文件中提供的提示之外,值得注意的是,使用 prepare、bind 和 execute 比多次查詢陳述式更有益處:效能和安全性!

如果您使用 INSERT INTO ... 將一些二進位資料(例如影像檔)插入資料庫,則它可能會提高解析陳述式的效能,因為它保持很小(只有幾個位元組,而影像可能有好幾 MB),而且不需要將檔案的二進位資料跳脫/引號括起來成為正確的字串值。

最後,舉例來說,如果您想要獲得一個更安全的 PHP 應用程式,使其不受 SQL 注入攻擊的影響,您*必須*考慮在每個包含資料的陳述式(例如帶有 WHERE 子句的 INSERT 或 SELECT)上使用 prepare/execute。使用 prepare、bind 和 execute 將陳述式程式碼與相關資料分開是最好的方法 - 快速又安全!您甚至不需要跳脫/引號括起來/格式檢查任何資料。
calin at NOSPAM dot softped dot com
9 年前
當使用 PDO_DBLIB 和 FreeTDS 時,即使操作成功完成,PDO::eval() 也可能會對某些陳述式(例如 CREATE TABLE)傳回 `false`。因此,這不是測試操作狀態的可靠方法。

PDO::errorInfo() 可用於測試 SQLSTATE 錯誤碼,'00000'(成功)和 '01000'(成功但有警告)。

<?php
函式 execute(PDO $conn, $sql) {
$affected = $conn->exec($sql);
如果 ($affected === false) {
$err = $conn->errorInfo();
如果 ($err[0] === '00000' || $err[0] === '01000') {
返回 true;
}
}
返回 $affected;
}
?>

PDO::errorInfo(): https://php.dev.org.tw/manual/en/pdo.errorinfo.php
SQLSTATE 代碼列表: http://www-01.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_0809.htm
roberto at spadim dot com dot br
17 年前
這個函式不執行 multi_query
要使用它,請參考 SQLITE_EXEC 的註釋,其中有一個 pereg 函式可以取得所有查詢並執行所有查詢,然後返回最後一個結果
To Top