2011-08-14 10 views
8
<?php # Nettuts Tutorial using PHP Data Objects (PDO), 

/**This file contains the database access information 
*This file also establishes a connection to mySQL 
*and selects the database. 
*Set the database access information as constants: 
**/ 
// print_r(PDO::getAvailableDrivers()); 

DEFINE('DB_USER', 'root'); 
DEFINE('DB_PASSWORD', 'root'); 
DEFINE('DB_HOST', 'localhost'); 
DEFINE('DB_NAME', 'sitename'); 

$php = "htmlspecialchars"; 
try { 
    #MySQL with PDO_MYSQL 
    // $DBH = new PDO("mysql:host={$php(DB_HOST)}; dbname={$php(DB_NAME)}", root, root}; 
    $DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root); 

    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    # UH-OH! Typed DELECT instead of SELECT! 
    $DBH->prepare('DELECT name FROM people'); 
} catch (PDOException $e) { 
    echo "I'm sorry, Dave. I'm afraid I can't do that."; 
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 
} 
?> 

La consola de OS X devuelve "[14-Ago-2011 15:59:59] PHP Aviso: El uso de la raíz de constante indefinida - asumido 'root' en /Aplicaciones/MAMP/htdocs3/nettuts/PHP/PDO para la base de datos Acceso/mysql_pdo_connect.php en la línea 20. "El uso de constantes PHP DOP en las llamadas

He "buscado en Google" y he encontrado una respuesta parcial aquí. Así que esperaba terminar aquí.

TIA

+1

También debe no utilizar los '$ php htmlspecialchars = ""' solución para interpolar constantes. Eso es posible, pero no es uno de los casos especiales en los que esto es útil. En lugar de romper la cadena de inicio PDO DSN y concat las constantes normalmente: '= nuevo PDO (" mysql: host = ". DB_HOST." Dbname = ". DB_NAME."; ")' – mario

Respuesta

17

lo hace:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", root, root); 

que debería haber sido:

$DBH = new PDO("mysql:host=localhost; dbname= sitename", 'root', 'root'); 

con comillas. De lo contrario, PHP piensa que es una constante en lugar de una cadena. Sin embargo al mirar en su código veo que haya definido constants acceder a la base de datos ¿Por qué no sólo tiene que hacer:

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME, DB_USER, DB_PASSWORD); 

ACTUALIZACIÓN

También veo que está utilizando MySQL con DOP. Tenga en cuenta que con el fin de safely use MySQL with PDO tienes que disable emulated prepared statements:

$DBH = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); 
$DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

Tenga en cuenta que también he establecer la codificación en la cadena DSN (en mi caso a UTF-8). También me pregunto si realmente necesitas las constantes en tu código, porque a menudo solo necesitarás una conexión por solicitud (a la misma base de datos) para que no tengas que tener esos elementos globales flotando si solo creas la conexión una vez y pasas la conexión a las partes del código que lo necesitan. Ver también mi algo related question para más información sobre esto.

0

Usted necesita poner su 'root'cadena en unas comillas simples

4

no ha definido una constante llamada root en cualquier parte del código de seguridad. En cambio, ha definido una constante llamada DB_USER con el valor de "raíz", y otra llamada DB_PASSWORD con el mismo valor. Eche un vistazo a the PHP documentation page for define() para obtener más información sobre cómo funciona este tipo de constante.

Prueba esto:

$DBH = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, 
       DB_USER, 
       DB_PASSWORD 
      ); 
+0

La disposición de esas citas es justo lo que necesario. Tenía ... un nuevo PDO ("mysql: host = DB_SERVER ..."), que me estaba causando un error. – Mark

Cuestiones relacionadas