添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Authentication Services
Command Line Specific Extensions
Compression and Archive Extensions
Cryptography Extensions
Database Extensions
Date and Time Related Extensions
File System Related Extensions
Human Language and Character Encoding Support
Image Processing and Generation
Mail Related Extensions
Mathematical Extensions
Non-Text MIME Output
Process Control Extensions
Other Basic Extensions
Other Services
Search Engine Extensions
Server Specific Extensions
Session Extensions
Text Processing
Variable and Type Related Extensions
Web Services
Windows Only Extensions
XML Manipulation
GUI Extensions
Keyboard Shortcuts
?
This help
Next menu item
Previous menu item
Previous man page
Next man page
Scroll to bottom
Scroll to top
Goto homepage
Goto search
(current page)
Focus search box
public PDO::__construct (
string $dsn ,
? string $username = null ,
? string $password = null ,
? array $options = null
) 创建一个表示连接到请求数据库的数据库连接 PDO 实例。 The following example assumes that the file /usr/local/dbconnect exists with file permissions that enable PHP to read the file. The file contains the PDO DSN to connect to a DB2 database through the PDO_ODBC driver:
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实例

The following example assumes that php.ini contains the following entry to enable a connection to a MySQL database using only the alias mydb :
[PDO]
pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php

$dsn
= 'mydb' ;
$user = '' ;
$password = '' ;

$dbh = new PDO ( $dsn , $user , $password );

?>
theking2 at king dot ma
1 year ago
A generic pattern to connect to a mariadb or mysql database using a settings file

<?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'"
]
);
?>
You might not need the options depicted here but I find them convenient.

Works with a settings.ini file containing for instance:
[db]
host = "localhost"
name = "dbname"
user = "dbuser"
pass = "dbpassword"
Francesco Montanari
4 years ago
Most of the information in the comment here is outdated or wrong.

You do can use host=localhost to connect via socket, which is faster than TCP, so setting 127.0.0.1 is a performance loss.

To use proper utf you should use utf8mb4, for example:

$db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname='. DATABASE_NAME .';charset=utf8mb4', DATABASE_USER, DATABASE_PASSWORD);
453034559 at qq dot com
2 years ago
// set 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' , //after php5.3.6
));
//$p->exec('SET NAMES utf8');
} catch ( PDOException $e ) {
print
"Error!: " . $e -> getMessage () . "<br/>" ;
die();
}
?>
Michal Stefanak
1 year ago
If you override PDO with own class and you want to implement alias from php.ini, you have to get it with `get_cfg_var` instead of `ini_get`.

<?php
class PDO extends \PDO
{
public function
__construct ( string $dsn , ? string $username = null , ? string $password = null , ?array $options = null )
{
//alias
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' );
}
}

// your additional logic

parent :: __construct ( $dsn , $username , $password , $options );
}
}
?>
ohcc at 163 dot com
8 years ago
You will get a fatal error if you don't catch the exception threw by PDO when it fails to connect to the database server like this.

Fatal error: in xxx.php on line xx

This error neither can be handled by error handlers nor can it be erased by the @ sign, which can make your script uncontrollable.

<?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 ,
));
?>

You should always 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 ();
}
?>
berk0081 at umn dot edu
9 years ago
Although not explicitly stated, parameters in the PDO $dsn string may be case-sensitive on some platforms or drivers.

<?php
// The dbname will not be parsed with incorrect casing:
$pdo = new PDO ( "mysql:host=hostname;DBName=database" , "user" , "password" );

// The correct dbname is lowercase, as displayed in the manual:
$pdo = new PDO ( "mysql:host=hostname;dbname=database" , "user" , "password" );
?>
srycroft at excelsystems dot com
7 years ago
For IBM i / iSeries / AS400 DB2 connections, you can specify system naming and library lists for php_pdo modules > 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"
)
);
?>

See http://yips.idevcloud.com/wiki/index.php/XMLSERVICE/PHPPDOChangeLog
max1josef
11 months ago
SQLite3: by default, the database file is created on opening if it does not exist (PDO::SQLITE_OPEN_CREATE).

<?php
$dsn
= 'sqlite:D:\Databases\non_existing.db' ; // file does not exist

try {
$dbh = new PDO ( $dsn );
}
catch(
PDOException $e ) {
print
$e -> getMessage ();
}
?>

No Exception is thrown, instead file "non_existing.db" will be created. To avoid this, use:

<?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 ();
}
?>
This will ouput:
SQLSTATE[HY000] [14] unable to open database file

If you want to open the database read-only, use PDO::SQLITE_OPEN_READONLY.
olivernybroe at gmail dot com
8 years ago
The PDO connection is case-sensitive, this means that you cannot write
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
You would have to write it
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`

The difference here is that `mysql` and `dbname` is with all lower-case.

Some IDE's like PHPStorm will show a `TYPO ERROR`, at `dbname` if it's written with lower-case only, this is just to be ignored and have been reported to PHPStorm for them to fix. (Currrent version 10.0.2)