Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Intentando entender PDO (varias dudas)

Estas en el tema de Intentando entender PDO (varias dudas) en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Estoy tratando de entender PDO y tengo un "par de dudas" que no he sabido resolver hasta al momento. He construido el siguiente script ...
  #1 (permalink)  
Antiguo 12/04/2010, 12:16
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Intentando entender PDO (varias dudas)

Buenas,

Estoy tratando de entender PDO y tengo un "par de dudas" que no he sabido resolver hasta al momento.

He construido el siguiente script

Código PHP:
Ver original
  1. <?php
  2. $servidor='localhost';
  3. $bd='hmgroupcat';
  4. $user='root';
  5. $pass='xxxxx';
  6.  
  7. // Conexion a la base de datos, defino que muestre los errores
  8. try {
  9.     $db = new PDO('mysql:dbname='.$bd.';host='.$servidor.'', $user, $pass);
  10.     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  11. } catch (PDOException $e) {
  12.     echo $e->getMessage();
  13. }
  14. //Variables de la consulta
  15. $valor1=1;
  16. $valor2='2009-10-06 19:03:49';
  17.  
  18. //Preparamos la consulta marcando donde irán los parametros con ?
  19. $consulta = $db->prepare('SELECT ID,post_date,post_content FROM wp_posts where ID= ? OR post_date = ?');
  20. try {
  21.  
  22.     //Ejecutamos la consulta incluyendo los parámetros en el mismo orden en el que deben incluirse
  23.     $consulta->execute(array($valor1, $valor2));
  24.    
  25. } catch (PDOException $e) {
  26.     echo $e->getMessage();
  27. }
  28.  
  29. // Imprimo los resultados
  30. while( $datos = $consulta->fetch() ) {
  31.     echo $datos[0] . '  ' . $datos[1] . '  ' . $datos[2]. '<br />';
  32. }
  33. // Cerramos la conexion
  34. $consulta = null;
  35. $db = null;
  36. ?>


