2024 日本 PHP 研討會

PDO 類別

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

簡介

表示 PHP 和資料庫伺服器之間的連線。

類別概要

class PDO {
/* 常數 */
公開 常數 整數 PARAM_NULL;
公開 常數 整數 PARAM_BOOL = 5;
公開 常數 整數 PARAM_INT = 1;
公開 常數 整數 PARAM_STR = 2;
公開 常數 整數 PARAM_LOB = 3;
公開 常數 整數 PARAM_STMT = 4;
公開 常數 整數 PARAM_INPUT_OUTPUT;
公開 常數 整數 PARAM_STR_NATL;
公開 常數 整數 PARAM_STR_CHAR;
公開 常數 整數 PARAM_EVT_ALLOC;
公開 常數 整數 PARAM_EVT_FREE;
公開 常數 整數 PARAM_EVT_EXEC_PRE;
公開 常數 整數 PARAM_EVT_EXEC_POST;
公開 常數 整數 PARAM_EVT_FETCH_PRE;
公開 常數 整數 PARAM_EVT_FETCH_POST;
公開 常數 整數 PARAM_EVT_NORMALIZE;
公開 常數 整數 FETCH_DEFAULT;
公開 常數 整數 FETCH_LAZY;
公開 常數 整數 FETCH_ASSOC;
公開 常數 整數 FETCH_NUM;
公開 常數 整數 FETCH_BOTH;
公開 常數 整數 FETCH_OBJ;
公開 常數 整數 FETCH_BOUND;
公開 常數 整數 FETCH_COLUMN;
公開 常數 整數 FETCH_CLASS;
公開 常數 整數 FETCH_INTO;
公開 常數 整數 FETCH_FUNC;
公開 常數 整數 FETCH_GROUP;
公開 常數 整數 FETCH_UNIQUE;
公開 常數 整數 FETCH_KEY_PAIR;
公開 常數 整數 FETCH_CLASSTYPE;
公開 常數 整數 FETCH_SERIALIZE;
公開 常數 整數 FETCH_PROPS_LATE;
公開 常數 整數 FETCH_NAMED;
公開 常數 整數 ATTR_AUTOCOMMIT;
公開 常數 整數 ATTR_PREFETCH;
公開 常數 整數 ATTR_TIMEOUT;
公開 常數 整數 ATTR_ERRMODE;
公開 (public) 常數 (const) 整數 (int) ATTR_SERVER_VERSION;
公開 (public) 常數 (const) 整數 (int) ATTR_CLIENT_VERSION;
公開 (public) 常數 (const) 整數 (int) ATTR_SERVER_INFO;
公開 (public) 常數 (const) 整數 (int) ATTR_CONNECTION_STATUS;
公開 (public) 常數 (const) 整數 (int) ATTR_CASE;
公開 (public) 常數 (const) 整數 (int) ATTR_CURSOR_NAME;
公開 (public) 常數 (const) 整數 (int) ATTR_CURSOR;
公開 (public) 常數 (const) 整數 (int) ATTR_ORACLE_NULLS;
公開 (public) 常數 (const) 整數 (int) ATTR_PERSISTENT;
公開 (public) 常數 (const) 整數 (int) ATTR_STATEMENT_CLASS;
公開 (public) 常數 (const) 整數 (int) ATTR_FETCH_TABLE_NAMES;
公開 (public) 常數 (const) 整數 (int) ATTR_FETCH_CATALOG_NAMES;
公開 (public) 常數 (const) 整數 (int) ATTR_DRIVER_NAME;
公開 (public) 常數 (const) 整數 (int) ATTR_STRINGIFY_FETCHES;
公開 (public) 常數 (const) 整數 (int) ATTR_MAX_COLUMN_LEN;
公開 (public) 常數 (const) 整數 (int) ATTR_EMULATE_PREPARES;
公開 (public) 常數 (const) 整數 (int) ATTR_DEFAULT_FETCH_MODE;
公開 (public) 常數 (const) 整數 (int) ATTR_DEFAULT_STR_PARAM;
公開 (public) 常數 (const) 整數 (int) ERRMODE_SILENT;
公開 (public) 常數 (const) 整數 (int) ERRMODE_WARNING;
公開 (public) 常數 (const) 整數 (int) ERRMODE_EXCEPTION;
公開 (public) 常數 (const) 整數 (int) CASE_NATURAL;
公開 (public) 常數 (const) 整數 (int) CASE_LOWER;
公開 (public) 常數 (const) 整數 (int) CASE_UPPER;
公開 (public) 常數 (const) 整數 (int) NULL_NATURAL;
公開 (public) 常數 (const) 整數 (int) NULL_EMPTY_STRING;
公開 (public) 常數 (const) 整數 (int) NULL_TO_STRING;
公開 (public) 常數 (const) 字串 (string) ERR_NONE;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_NEXT;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_PRIOR;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_FIRST;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_LAST;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_ABS;
公開 (public) 常數 (const) 整數 (int) FETCH_ORI_REL;
公開 (public) 常數 (const) 整數 (int) CURSOR_FWDONLY;
公開 (public) 常數 (const) 整數 (int) CURSOR_SCROLL;
/* 方法 */
公開 (public) __construct(
    字串 (string) $dsn,
    ?字串 $username = null,
    #[\SensitiveParameter] ?字串 $password = null,
    ?陣列 $options = null
)
公開 commit(): 布林值
公開 靜態 connect(
    字串 (string) $dsn,
    ?字串 $username = null,
    #[\SensitiveParameter] ?字串 $password = null,
    ?陣列 $options = null
): static
公開 errorCode(): ?字串
公開 errorInfo(): 陣列
公開 exec(字串 $statement): 整數|false
公開 getAttribute(整數 $attribute): 混合
公開 靜態 getAvailableDrivers(): 陣列
公開 prepare(字串 $query, 陣列 $options = []): PDOStatement|false
公開 query(字串 $query, ?整數 $fetchMode = null): PDOStatement|false
公開 query(字串 $query, ?整數 $fetchMode = PDO::FETCH_COLUMN, 整數 $colno): PDOStatement|false
公開 query(
    字串 $query,
    ?整數 $fetchMode = PDO::FETCH_CLASS,
    字串 $classname,
    陣列 $constructorArgs
): PDOStatement|false
公開 query(字串 $query, ?整數 $fetchMode = PDO::FETCH_INTO, 物件 $object): PDOStatement|false
公開 quote(字串 $string, 整數 $type = PDO::PARAM_STR): 字串|false
公開 setAttribute(整數 $attribute, 混合 $value): 布林值
}

