MySQL (PDO)
在线手册:中文 英文
PHP手册

PDO_MYSQL DSN

(PECL PDO_MYSQL >= 0.1.0)

PDO_MYSQL DSNConnecting to MySQL databases

说明

The PDO_MYSQL Data Source Name (DSN) is composed of the following elements:

DSN prefix

The DSN prefix is mysql:.

host

The hostname on which the database server resides.

port

The port number where the database server is listening.

dbname

The name of the database.

unix_socket

The MySQL Unix socket (shouldn't be used with host or port).

charset

The character set.

Prior to PHP 5.3.6, this element was silently ignored. The same behaviour can be partly replicated with the PDO::MYSQL_ATTR_INIT_COMMAND driver option, as the following example shows.

Warning

The method in the below example can only be used with character sets that share the same lower 7 bit representation as ASCII, such as ISO-8859-1 and UTF-8. Users using character sets that have different representations (such as UTF-16 or Big5) must use the charset option provided in PHP 5.3.6 and later versions.

Example #1 Setting the connection character set to UTF-8 prior to PHP 5.3.6

<?php
$dsn 
'mysql:host=localhost;dbname=testdb';
$username 'username';
$password 'password';
$options = array(
    
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn$username$password$options);
?>

更新日志

版本 说明
5.3.6 Prior to version 5.3.6, charset was ignored.

范例

Example #2 PDO_MYSQL DSN examples

The following example shows a PDO_MYSQL DSN for connecting to MySQL databases:

mysql:host=localhost;dbname=testdb
More complete examples:
mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb

注释

Note: Unix only:

When the host name is set to "localhost", then the connection to the server is made thru a domain socket. If PDO_MYSQL is compiled against libmysql then the location of the socket file is at libmysql's compiled in location. If PDO_MYSQL is compiled against mysqlnd a default socket can be set thru the pdo_mysql.default_socket setting.


MySQL (PDO)
在线手册:中文 英文
PHP手册
PHP手册 - N: Connecting to MySQL databases

用户评论:

damien at mc-kenna dot com (13-Jan-2012 03:58)

It appears that internally the host string infers a default of "localhost", e.g. this appears to work as a valid $dsn: mysql:host=;port=3306

rustamabd at gmail dot com (15-Mar-2009 08:18)

Even though pdo_mysql accepts an additional "charset" parameter in the DSN (see mysql_driver.c:442), as of PHP 5.2.9 it does not do anything with it.

A possible workaround to set the charset to UTF-8, for example, could be:
<?php

    $dbh
= new PDO("mysql:$connstr"$user, $password);

   
$dbh -> exec("set names utf8");

?>

codeslinger at compsalot dot com (11-Mar-2009 03:07)

Here is a function that provides a generic interface to connect
 to a mySQL PDO.  This takes care of the default values automatically
and deals with the difference between a host name and a socket path.

The advantage of using LOCALHOST for the default is that you don't have
 to worry about IPv4 vs IPv6.  But keep in mind that mySQL login security
does not treat the name as being interchangeable with the ip address. 
You could of course change the default to use a socket path instead.

Enjoy!
Codeslinger

P.S. This form forces you to limit the length of your lines, so I had to
split a couple of things.

<?php

//pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
//
//  Creates a new mySQL database connection
//
//  Returns a PDO object or an error message 
//  Use: is_object()  to verify the result
//
//
//  If $DBHost starts with a '/' then it is treated as a Socket
//
//  if $DBHost is empty it will default to LOCALHOST which is NOT the
//  same as 127.0.0.1
//
//  $DBPort is optional and will use the standard mySQL default if not
//  specified
//
//  The database name ($DBName) is optional, but if it is specified
//  it must exist or an error results
//
//  2009-03-11  Created: by codeslinger at compsalot.com
//
//          Released to the Public Domain free to use and modify
//
//
function dbPDO_Connect_mySQL($DBUser, $DBPass, $DBName = false,
                           
$DBHost = false, $DBPort = false)
{

   
$DBNameEq = empty($DBName) ? '' : ";dbname=$DBName";
   
    if (empty(
$DBHost)) $DBHost = 'localhost';
   
    If (
$DBHost[0] === '/')
    {
       
$Connection = "unix_socket=$DBHost";
    }
    else
    {
        if (empty(
$DBPort)) $DBPort = 3306;
       
$Connection = "host=$DBHost;port=$DBPort";
    }
   
   
//======================
   
   
try
    {
       
$dbh     = new PDO("mysql:$Connection$DBNameEq"
                                 
$DBUser, $DBPass);
    }
    catch (
PDOException $e)
    {
        return
$e->getMessage();
    }

    return
$dbh;
}

//================================
//================================
//
//Example of use:

  //connects to the default (localhost)

 
$dbh = dbPDO_Connect_mySQL('user', 'password', 'database');

 
//............................................................
  //error handler goes here

 
if (!is_object($dbh)) trigger_error("Failed to connect to 'database' "
      
." | Error = $dbh", E_USER_ERROR);

 
//............................................................
  //get a record

 
$sql = "select * from SomeTable limit 1;";
   
 
$dbRS = $dbh->query($sql);
 
$row = empty($dbRS) ? false : $dbRS->fetch(PDO::FETCH_ASSOC);
  if (!empty(
$dbRS)) $dbRS->closeCursor();

 
//............................................................
  //do something with the data

 
if (!empty($row)) print_r($row);   
  else echo
"Error? no data found\n";

?>

codeslinger at compsalot dot com (11-Mar-2009 11:00)

I have tested this and found that the "dbname" field is optional.  Which is a good thing if you must first create the db.

After creating a db be sure to exec a "use dbname;"  command, or else use fully specified table references.