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 — Conectarse a bases de datos de MySQL
Descripción
El Nombre de Origen de Datos (DSN) de PDO_MYSQL está compuesto por los siguientes elementos:
- prefijo DSN
-
El prefijo DSN es
mysql:. - host
-
El nombre del equipo anfitrión donde reside el servidor de bases de datos.
- port
-
El número de puerto que el servidor de bases de datos está escuchando.
- dbname
-
El nombre de la base de datos.
- unix_socket
-
El socket Unix de MySQL (no debe usarse con host o port).
- charset
-
El conjunto de caracteres. Véase la documentación sobre los conceptos de conjuntos de caracteres para más información.
Antes de PHP 5.3.6, este elemento era ignorado de forma silenciosa. Se puede replicar el mismo comportamiento parcialmente con la opción
PDO::MYSQL_ATTR_INIT_COMMANDdel controlador, como muestra el siguiente ejemplo.AdvertenciaEl método del siguiente ejemplo sólo puede usarse con juegos de caracteres que compartan una misma represntación ASCII de los 7 últimos bits, como ISO-8859-1 o UTF-8. Los usuarios que utilicen juegos de caracteres con representaciones distintas (como UTF-16 o Big5) deben usar la opción charset que ofrece la versión 5.3.6 de PHP y posterior.
Ejemplo #1 Establecer el juego de caracteres de la conexión a UTF-8, antes de PHP 5.3.6
<?php
$dsn = 'mysql:host=localhost;dbname=testdb';
$nombre_usuario = 'nombre_usuario';
$contraseña = 'contraseña';
$opciones = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$gbd = new PDO($dsn, $nombre_usuario, $contraseña, $opciones);
?>
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.3.6 | Antes de la versión 5.3.6, charset era ignorado. |
Ejemplos
Ejemplo #2 ejemplos PDO_MYSQL DSN
El siguiente ejemplo muestra un DSN de PDO_MYSQL para conectarse a una base de datos de MySQL:
mysql:host=localhost;dbname=testdb
mysql:host=localhost;port=3307;dbname=testdb mysql:unix_socket=/tmp/mysql.sock;dbname=testdb
Notas
Nota: Unix solamente:
Cuando el nombre de equipo anfitrión está definido como "localhost", la conexión al servidor se realiza a través de un socket de dominio. Si PDO_MYSQL se compila para libmysql, entonces la ubicación del fichero del socket será la ubicación donde se compiló libmysql. Si PDO_MYSQL se compila para mysqlnd, se puede establecer un socket predeterminado a través del ajuste pdo_mysql.default_socket.
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.
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";
?>
