2011-06-07 18 views
27

Estoy escribiendo un instalador para una de mis aplicaciones y me gustaría poder probar algunas configuraciones predeterminadas de la base de datos.Prueba de conexión PDO

¿Es esto posible utilizar PDO para probar conexiones de bases de datos válidas y no válidas?

Tengo el siguiente código:

try{ 
      $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234'); 
      die(json_encode(array('outcome' => true))); 
     }catch(PDOException $ex){ 
      die(json_encode(array(
       'outcome' => false, 
       'message' => 'Unable to connect' 
      ))); 
     } 

El problema que estoy teniendo es que el guión intenta conectarse hasta que el tiempo de ejecución del script de 60 segundos se agota en lugar de decir que no se puede conectar a la base de datos.

Gracias

+0

$ dap = new 'PDO'? todo lo demás se ve bien para mí. –

+0

Pdo en minúscula funciona igual que PDO, si pongo los detalles correctos en la secuencia de comandos funciona como se esperaba pero estoy tratando de detectar la configuración no válida –

+0

¿Intentó agregar la opción 'PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION' ? –

Respuesta

35

que necesitan para establecer el modo de error cuando la conexión a la base de datos:

try{ 
    $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb', 
        'admin', 
        '1234', 
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
    die(json_encode(array('outcome' => true))); 
} 
catch(PDOException $ex){ 
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect'))); 
} 

para más informaciones Ver los siguientes enlaces:

Using MySQL with PDO

Errors and error handling

+0

Eso combinado con' ini_set ('display_errors ',' off '); 'funciona bien. Gracias –

+4

@ Themodem: ¿Por qué tendrías que desactivar los errores de visualización? Ha captado la excepción: se maneja. – mpen

+0

@Mark, porque la implementación de 'PDO :: ERRMODE_EXCEPTION' está rota (PHP5.3.28), y no tiene ningún efecto en algunos casos (por ejemplo," servidor de BD no se está ejecutando "en mi host). Entonces, desafortunadamente, esta solución no es suficiente, ya que Themodem lo notó en su solución. * (Oye, por cierto, acaba de poner '@new pdo()', no fuerza bruta 'display_errors' a' off' solo por esto!) * –

9

como @Sascha Ga ya mencionado, debería establecer el modo de error en el modo de excepción. Sin embargo, también debe configurar el atributo PDO::ATTR_TIMEOUT para evitar un largo tiempo de espera de respuesta en algunos casos.

Aunque la documentación dice que el comportamiento de este atributo depende del controlador en el caso de MySQL es un tiempo de espera de conexión. Usted no encontrará nada al respecto documentation pero aquí está un breve fragmento de código fuente del controlador:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC); 
+0

Excelente, justo lo que estaba buscando –

2

Como se ve, por ejemplo, en los comentarios al this answer (pero casi en ningún otro lado, así que lo hice más visible aquí), la solución "clásica" PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONno siempre funciona.

La implementación de PDO::ERRMODE_EXCEPTIONis broken, por lo que parece estar "goteando" en algunos casos.

Por ejemplo:

Advertencia: PDO :: __ construct() [pdo .-- construir]: [2002] No hay conexión podría hacerse porque la máquina de destino ha denegado activamente ella. (Tratando de conectarse a través de TCP: // localhost: 3306) en [...]db.php en la línea

El código no:

try { 
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'], 
     array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} catch { 
    echo("Can't open the database."); 
} 

El excepción es lanzado (y cought: Puedo ver mi mensaje).

Por lo tanto, como una solución necesaria, es necesario también poner un @(vamos a llamarlo un "operador de pañal" en este caso)antes new pdo(...) para mantener realmente limpio.

1

Falta un parenthese de cierre al final de PDO :: ERRMODE_EXCEPTION.

debe ser:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'], 
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
+0

Esto debería ser una edición para https://stackoverflow.com/a/23288361/956397 – PiTheNumber