Varias preguntas:
  1. Linea 10, para que se utiliza?
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    He visto que hay muchos pero no he visto su explicacion/utilización (los dos que he puesto imagino que encuentra las excepciones, pero hay que poner alguno más? hay otro útil?
    Aquí hay una lista pero no encuentro explicación...
    http://www.php.net/manual/es/pdo.getattribute.php
  2. ¿Es mejor poner varios try y catch a lo largo del script en lugar de uno solo que englobe toda la ejecución?
  3. ¿Es necesario cerrar la conexión con las dos lineas o con la última ya basta?
    $consulta = null;
    $db = null;
  4. ¿Hay algún método para guardar los valores de la consulta en un array y evitar de tener que hacer esto?

    Código PHP:
    Ver original
    1. $array = array();
    2. while ($row = $consulta->fetch()){
    3.     $array[] = $row;
    4. }

  5. ¿Cómo puedo crear mis propios métodos utilizando la clase PDO? porque al estar integrada en el sistema no se ve no?
  6. ¿Si creo algo nuevo podría estar machacando la clase original PDO?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 12/04/2010, 12:21
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender PDO (varias dudas)

Cita:
Iniciado por neodani Ver Mensaje
  1. Linea 10, para que se utiliza?
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    He visto que hay muchos pero no he visto su explicacion/utilización (los dos que he puesto imagino que encuentra las excepciones, pero hay que poner alguno más? hay otro útil?
    Aquí hay una lista pero no encuentro explicación...
    http://www.php.net/manual/es/pdo.getattribute.php
Respecto a la pregunta 1, encontré la información con su explicación

http://publib.boulder.ibm.com/infoce...c/r0022476.htm

PDO::ATTR_ERRMODE: Informe de errores.

* PDO::ERRMODE_SILENT: Sólo establece códigos de error.
* PDO::ERRMODE_WARNING: Emite errores de nivel E_WARNING.
* PDO::ERRMODE_EXCEPTION: Emite excepciones.


Al setAttribute() hay que pasarle dos parametros el PDO::ATTR_ERRMODE y el que necesitemos de esos tres.

Agradecería si me podéis echar una mano con el resto de puntos del post anterior. Muchas gracias!
  #3 (permalink)  
Antiguo 12/04/2010, 13:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender PDO (varias dudas)

Cita:
Iniciado por neodani Ver Mensaje
  1. ¿Hay algún método para guardar los valores de la consulta en un array y evitar de tener que hacer esto?

    Código PHP:
    Ver original
    1. $array = array();
    2. while ($row = $consulta->fetch()){
    3.     $array[] = $row;
    4. }

Respecto al punto 4

Creo que es así, utilizando fetchAll();

Código PHP:
Ver original
  1. $result = $consulta->fetchAll();
  2. echo "<pre>";
  3. print_r($result);
  4. echo "</pre>";

Pongo las preguntas que todavía no he encontrado respuesta.
  1. ¿Es mejor poner varios try y catch a lo largo del script en lugar de uno solo que englobe toda la ejecución?
  2. ¿Es necesario cerrar la conexión con las dos lineas o con la última ya basta?
    $consulta = null;
    $db = null;
  3. ¿Cómo puedo crear mis propios métodos utilizando la clase PDO? porque al estar integrada en el sistema no se ve no?
  4. ¿Si creo algo nuevo podría estar machacando la clase original PDO?
  5. Para que sirve esta linea
    $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY , TRUE);
  6. Por qué no puedo usar los dos veces seguidas el metodo fetch y fetchall?

    El primero me devuelve datos y el segundo está vacío.

    Código PHP:
    Ver original
    1. $result = $consulta->fetchAll();
    2. echo "<pre>";
    3. print_r($result);
    4. echo "</pre>";
    5.  
    6. $array = array();
    7. while ($row = $consulta->fetch()){
    8.     $array[] = $row;
    9. }
    10.  
    11. echo "<pre>";
    12. print_r($array);
    13. echo "</pre>";


Muchas gracias de antemano!
  #4 (permalink)  
Antiguo 12/04/2010, 14:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Intentando entender PDO (varias dudas)

1.- Depende de el diseño de tu aplicación, a mi parecer es mucho mejor tener un try/catch global pero ahí si depende de lo que tu estes haciendo y cuando quieras atrapar el error.
2.- Basta con que limpies las variables (igualandolas a null) esto hace que se llame internamente al destructor y cierre la conexión.
3.- Puedes extender la clase sin problema, esa es una de las ventajas de POO:
Código PHP:
Ver original
  1. class MyPDO extends PDO {
  2.       public function foo() {
  3.  
  4.       }
  5. }

4.- Solo si sobreescribes alguna de las funciones de PDO, si no las sobreescribes no hay problema.
5.- Sirve para enviar querys a MySQL que no se cacheen en memoria, en el Manual de MySQL puedes ver más información.
6.- Esto es porque internamente incrementa o mueve el cursor, al usar fetchAll() regresa todos los datos y deja el cursor al final.

Saludos.
  #5 (permalink)  
Antiguo 12/04/2010, 15:21
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Intentando entender PDO (varias dudas)

Antes de nada, muchísimas gracias por tu tiempo Gatorv y por aclararme las dudas!

Cita:
Iniciado por GatorV Ver Mensaje
2.- Basta con que limpies las variables (igualandolas a null) esto hace que se llame internamente al destructor y cierre la conexión.
¿Entonces es necesario limpiar las dos, también la del $consulta->execute(...)
$consulta = null;
$db = null;

Mi duda está en que he visto sitios donde solo ponían a null el enlace de conexión...
$db = null;

Muchas gracias
  #6 (permalink)  
Antiguo 12/04/2010, 18:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Intentando entender PDO (varias dudas)

No es que sea necesario, si no lo haces el garbage collector de PHP lo hace por ti.

Saludos.

Etiquetas: entender, pdo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:26.