此函式的錯誤處理是由 PDO::ATTR_ERRMODE 屬性控制的。
使用以下程式碼使其拋出例外
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDO::query — 準備並執行不含預留位置的 SQL 陳述式
$query
,$fetchMode
= PDO::FETCH_CLASS,$classname
,$constructorArgs
PDO::query() 在單一函式呼叫中準備並執行 SQL 陳述式,並將陳述式作為 PDOStatement 物件傳回。
對於需要多次發出的查詢,如果您使用 PDO::prepare() 準備 PDOStatement 物件,並透過多次呼叫 PDOStatement::execute() 來發出陳述式,您將會獲得更好的效能。
如果您在發出下一次 PDO::query() 呼叫之前未擷取結果集中的所有資料,您的呼叫可能會失敗。在發出下一次 PDO::query() 呼叫之前,請呼叫 PDOStatement::closeCursor() 來釋放與 PDOStatement 物件關聯的資料庫資源。
注意事項:
如果
query
包含佔位符號,則必須使用 PDO::prepare() 和 PDOStatement::execute() 方法分別準備和執行陳述式。
query
要準備和執行的 SQL 陳述式。
如果 SQL 語句包含佔位符,則必須使用 PDO::prepare() 和 PDOStatement::execute() 方法。或者,也可以在呼叫 PDO::query() 之前手動準備 SQL 語句,如果驅動程式支援,可以使用 PDO::quote() 方法正確格式化資料。
fetchMode 參數
返回的 PDOStatement 物件的預設擷取模式。它必須是 PDO::FETCH_*
常數之一。
如果將此參數傳遞給函式,則其餘參數將被視為已在結果語句物件上呼叫 PDOStatement::setFetchMode() 方法。後續參數會根據所選的擷取模式而有所不同。
成功時返回 PDOStatement 物件,失敗時返回 false
。
如果屬性 PDO::ATTR_ERRMODE
設定為 PDO::ERRMODE_WARNING
,則會發出級別為 E_WARNING
的錯誤。
如果屬性 PDO::ATTR_ERRMODE
設定為 PDO::ERRMODE_EXCEPTION
,則會擲出 PDOException 例外。
範例 #1 不含佔位符的 SQL 語句可以使用 PDO::query() 執行
<?php
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
?>
以上範例將輸出
apple red 150 banana yellow 250 kiwi brown 75 lemon yellow 25 orange orange 300 pear green 150 watermelon pink 90
此函式的錯誤處理是由 PDO::ATTR_ERRMODE 屬性控制的。
使用以下程式碼使其拋出例外
<?php
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
嘗試將 PDO::FETCH_ASSOC 作為第二個參數傳遞仍然有效。
因此,將 FETCH TYPE 作為參數傳遞似乎有效。
這可以避免您執行以下操作
<?php
$result = $stmt->setFetchMode(PDO::FETCH_NUM);
?>
範例
<?php
$res = $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);
?>
在使用 DataLink 處理 Oracle 到 MySQL 和 PDO 多個小時後,我們(我和 Adriano Rodrigues,解決了這個問題)發現 PDO(以及 oci)需要將 AUTOCOMMIT 屬性設定為 FALSE 才能正常運作。
有三種方法可以將 autocommit 設定為 false:在建構函式中,在建構之後和查詢資料之前設定屬性,或者啟動一個事務(這會關閉 autocommit 模式)
範例
<?php
// 第一種方法 - 在 PDO 建構函式中
$options = array(PDO::ATTR_AUTOCOMMIT=>FALSE);
$pdo = new PDO($dsn,$user,$pass,$options);
// 現在我們可以查詢 DataLinks 了
?>
<?php
// 第二種方法 - 在建立敘述句之前
$pdo = new PDO($dsn,$user,$pass);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,FALSE);
// 或者
$pdo->beginTransaction();
// 現在我們可以查詢 DataLinks 了
?>
要在 oci 上使用 DataLinks,只需在 oci_execute() 函式中使用 OCI_DEFAULT;
> 當 query() 失敗時,會回傳布林值 false。
我認為這是「靜默模式」。
如果將屬性 ErrorMode 設定為「例外模式」
就會拋出 PDOException。
$pdoObj = new PDO( $dsn, $user, $pass );
$pdoObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我想提一下使用 PDO 從 SQL 查詢擷取資料列
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// 在這裡使用連線
$sth = $dbh->query('SELECT * FROM countries');
// 將所有資料列擷取到陣列中,預設使用 PDO::FETCH_BOTH
$rows = $sth->fetchAll();
// 使用索引和名稱迭代陣列
foreach($rows as $row) {
printf("$row[0] $row[1] $row[2]\n");
printf("$row['id'] $row['name'] $row['population']\n");
}
?>