Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Problemas con conexiones PDO PHP

19 de septiembre de 2015

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

#1

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

19 septiembre 2015, 15:50
#2

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

19 septiembre 2015, 18:16
#3

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

19 septiembre 2015, 18:44
#4

¡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

19 septiembre 2015, 18:50
#5

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

7 septiembre 2016, 22:34
#6

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

21 noviembre 2016, 17:25
#7

```<?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

21 noviembre 2016, 17:29
#8

@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

14 noviembre 2017, 0:17