要获得 UTF-8 字符集,您可以在 DSN 中指定它。
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::__construct — 创建一个 PDO 实例,表示与数据库的连接
$dsn
,$username
= null
,$password
= null
,$options
= null
创建一个 PDO 实例以表示与请求的数据库的连接。
dsn
数据源名称 (DSN) 包含连接到数据库所需的信息。
通常,DSN 由 PDO 驱动程序名称、冒号、然后是 PDO 驱动程序特定的连接语法组成。更多信息可从 PDO 驱动程序特定文档 获取。
dsn
参数支持三种不同的方法来指定创建数据库连接所需的参数
dsn
包含完整的 DSN。
dsn
由 uri:
后跟一个 URI 组成,该 URI 定义包含 DSN 字符串的文件的位置。URI 可以指定本地文件或远程 URL。
uri:file:///path/to/dsnfile
dsn
由一个名称 name
组成,该名称映射到 php.ini 中的 pdo.dsn.
,以定义 DSN 字符串。name
注意:
别名必须在 php.ini 中定义,而不是在 .htaccess 或 httpd.conf 中定义
username
DSN 字符串的用户名称。此参数对于某些 PDO 驱动程序是可选的。
password
DSN 字符串的密码。此参数对于某些 PDO 驱动程序是可选的。
options
驱动程序特定的连接选项的键=>值数组。
如果尝试连接到请求的数据库失败,则会抛出 PDOException,无论当前设置了哪个 PDO::ATTR_ERRMODE
。
示例 #1 通过驱动程序调用创建 PDO 实例
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
?>
示例 #2 通过 URI 调用创建 PDO 实例
以下示例假设文件 /usr/local/dbconnect 存在,并且文件权限允许 PHP 读取该文件。该文件包含通过 PDO_ODBC 驱动程序连接到 DB2 数据库的 PDO DSN
odbc:DSN=SAMPLE;UID=john;PWD=mypass
然后,PHP 脚本可以通过简单地传递 uri:
参数并指向文件 URI 来创建数据库连接
<?php
$dsn = 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';
$dbh = new PDO($dsn, $user, $password);
?>
示例 #3 使用别名创建 PDO 实例
以下示例假设 php.ini 包含以下条目,以启用仅使用别名 mydb
连接到 MySQL 数据库
[PDO] pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php
$dsn = 'mydb';
$user = '';
$password = '';
$dbh = new PDO($dsn, $user, $password);
?>
要获得 UTF-8 字符集,您可以在 DSN 中指定它。
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
要指定数据库连接端口,请使用以下 DSN 字符串
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
尝试连接到本地数据库时,似乎不再需要 "uri:file:///"。只需编写 PDO 飞行员名称,后跟文件的绝对路径。
示例:sqlite:C:\VirtualHosts\phpliteadmin\dbs\surveillance_logeas.s3DB
要通过 unix 套接字连接,您需要使用
<?php
$dsn = 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>
使用套接字时,您不得指定主机。
我想指出,在 PHP 7.0 中,在 dsn 参数中您不能使用 'host=localhost' 来解决这个问题,您可以改为使用 'host=127.0.0.1'。
使用设置文件连接到 mariadb 或 mysql 数据库的通用模式
<?php
$_SETTINGS = parse_ini_file('./settings.ini', true);
$db = new \PDO(
"mysql:hostname={$_SETTINGS['db']['host']};dbname={$_SETTINGS['db']['name']}",
$_SETTINGS['db']['user'],
$_SETTINGS['db']['pass'],
[
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]
);
?>
您可能不需要此处显示的选项,但我发现它们很方便。
适用于包含例如以下内容的 settings.ini 文件
[db]
host = "localhost"
name = "dbname"
user = "dbuser"
pass = "dbpassword"
此处注释中的大部分信息已过时或错误。
您可以使用 host=localhost 通过套接字连接,这比 TCP 更快,因此设置 127.0.0.1 会导致性能下降。
要使用正确的 utf,您应该使用 utf8mb4,例如
$db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname='. DATABASE_NAME .';charset=utf8mb4', DATABASE_USER, DATABASE_PASSWORD);
如果您使用自己的类覆盖 PDO,并且想要实现 php.ini 中的别名,则必须使用 `get_cfg_var` 而不是 `ini_get` 来获取它。
<?php
class PDO extends \PDO
{
public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
//别名
if (!str_contains($dsn, ':')) {
$dsn = get_cfg_var('pdo.dsn.' . $dsn);
if (!$dsn) {
throw new PDOException('Argument #1 ($dsn) must be a valid data source name');
}
}
//您的其他逻辑
parent::__construct($dsn, $username, $password, $options);
}
}
?>