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
PDO_MYSQL DSN
(PECL PDO_MYSQL >= 0.1.0)
PDO_MYSQL DSN — MySQL データベースに接続する
説明
PDO_MYSQL データソース名 (DSN) は以下の要素で構成されます。
- DSN 接頭辞
-
DSN 接頭辞は
mysql:です。 - host
-
データベースサーバーが存在するホスト名を指定します。
- port
-
データベースサーバーが待機しているポートを指定します。
- dbname
-
データベース名を指定します。
- unix_socket
-
MySQL の unix ソケットを指定します (host あるいは port と同時に使用することはできません)。
- charset
-
文字セット。
PHP 5.3.6 より前のバージョンでは、この要素は黙って無視されていました。 同じ挙動は、ドライバのオプション
PDO::MYSQL_ATTR_INIT_COMMANDを使って部分的に複製できます。 その方法は次の例で示します。警告次の例に示す方法が使えるのは、下位 7 ビットが ASCII と互換性のある文字セット、 つまり ISO-8859-1 や UTF-8 などだけです。それ以外の文字セット (UTF-16 や Big5 など) を使う場合は、必ず PHP 5.3.6 以降の charset オプションを使わなければなりません。
例1 PHP 5.3.6 より前のバージョンで、文字セットを UTF-8 に設定する例
<?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 | 5.3.6 より前のバージョンでは charset は無視されていました。 |
例
例2 PDO_MYSQL DSN の例
以下の例は、MySQL データベースに接続するための PDO_MYSQL DSN を表します。
mysql:host=localhost;dbname=testdb
mysql:host=localhost;port=3307;dbname=testdb mysql:unix_socket=/tmp/mysql.sock;dbname=testdb
注意
注意: Unix のみ
ホスト名を "localhost" にすると、 サーバーへの接続はドメインソケットを使って行われます。 libmysql を使って PDO_MYSQL をコンパイルした場合は、 ソケットファイルの場所は libmysql のコンパイル時の場所になります。 mysqlnd を使って PDO_MYSQL をコンパイルした場合は、デフォルトのソケットは pdo_mysql.default_socket の設定を使って作られます。
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");
?>
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";
?>
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.
