Comenzando con pdo

Instalación o configuración

PDO es un comando de conexión de base de datos universal en PHP, admite 12 tipos de bases de datos diferentes, por ejemplo, MySQL, MongoDB, NoSQL. Una gran ventaja de PDO es que calcula su código para admitir el tipo de base de datos, por lo que no necesita correr ningún riesgo al pasar a otro sistema de base de datos.


Resumen

DOP mysqli
Soporte de base de datos 12 conductores diferentes mysqli
API Programación orientada a objetos OOP + procedimental
Conexión Fácil Fácil
Parámetros con nombre No
Asignación de objetos
Declaraciones preparadas (lado del cliente) No
Rendimiento rápido rápido
Procedimientos almacenados

Conexión a la base de datos con PDO:

La parte de la conexión parece incómoda, pero tenemos que lidiar con eso. El resto del PDO es simple y útil, también ayuda a que la parte segura sea aún más fácil.

$connection = new PDO("mysql:host=localhost;dbname=myDatabase, username, password);

La conexión PDO se ordena de la siguiente manera:

PDO(tipo de base de datos:host=host;dbname=nombre de la base de datos, raíz, contraseña** );**


Selección segura de la base de datos usando PDO:

// We use a array to hold the data about whats the :var is in normal $var
$params = array(
    ':username' => '$username', 
    ':email' => $mail, 
);

// Prepare the SQL and using named secure parameters ":username"
$pdo->prepare('SELECT * FROM users WHERE username = :username AND email = :email');

// Execute the $params and send them to the $pdo->prepare 
$pdo->execute($params);

El código que acaba de leer, es inyección SQL de agentes protegidos


**Tutoriales:**

Instalar:

Cómo instalar PDO si no lo tienes

Guías:

Tutorial de W3Schools Tuts+ Tutorial (Recomendado)

Modo de error de atributo de configuración de PDO

PDO::setAttribute establece un atributo en el identificador de la base de datos. La descripción de setAttribute es:

public bool PDO::setAttribute ( int $attribute , mixed $value )

PDO::ATTR_ERRMODE: Este atributo se utiliza para informar errores. Puede tener uno de los siguientes valores.

  • PDO::ERRMODE_SILENT: si ATTR_ERRMODE no está configurado en el código, ERRMODE_SILENT es el valor predeterminado del atributo ATTR_ERRMODE. Eso establece códigos de error. En modo silencioso, si hay un error en SQL, PDO no arrojará excepciones; PDO no emitirá advertencias; simplemente será falso retorno. El valor de PDO::ERRMODE_SILENT es 0. El script se ejecutará sin generar ningún error o advertencia.
  • PDO::ERRMODE_WARNING: Este valor genera E_WARNING. En el modo de advertencia, si hay un error en SQL, PDO emitirá advertencias pero la secuencia de comandos continuar corriendo El valor de PDO::ERRMODE_WARNING es 1. El script ejecutar con la generación de advertencia sobre el error.
  • PDO::ERRMODE_EXCEPTION: Este valor arroja excepciones. en excepción modo, si hay un error en SQL, PDO lanzará excepciones y el script dejará de ejecutarse. El valor de PDO::ERRMODE_EXCEPTION es 2. El el script dejará de ejecutarse generando el error que arroja el excepción.

Ejemplo: Ahora vamos a ver los distintos valores del atributo ATTR_ERRMODE con algunos ejemplos. Para hacerlo, cree una base de datos llamada learn_project_db e inserte una tabla llamada user_table dentro de ella. El siguiente fragmento de SQL se puede utilizar para lograrlo:

DROP DATABASE IF EXISTS `learn_project_db`;
CREATE DATABASE `learn_project_db`;
USE `learn_project_db`;
CREATE TABLE `user_table` (
  `user_email` varchar(50) PRIMARY KEY,
  `user_password` varchar(50) NOT NULL
);
INSERT INTO `user_table` (`user_email`, `user_password`) VALUES
('[email protected]', '123'),
('[email protected]', '1234'),
('[email protected]', '12345');

Primero vamos a comprobar qué sucederá si no configuramos ATTR_ERRMODE y tendremos un error en la consulta SQL. Crea un archivo PHP llamado default.php y prueba esto:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

Tenga en cuenta que el nombre de la tabla es wrong_user_table en la consulta que no está definida en la base de datos que creamos anteriormente. Pero, como no configuramos ATTR_ERRMODE, ejecutará el script sin generar ninguna excepción ni emitir ninguna advertencia. Dará como resultado una matriz vacía como conjunto de resultados. También debemos notar que el valor de PDO::ATTR_ERRMODE es 0.

Ahora, vamos a verificar qué sucederá si configuramos ATTR_ERRMODE con el valor PDO::ERRMODE_WARNING y tendremos un error en la consulta SQL. Cree un archivo PHP llamado warning.php e intente esto:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

La salida de warning.php es:

Warning: PDOStatement::execute(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist in E:\xampp\htdocs\oop\db.php on line 10
array(0) { } 
Value of PDO::ATTR_ERRMODE: 1

Esta vez, cuando configuramos ATTR_ERRMODE con el valor PDO::ERRMODE_WARNING, mostrará un mensaje de advertencia. El script se ejecuta correctamente y muestra una matriz vacía como salida con el valor de PDO::ATTR_ERRMODE de 1.

Por último, vamos a comprobar qué sucederá si configuramos ATTR_ERRMODE con el valor PDO::ERRMODE_EXCEPTION y tendremos un error en la consulta SQL. Cree un archivo PHP llamado error.php e intente esto:

<?php
    $server = "localhost";
    $db_username = "root";
    $db_password = "";
    $db_name = "learn_project_db";
    $conn = new PDO("mysql:host=$server;dbname=$db_name",$db_username,$db_password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
    $sql_query = "SELECT * FROM wrong_user_table";
    $stmt = $conn->prepare($sql_query);
    $stmt->execute();
    $result_set = $stmt->fetchAll();
    var_dump($result_set);
    /*Get the current error mode of PDO*/
    $current_error_mode = $conn->getAttribute(PDO::ATTR_ERRMODE);
    echo "<br>";
    echo "Value of PDO::ATTR_ERRMODE: ".$current_error_mode; 
?>

La salida de error.php es:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'learn_project_db.wrong_user_table' doesn't exist' in E:\xampp\htdocs\oop\db.php:10 Stack trace: #0 E:\xampp\htdocs\oop\db.php(10): PDOStatement->execute() #1 {main} thrown in E:\xampp\htdocs\oop\db.php on line 10

Esta vez, cuando configuramos ATTR_ERRMODE con el valor PDO::ERRMODE_EXCEPTION, arrojará PDOException, que genera un error fatal. El script dejará de ejecutarse después de que se produzca la excepción. Este es el enfoque más común para manejar los errores relacionados con las consultas de la base de datos. La mayoría de las veces, establecemos el atributo ATTR_ERRMODE con este valor para manejar cualquier excepción que pueda residir en la consulta SQL.