Buenos días, tengo un problema con las conexiones PDO
Estoy trabajando con servidor local XAMPP en Windows 10 con puerto de Apache localhost:8080 y versión PHP 5.6.12.
Tengo la siguiente clase:
<?php class Conexiones { private $conexion; private $host = 'localhost'; private $usuario = 'root'; private $pass = ''; private $bbdd = 'boda'; public function conectar() { try { $this->conexion = new PDO("mysql:host = $this->host;dbname = $this->bbdd", $this->usuario, $this->pass); $this->conexion->exec("SET CHARACTER SET utf8"); $this->conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $this->conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $this->conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } catch (PDOException $e) { print "ERROR: ".$e->getMessage(); die(); } } public function consulta($consulta, $datos) { $sql = $this->conexion->prepare($consulta); return $sql->execute($datos); } public function desconectar() { $this->conexion = null; } public function __clone() { trigger_error('La clonación de este objeto no está permitida', E_USER_ERROR); } } ?>
La base de datos "boda" está creada, con una tabla "invitados", pero al intentar hacer un insert desde un método de una clase llamada "Invitados":
public static function addInvitado($nombre, $novios, $categoria, $tipo, $numPersonas, $asiste = 1) { $insert = "INSERT INTO `invitados`(`id`, `nombre`, `novios`, `categoria`, `tipo`, `numPersonas`, `asiste`) VALUES (NULL, :nombre, :novios, :categoria, :tipo, :numPersonas, :asiste)"; $datos = array('nombre' => $nombre, 'novios' => $novios, 'categoria' => $categoria, 'tipo' => $tipo, 'numPersonas' => $numPersonas, 'asiste' => $asiste); $conexion = new Conexiones(); $conexion->conectar(); $result = $conexion->consulta($consulta, $datos); $conexion->desconectar(); return $result; }
Es cuando al recoger de un formulario los datos, enviarlos por AJAX a un archivo php y ejecutar el método de la clase Invitados.php (esta de arriba) me devuelve el error de la excepcion "PDO: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected"
Que la base de datos no está seleccionada, pero está creada y pasada al PDO como se ve en la clase "Conexiones".
Con una conexión normal mediante new mysqli todo funciona correcto.
Respuestas
El problema que veo está en esta línea:
$this->conexion = new PDO("mysql:host = $this->host;dbname = $this->bbdd", $this->usuario, $this->pass);
Debería ser así:
$this->conexion = new PDO("mysql:host = {$this->host};dbname = {$this->bbdd}", $this->usuario, $this->pass);
La interpolación de variables dentro de cadenas de texto solo funciona cuando son variables simples. Si son elementos de arrays o propiedades de objetos hay que encerrarlas entre llaves.
@javiereguiluz
He cambiado y lo he puesto como me has dicho, nada, sigue dando el mismo error.
He hecho un ejemplo más simple para ir probando:
<?php $conexion; $host = 'localhost'; $usuario = 'root'; $pass = ''; $bbdd = 'boda'; $nombre = 'Pedro'; $novios = 'isaac'; $categoria = 'amigo'; $tipo = 'adulto'; $numPersonas = 1; $asiste = 1; try { $conexion = new PDO("mysql:host = $host;dbname = $bbdd", $usuario, $pass); $conexion->exec("SET CHARACTER SET utf8"); $conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); $conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); $conexion->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $consulta = "INSERT INTO `invitados`(`id`, `nombre`, `novios`, `categoria`, `tipo`, `numPersonas`, `asiste`) VALUES (NULL, :nombre, :novios, :categoria, :tipo, :numPersonas, :asiste)"; $datos = array('nombre' => '$nombre', 'novios' => '$novios', 'categoria' => '$categoria', 'tipo' => '$tipo', 'numPersonas' => $numPersonas, 'asiste' => $asiste); $sql = $conexion->prepare($consulta); $sql->execute($datos); } catch (PDOException $e) { print "ERROR: ".$e->getMessage(); die(); } ?>
Mismo error: ERROR: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected
Incluso metiendo los valores a pelo.
@ucip3
Lo único que veo que podría ser problemático son los espacios en blanco que dejas después de host
y dbname
. Prueba a cambiar esto:
$conexion = new PDO("mysql:host = $host;dbname = $bbdd", $usuario, $pass);
Por esto:
$conexion = new PDO("mysql:host=$host;dbname=$bbdd", $usuario, $pass);
@javiereguiluz
¡Bravo Javier! Y todo por las buenas prácticas de programación de separar los iguales.
¡Funciona! Te estás convirtiendo en mi salvador!
¡Gracias!
@ucip3
Muchas gracias @javiereguiluz. Tenia el mismo problema y no encontraba la solucion por ningun lado, y todo por intentar presentar un codigo mas legible!!!!.
@wilydanger
buenas yo también tengo el mismo error por favor ayúdenme estoy iniciando y no se que le paso intente lo que ustedes pusieron en el código de arriba pero nada no funciona.
<?PHP $db_host="localhost"; $nombre="registro1"; $db_usuario="root"; $db_contra=""; try{ $base=new PDO("mysql:$db_host=localhost;$nombre=registro1","root",""); $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql="SELECT * FROM usuario WHERE nombreusuario= :Usuario AND contrasena= :contrasena"; $resultado=$base->prepare($sql); $Usuario=htmlentities(addslashes($_GET["Usuario"])); $contrasena=htmlentities(addslashes($_GET["contrasena"])); $resultado->bindParam(":Usuario",$Usuario); $resultado->bindParam(":contrasena",$contrasena); $resultado->execute(); $numero_registro=$resultado->rowCuont(); if($numero_registro!=0){ echo "PRESENTACION_DE_MODULOS.php"; }else{ echo"los datos intruducidos no son correctos por favor de nuevo los datos"; header("location:LOGIN_ESTUDIANTE"); } }catch(PDOEXECEPTION $e){ die ("error:" . $e->getmessage()); header("location:registro_profesor.php"); } //$sql=mysqli_query("SELECT * FROM profesor_pass) where profesor=:nombreusuario and contrasenas=:crontrasenas"); ?> </body>
@germandj3
```<?php $db_host="localhost"; $nombre="registro1"; $db_usuario="root"; $db_contra="";
`try{ $base=new PDO("mysql:$db_host=localhost;$nombre=registro1","root",""); $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql="SELECT * FROM usuario WHERE nombreusuario= :Usuario AND contrasena= :contrasena"; $resultado=$base->prepare($sql); $Usuario=htmlentities(addslashes($_GET["Usuario"])); $contrasena=htmlentities(addslashes($_GET["contrasena"])); $resultado->bindParam(":Usuario",$Usuario); $resultado->bindParam(":contrasena",$contrasena); $resultado->execute(); $numero_registro=$resultado->rowCuont(); if($numero_registro!=0){ echo "PRESENTACION_DE_MODULOS.php"; }else{ echo"los datos intruducidos no son correctos por favor de nuevo los datos"; header("location:LOGIN_ESTUDIANTE"); } }catch(PDOEXECEPTION $e){ die ("error:" . $e->getmessage());
header("location:registro_profesor.php");
} //$sql=mysqli_query("SELECT * FROM profesor_pass) where profesor=:nombreusuario and contrasenas=:crontrasenas");` ?>
@germandj3
@germandj3,tengo un código casi idéntico que tampoco funciona... Has conseguido resolverlo???
<?php
try{
$base=new PDO("mysql:host=localhost; dbname=pruebas" , "root" , ""); echo $base[0]; $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql="SELECT * FROM USUARIOS_PASS WHERE NOMBRE = :login AND PASSWORD= :password"; $resultado = $base->prepare($sql); $login=htmlentities(addslashes($_POST["login"])); $password=htmlentities(addslashes($_POST["password"])); $resultado->bindValue(":login", $login); $resultado->bindValue(":password", $password); $resultado->execute(); $numero_registro=$resultado->rowCount(); if ($numero_registro !=0){ echo "TODO OK"; } }else{ header("location:index.php"); } }catch(Exception $e){ die ("Error: " . $e->getMessage()); }
?>
No veo errores pero no funciona...
@Yamimotonotira