PHP Conference Japan 2024

PDO::query

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

PDO::query 準備並執行不含預留位置的 SQL 陳述式

說明

public PDO::query(字串 $query, ?整數 $fetchMode = null): PDOStatement|false
public PDO::query(字串 $query, ?整數 $fetchMode = PDO::FETCH_COLUMN, 整數 $colno): PDOStatement|false
public PDO::query(
    字串 $query,
    ?整數 $fetchMode = PDO::FETCH_CLASS,
    字串 $classname,
    陣列 $constructorArgs
): PDOStatement|false
public PDO::query(字串 $query, ?整數 $fetchMode = PDO::FETCH_INTO, 物件 $object): PDOStatement|false

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

另請參閱

新增筆記

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

fredrik at NOSPAM dot rambris dot com
17 年前
此函式的錯誤處理是由 PDO::ATTR_ERRMODE 屬性控制的。

使用以下程式碼使其拋出例外
<?php
$dbh
->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
stefano[dot]bertoli [at] gmail[dot]com
10 年前
嘗試將 PDO::FETCH_ASSOC 作為第二個參數傳遞仍然有效。

因此,將 FETCH TYPE 作為參數傳遞似乎有效。

這可以避免您執行以下操作

<?php
$result
= $stmt->setFetchMode(PDO::FETCH_NUM);
?>

範例
<?php
$res
= $db->query('SELECT * FROM `mytable` WHERE true', PDO::FETCH_ASSOC);

?>
marcos at marcosregis dot com
16 年前
在使用 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;
dozoyousan at gmail dot com
18 年前
> 當 query() 失敗時,會回傳布林值 false。

我認為這是「靜默模式」。
如果將屬性 ErrorMode 設定為「例外模式」
就會拋出 PDOException。
$pdoObj = new PDO( $dsn, $user, $pass );
$pdoObj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Ilyas Bakirov
3 年前
我想提一下使用 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");

}
?>
JJimenez
1 年前
當你為 PDO:query 建立包裝器時,你必須像這樣定義方法

public function query( string $sql, ?int $fetchMode = null, mixed ...$fetchModeArgs) : \PDOStatement|false

如果你刪除其中一個參數或使用其中一個官方參數,你會得到一個致命錯誤
To Top