更新日誌

版本 說明
8.4.0 類別常數現在已鍵入。

目錄

新增筆記

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

Megaloman
15 年前
「將用戶名/密碼儲存在類別中並不是產品程式碼的好主意。」

比較好的做法是將數據庫連接設定儲存在 *.ini 檔案中,但您必須限制對它們的存取權限。例如,這樣做:

my_setting.ini
[database]
driver = mysql
host = localhost
;port = 3306
schema = db_schema
username = user
password = secret

數據庫連接
<?php
class MyPDO extends PDO
{
public function
__construct($file = 'my_setting.ini')
{
if (!
$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.');

$dns = $settings['database']['driver'] .
':host=' . $settings['database']['host'] .
((!empty(
$settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') .
';dbname=' . $settings['database']['schema'];

parent::__construct($dns, $settings['database']['username'], $settings['database']['password']);
}
}
?>

對於那些一看到 PHP/HTML/任何其他程式碼就抓狂的人來說,資料庫連線參數可以透過淺顯易懂的 ini 檔案來設定。
anrdaemon at freemail dot ru
16 年前
請記住,除非你的應用程式是用於資料庫維護,否則絕對不要在應用程式中使用 'root' 帳號。

而且,在正式程式碼中把使用者名稱/密碼儲存在類別裡並不是個好主意。 你需要編輯實際運作中的程式碼來更改設定,這很糟糕。
williambarry007 at gmail dot com
13 年前
PDO 與依賴注入

依賴注入有利於測試。但對於任何希望各種資料映射器物件都具有資料庫連線的人來說,依賴注入會使其他模型程式碼變得非常雜亂,因為必須到處實例化資料庫物件並將其提供給資料映射器物件。

以下程式碼是在保持簡潔的模型程式碼的同時,維持依賴注入的良好方法。

<?php

class DataMapper
{
public static
$db;

public static function
init($db)
{
self::$db = $db;
}
}

class
VendorMapper extends DataMapper
{
public static function
add($vendor)
{
$st = self::$db->prepare(
"insert into vendors set
first_name = :first_name,
last_name = :last_name"
);
$st->execute(array(
':first_name' => $vendor->first_name,
':last_name' => $vendor->last_name
));
}
}

// 在您的啟動程式中
$db = new PDO(...);
DataMapper::init($db);

// 在您的模型邏輯中
$vendor = new Vendor('John', 'Doe');
VendorMapper::add($vendor);

?>
sinri at everstray dot com
6 年前
某些資料庫環境,例如阿里雲 DRDS(分散式關聯式資料庫服務),無法處理 SQL 的預備查詢。
對於這種情況,選項 `\PDO::ATTR_EMULATE_PREPARES` 應該設定為 true。如果您在此選項設定為 false 時總是收到「SQL 預備查詢失敗」的報告,您可以嘗試開啟此選項以模擬 SQL 的預備查詢。
thz at plista dot com
11 年前
從 PHP 5.4 開始,當您擁有從原生 PDO 類別衍生的自定義資料庫類別時,您將無法使用持久連接。如果您的程式碼使用了這種組合,您將在 PHP 程序清理期間遇到區段錯誤。
您仍然可以單獨使用衍生的 PDO 類別或持久連接,但不能同時使用。

更多資訊,請參閱此錯誤報告: https://bugs.php.net/bug.php?id=63176
匿名
7 年前
我個人會像這樣建立一個新的 PDO 實例

$dbDatas = parse_ini_file( DB_FILE );
$dbOptions = [
\PDO::ATTR_DEFAULT_FECTH_MODE => \PDO::FETCH_OBJ,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
];

$dsn = sprintf( 'mysql:dbname=%s;host=%s', $dbDatas['dbname'],
$dbDatas['host'] );

$this->cn = new \PDO( $dsn, $dbDatas['user'], $dbDatas['password'],
$dbOptions );
$this->cn->exec( 'SET CHARACTER SET UTF8' );
To Top