需要注意的是,PDO::FETCH_CLASS 将在设置值(或调用 __set)*之后*调用构造函数。
以下常量由此扩展定义,并且只有在将扩展编译到 PHP 或在运行时动态加载时才可用。
PDO::PARAM_BOOL
(int)PDO::PARAM_NULL
(int)PDO::PARAM_INT
(int)PDO::PARAM_STR
(int)PDO::PARAM_STR_NATL
(int)PDO::PARAM_STR_CHAR
(int)PDO::PARAM_LOB
(int)PDO::PARAM_STMT
(int)PDO::PARAM_INPUT_OUTPUT
(int)PDO::FETCH_DEFAULT
(int)PDO::FETCH_LAZY
(int)PDO::FETCH_LAZY
返回一个 PDORow 对象,该对象在访问时创建对象属性名称。在 PDOStatement::fetchAll() 内部无效。
PDO::FETCH_ASSOC
(int)PDO::FETCH_ASSOC
仅返回每个列名一个值。
PDO::FETCH_NAMED
(int)PDO::FETCH_NAMED
返回每个列名的一个值数组。
PDO::FETCH_NUM
(int)PDO::FETCH_BOTH
(int)PDO::FETCH_OBJ
(int)PDO::FETCH_BOUND
(int)PDO::FETCH_COLUMN
(int)PDO::FETCH_CLASS
(int)注意: 如果属性在请求的类中不存在,则调用魔术 __set() 方法
PDO::FETCH_INTO
(int)PDO::FETCH_FUNC
(int)PDO::FETCH_GROUP
(int)PDO::FETCH_COLUMN
或 PDO::FETCH_KEY_PAIR
组合使用。
PDO::FETCH_UNIQUE
(int)PDO::FETCH_KEY_PAIR
(int)PDO::FETCH_CLASSTYPE
(int)PDO::FETCH_SERIALIZE
(int)PDO::FETCH_INTO
相同,但对象作为序列化字符串提供。如果设置此标志,则永远不会调用类构造函数。自 PHP 8.1.0 起弃用。
PDO::FETCH_PROPS_LATE
(int)PDO::ATTR_AUTOCOMMIT
(int)false
,PDO 尝试禁用自动提交,以便连接开始一个事务。
PDO::ATTR_PREFETCH
(int)PDO::ATTR_TIMEOUT
(int)PDO::ATTR_ERRMODE
(int)PDO::ATTR_SERVER_VERSION
(int)PDO::ATTR_CLIENT_VERSION
(int)PDO::ATTR_SERVER_INFO
(int)PDO::ATTR_CONNECTION_STATUS
(int)PDO::ATTR_CASE
(int)PDO::CASE_*
常量指定的特定大小写。
PDO::ATTR_CURSOR_NAME
(int)PDO::ATTR_CURSOR
(int)PDO::CURSOR_FWDONLY
** 和 **PDO::CURSOR_SCROLL
**。除非知道需要可滚动游标,否则请坚持使用 **PDO::CURSOR_FWDONLY
**。
PDO::ATTR_DRIVER_NAME
(int)
示例 #1 使用 PDO::ATTR_DRIVER_NAME
<?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
echo "Running on mysql; doing something mysql specific here\n";
}
?>
PDO::ATTR_ORACLE_NULLS
(int)PDO::ATTR_PERSISTENT
(int)PDO::ATTR_STATEMENT_CLASS
(int)PDO::ATTR_FETCH_CATALOG_NAMES
(int)PDO::ATTR_FETCH_TABLE_NAMES
(int)PDO::ATTR_STRINGIFY_FETCHES
(int)PDO::ATTR_MAX_COLUMN_LEN
(int)PDO::ATTR_DEFAULT_FETCH_MODE
(int)PDO::ATTR_EMULATE_PREPARES
(int)PDO::ATTR_DEFAULT_STR_PARAM
(int)PDO::PARAM_STR_NATL
** 和 **PDO::PARAM_STR_CHAR
** 之一。 自 PHP 7.2.0 起可用。 PDO::ERRMODE_SILENT
(int)PDO::ERRMODE_WARNING
(int)E_WARNING
** 消息。有关此属性的更多信息,请参阅 错误和错误处理。
PDO::ERRMODE_EXCEPTION
(int)PDO::CASE_NATURAL
(int)PDO::CASE_LOWER
(int)PDO::CASE_UPPER
(int)PDO::NULL_NATURAL
(int)PDO::NULL_EMPTY_STRING
(int)PDO::NULL_TO_STRING
(int)PDO::FETCH_ORI_NEXT
(int)PDO::FETCH_ORI_PRIOR
(int)PDO::FETCH_ORI_FIRST
(int)PDO::FETCH_ORI_LAST
(int)PDO::FETCH_ORI_ABS
(int)PDO::FETCH_ORI_REL
(int)PDO::CURSOR_FWDONLY
(int)PDO::CURSOR_SCROLL
(int)PDO::FETCH_ORI_*
常量来控制从结果集中获取的行。
PDO::ERR_NONE
(string)PDO::PARAM_EVT_ALLOC
(int)PDO::PARAM_EVT_FREE
(int)PDO::PARAM_EVT_EXEC_PRE
(int)PDO::PARAM_EVT_EXEC_POST
(int)PDO::PARAM_EVT_FETCH_PRE
(int)PDO::PARAM_EVT_FETCH_POST
(int)PDO::PARAM_EVT_NORMALIZE
(int)PDO::SQLITE_DETERMINISTIC
(int)PDO::PARAM_STR_CHAR 和 PDO::PARAM_STR_NATL 必须与 PDO::PARAM_STR 结合使用按位或运算进行参数绑定。
这些标志控制值引用(例如 PDO::quote)以及在某些情况下(见下文)参数绑定(例如 PDO::bindParam、PDO::bindValue),以根据 SQL-92 的定义将字符串文字前缀为 N''。 从 PHP 7.3 开始,只有 dblib 和 mysql 支持这些标志。 对于 mysql 驱动程序,当 PDO::ATTR_EMULATE_PREPARES 为 true(默认值)时,这些标志只影响参数绑定。
MySQL 和 MariaDB 将以 N 为前缀的字符串文字解释为 utf8(而不是 utf8mb4),无论 `SET NAMES` 或字符集参数是什么。 如果数据库/表/列字符集不是 utf8,这会导致问题。 例如,在一个使用 utf8mb4 的数据库中,查询 "SELECT * FROM table WHERE col = :param" 和 bindValue(":param", "\u{1F600}", PDO::PARAM_STR | PDO::PARAM_STR_NATL) 将导致 "PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='". 使用 PDO::PARAM_STR 不使用 PDO::PARAM_STR_NATL 以及确保字符集 DSN 参数设置正确可以避免此问题。
参见
https://wiki.php.net/rfc/extended-string-types-for-pdo
https://mariadb.com/kb/en/library/string-literals/
https://dev.mysqlserver.cn/doc/refman/8.0/en/string-literals.html
有关所有 PDO::MYSQL_* 常量的引用,请参见 MySQL 驱动程序的文档:https://dev.mysqlserver.cn/doc/connectors/en/apis-php-pdo-mysql.html
例如,我在寻找的 PDO::MYSQL_ATTR_SSL_CA 和 PDO::MYSQL_ATTR_SSL_CAPATH 没有在此页面上列出。
PDO::FETCH_UNIQUE 不仅获取唯一值,它还使用第一个 SQL 列作为数组键结果,这对于快速创建索引非常有用,例如
<?php
$sql = <<<SQL
SELECT ALL
c1, -- 用于结果索引
c1, c2
FROM (
VALUES
ROW('ID-1', 'Value 1'),
ROW('ID-2', 'Value 2a'),
ROW('ID-2', 'Value 2b'),
ROW('ID-3', 'Value 3')
) AS t (c1, c2);
SQL;
$result = $pdo->query($sql);
print_r($result->fetchAll(PDO::FETCH_UNIQUE));
/*
给出:
ID-1 => [c1 => ID-1, c2 => Value 1]
ID-2 => [c1 => ID-2b, c2 => Value 2b]
ID-3 => [c1 => ID-3, c2 => Value 3]
*/
?>
\PDO::ATTR_TIMEOUT 的默认值为 30 秒。
参考:https://github.com/php/php-src/blob/PHP-7.1.0/ext/pdo_mysql/mysql_driver.c#L600
要绑定浮点数,请使用 PDO::PARAM_STR 与 bindValue。 您可以跳过 PDO::PARAM_STR,因为它默认选项。 使用 bindParam 绑定会将绑定变量的类型更改为字符串,这会导致类型错误。
Todd 提到的 PDO MySQL 常量引用已移至此处:https://php.net/manual/en/ref.pdo-mysql.php
这包括对 PDO::MYSQL_ATTR_SSL_CA、PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT 等常量的文档。
当您在 SQLite 上使用 REAL 类型列时,您在 bindValue() 的 pdo 参数设置是 PDO::PARAM_STR。
'''
$stmt->bindValue(':elapse_time', $e_time, PDO::PARAM_STR);
'''