要获得 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
一个键 => 值数组,包含特定于驱动程序的连接选项。
PDO::__construct() 在尝试连接到所请求数据库失败时会抛出 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
使用设置文件连接到 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"
要通过 Unix 套接字连接,您需要使用
<?php
$dsn = 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>
使用套接字时,您不能指定主机。
我想指出,在 PHP 7.0 中,您不能在 dsn 参数中使用 'host=localhost',要解决这个问题,您可以使用 'host=127.0.0.1' 代替。
此评论中的大部分信息已过时或错误。
您可以使用 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);
}
}
?>
如果您使用 UTF-8 编码,则必须使用第四个参数
<?php
$db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>
// 设置 DEFAULT_FETCH_MODE
<?php
try {
$p = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_dbname", $db_user, $db_pass,array(
PDO::ATTR_DEFAULT_FETCH_MODE =>PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // 在 php5.3.6 之后
));
//$p->exec('SET NAMES utf8');
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
Sqlite
<?php
try{
$pdo = new PDO('sqlite:example.db');
}catch (PDOException $e){
die ('DB Error');
}
?>
如果 'example.db' 不存在,则不会抛出异常,但会创建 'example.db' 文件。
如果您没有捕获 PDO 在无法连接到数据库服务器时抛出的异常,您将收到致命错误。
致命错误:在 xxx.php 的第 xx 行
此错误既不能由错误处理程序处理,也不能被 @ 符号删除,这会导致您的脚本无法控制。
<?php
$db = new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
?>
您应该始终使用 try ... catch ...
<?php
try{
$db = new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
}catch(PDOException $pe){
echo $pe->getMessage();
}
?>
虽然没有明确说明,但 PDO $dsn 字符串中的参数在某些平台或驱动程序上可能是区分大小写的。
<?php
// dbname 将不会使用不正确的 casing 解析:
$pdo = new PDO("mysql:host=hostname;DBName=database", "user", "password");
// 正确的 dbname 是小写,如手册中所示:
$pdo = new PDO("mysql:host=hostname;dbname=database", "user", "password");
?>
对于 IBM i / iSeries / AS400 DB2 连接,您可以为 php_pdo 模块 > 1.3.3-sg2 指定系统命名和库列表
<?php
$pdo = new PDO(
'ibm:' . $host,
$user,
$password,
array(
PDO::I5_ATTR_DBC_SYS_NAMING => true,
PDO::I5_ATTR_DBC_LIBL => "QGPL QSYS"
)
);
?>
查看 http://yips.idevcloud.com/wiki/index.php/XMLSERVICE/PHPPDOChangeLog
SQLite3:默认情况下,如果数据库文件不存在,则在打开时创建它(PDO::SQLITE_OPEN_CREATE)。
<?php
$dsn = 'sqlite:D:\Databases\non_existing.db'; // 文件不存在
try {
$dbh = new PDO($dsn);
}
catch(PDOException $e) {
print $e->getMessage();
}
?>
不会抛出异常,而是会创建 "non_existing.db" 文件。要避免这种情况,请使用
<?php
$dsn = 'sqlite:D:\Databases\non_existing.db';
$options = [
PDO::SQLITE_ATTR_OPEN_FLAGS => PDO::SQLITE_OPEN_READWRITE,
];
try {
$dbh = new PDO('sqlite:D:\Databases\non_existing.db', null, null, $options);
}
catch(PDOException $e) {
print $e->getMessage();
}
?>
这将输出
SQLSTATE[HY000] [14] unable to open database file
如果您想以只读方式打开数据库,请使用 PDO::SQLITE_OPEN_READONLY。
PDO 连接区分大小写,这意味着您不能写
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
您必须写成
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`
这里的区别是 `mysql` 和 `dbname` 都是小写。
一些 IDE,如 PHPStorm,如果 `dbname` 仅使用小写字母编写,则会在 `dbname` 上显示 `TYPO ERROR`,这只是被忽略,并且已向 PHPStorm 报告,以便他们进行修复。(当前版本 10.0.2)