文字

PDO::__construct

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

PDO::__construct 创建一个表示数据库连接的 PDO 实例

说明

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

创建一个表示连接到请求数据库的数据库连接 PDO 实例。

参数

dsn

数据源名称或叫做 DSN,包含了请求连接到数据库的信息。

通常,一个 DSN 由 PDO 驱动名、紧随其后的冒号、以及具体 PDO 驱动的连接语法组成。更深入的信息能从 PDO 具体驱动文档找到。

The dsn 参数支持三种不同的方式 创建一个数据库连接:

Driver invocation

dsn 包含完整的DSN。

URI invocation

dsn consists of uri: followed by a URI that defines the location of a file containing the DSN string. The URI can specify a local file or a remote URL.

uri:file:///path/to/dsnfile

Aliasing

dsn consists of a name name that maps to pdo.dsn.name in php.ini defining the DSN string.

Note:

别名必须得在 php.ini 中定义了,不能是在 .htaccesshttpd.conf 中 。

username

DSN字符串中的用户名。对于某些PDO驱动,此参数为可选项。

password

DSN字符串中的密码。对于某些PDO驱动,此参数为可选项。

driver_options

一个具体驱动的连接选项的键=>值数组。

返回值

成功则返回一个PDO对象。

错误/异常

如果试图连接到请求的数据库失败,则 PDO::__construct() 抛出一个 PDO异常(PDOException) 。

范例

Example #1 Create a PDO instance via driver invocation

<?php

$dsn  'mysql:dbname=testdb;host=127.0.0.1' ;
$user  'dbuser' ;
$password  'dbpass' ;

try {
    
$dbh  = new  PDO ( $dsn $user $password );
} catch (
PDOException $e ) {
    echo 
'Connection failed: '  $e -> getMessage ();
}

?>

Example #2 Create a PDO instance via URI invocation

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

The PHP script can then create a database connection by simply passing the uri: parameter and pointing to the file URI:

<?php

$dsn  'uri:file:///usr/local/dbconnect' ;
$user  '' ;
$password  '' ;

try {
    
$dbh  = new  PDO ( $dsn $user $password );
} catch (
PDOException $e ) {
    echo 
'Connection failed: '  $e -> getMessage ();
}

?>

Example #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  '' ;

try {
    
$dbh  = new  PDO ( $dsn $user $password );
} catch (
PDOException $e ) {
    echo 
'Connection failed: '  $e -> getMessage ();
}

?>

用户评论:

[#1] ohcc at 163 dot com [2015-11-24 19:03:32]

<?php
    
// PDO::__construct can end up with a fatal error rather than throw an exception even if you try ... catch ... .
    
try{
        
$db = new PDO(
            
// a database to which connection may fail
            
'mysql:host=www.wuxiancheng.cn; dbname=php; port=3306; charset=utf8',
            
'root',
            
'rx00t',
            array(
                
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
                
PDO::ATTR_TIMEOUT=>1,
            )
        );
    }catch(
PDOException $pe){
        
        
// test the following lines of code respectively, and you will find the first line and the second line will end up with a fatal error.
        
        
throw $pe// Fatal error: in path\file.php on line n, script ends, no exception thrown        

        
throw new PDOException($pe->getMessage()); //Fatal error: in path\file.php on line n, script ends, no exception thrown        
        
        
throw new PDOException ('cannot connect to the database'); // an exception is thrown as expected
        
        
throw new PDOException('error: '.$pe->getMessage()); //Fatal error: in path\file.php on line n, script ends, no exception thrown        

        
throw new PDOException($pe->getLine()); // an exception is thrown as expected

        
throw new PDOException($pe->getFile()); // an exception is thrown as expected

        
throw new PDOException($pe->getCode()); // an exception is thrown as expected

        
throw new PDOException($pe->getTraceAsString()); // an exception is thrown as expected
    
}
?>

[#2] ohcc at 163 dot com [2015-11-23 05:37:57]

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();
    }    
?>

[#3] daviddlavier at gmail dot com [2015-11-09 00:43:41]

I'd like to point out that in PHP 7.0 in the dsn parameter you can't use 'host=localhost' to solve this you can use 'host=127.0.0.1' instead.

[#4] info at salientdigital dot com [2015-04-18 03:24:37]

If you happen to create a dsn like this...

<?php
    
//wrong dsn
    
$db = new PDO('mysql:database=yourdb;host=127.0.0.1''user''password');
    
$stmt $db->prepare('SELECT * FROM tbl WHERE id = :id');
    
$stmt->bindParam(':id'$user_idPDO::PARAM_INT);
    
$result $stmt->execute();
?>


... your result will be bool(false) and your $db->errorInfo() will be "0000" which isn't very helpful.

You have to look to the $stmt->errorInfo() to see "No database selected" which is even more confusing until you realize that it's not 'database' but 'dbname' in your DSN! You would think the error about a bad DSN would be in the $db errorInfo but it is not, it's not until you try the $stmt that the error is generated.

<?php
    
//correct dsn
    
$db = new PDO('mysql:dbname=yourdb;host=127.0.0.1''user''password');
?>


I wasted a half hour on that one.

[#5] berk0081 at umn dot edu [2014-11-16 13:34:08]

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

[#6] Anonymous [2014-04-07 13:55:13]

To connect to the database via a function use this and call the getConnection function in the class constructor.

<?php
class Connection{

    protected 
$db;

    public function 
Connection(){

    
$conn NULL;

        try{
            
$conn = new PDO("mysql:host=localhost;dbname=dbname""dbuser""dbpass");
            
$conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
            } catch(
PDOException $e){
                echo 
'ERROR: ' $e->getMessage();
                }    
            
$this->db $conn;
    }
    
    public function 
getConnection(){
        return 
$this->db;
    }
}

?>

[#7] Kiipa at live dot com [2013-10-19 18:46:08]

To get UTF-8 charset you can specify that in the DSN.

$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");

[#8] Anonymous [2013-05-29 05:30:36]

Sqlite:

<?php
try{     
    
$pdo = new PDO('sqlite:example.db');
}catch (
PDOException $e){
     die (
'DB Error');
}
?>


If 'example.db' does not exist, no exception is thrown but the file 'example.db' is created.

[#9] piotrekkr at o2 dot pl [2010-09-15 00:19:33]

To connect throught unix socket you need to use 
<?php
$dsn 
'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>


You musn't specify host when using socket.

[#10] Victor T. [2010-02-20 09:34:41]

If you use the UTF-8 encoding, you have to use the fourth parameter :

<?php
$db 
= new PDO('mysql:host=myhost;dbname=mydb''login''password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>

[#11] subme at interia dot pl [2008-11-25 14:03:45]

To specify a database connection port use the following DSN string

<?php
$dsn 
'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>

上一篇: 下一篇: