Débuter avec pdo

Installation ou configuration

PDO est une commande de connexion à une base de données universelle en PHP, elle prend en charge 12 types de bases de données différents, par exemple * MySQL, MongoDB, NoSQL *. Un gros avantage de PDO est qu’il calcule votre code pour prendre en charge le type de base de données, vous n’avez donc pas besoin de tenter votre chance lorsque vous passez à un autre système de base de données.


Résumé

AOP MySQLi
Support de base de données 12 pilotes différents MySQLi
API POO POO + procédural
Connexion Facile Facile
Paramètres nommés Oui Non
Mappage d’objets Oui Oui
Relevés préparés (côté client) Oui Non
Performances Rapide Rapide
Procédures stockées Oui Oui

Connexion à la base de données avec PDO :

La partie connexion semble gênante mais nous devons nous en occuper. Le reste du PDO est simple et utile, il contribue également à rendre la partie sécurisée encore plus simple.

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

Le PDO connect se commande par :

PDO(type de base de données:host=host;dbname=nom de la base de données, root, password** );**


Sélection sécurisée dans la base de données à l'aide de 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);

Le code que vous venez de lire est une injection SQL d’agents protégés


**Tutoriels :**

Installer:

[Comment installer PDO si vous ne l’avez pas] [2]

Guides :

[Tutoriel W3Schools][3] [Tutoriel Tuts+ (recommandé)][4]

[1] : https://i.stack.imgur.com/cL60e.png [2] : http://php.net/manual/en/pdo.installation.php [3] : http://www.w3schools.com/php/php_mysql_prepared_statements.asp [4] : https://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use–net-24059

Mode d’erreur d’attribut de réglage PDO

PDO::setAttribute définit un attribut sur le handle de la base de données. La description de setAttribute est :

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

PDO::ATTR_ERRMODE : Cet attribut est utilisé pour le rapport d’erreurs. Il peut prendre l’une des valeurs suivantes.

  • PDO::ERRMODE_SILENT : si l’ATTR_ERRMODE n’est pas défini dans le code, ERRMODE_SILENT est la valeur par défaut de l’attribut ATTR_ERRMODE. Ce définit les codes d’erreur. En mode silencieux, s’il y a une erreur dans SQL, PDO ne lancera aucune exception ; PDO n’émettra aucun avertissement ; ce sera tout simplement retourner faux. La valeur de PDO::ERRMODE_SILENT est 0. Le script s’exécutera sans générer d’erreur ou d’avertissement.
  • PDO::ERRMODE_WARNING : cette valeur déclenche E_WARNING. En mode avertissement, s’il y a une erreur dans SQL, PDO émettra des avertissements mais le script le fera continuer à courir. La valeur de PDO::ERRMODE_WARNING est 1. Le script exécuter avec la génération d’un avertissement sur l’erreur.
  • PDO::ERRMODE_EXCEPTION : cette valeur lève des exceptions. En exception mode, s’il y a une erreur dans SQL, PDO lèvera des exceptions et le script cessera de s’exécuter. La valeur de PDO::ERRMODE_EXCEPTION est 2. Le le script cessera de s’exécuter en générant l’erreur qui lance le exception.

Exemple: Nous allons maintenant voir les différentes valeurs de l’attribut ATTR_ERRMODE avec quelques exemples. Pour ce faire, créez une base de données appelée learn_project_db et insérez une table appelée user_table à l’intérieur. L’extrait de code SQL suivant peut être utilisé pour y parvenir :

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');

Dans un premier temps, nous allons vérifier ce qui se passera si nous ne définissons pas ATTR_ERRMODE et nous aurons une erreur dans la requête SQL. Créez un fichier PHP appelé default.php et essayez ceci :

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

Notez que le nom de la table est wrong_user_table dans la requête qui n’est pas définie dans la base de données que nous avons créée précédemment. Mais, comme nous n’avons pas défini ATTR_ERRMODE, il exécutera le script sans lever d’exception ni émettre d’avertissement. Il affichera un tableau vide comme jeu de résultats. Nous devons également remarquer que la valeur de PDO::ATTR_ERRMODE est 0.

Maintenant, nous allons vérifier ce qui se passera si nous définissons ATTR_ERRMODE avec la valeur PDO::ERRMODE_WARNING et nous aurons une erreur dans la requête SQL. Créez un fichier PHP appelé warning.php et essayez ceci :

<?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 sortie de warning.php est :

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

Cette fois, alors que nous définissons ATTR_ERRMODE avec la valeur PDO::ERRMODE_WARNING, un message d’avertissement s’affichera. Le script s’exécute avec succès et affiche un tableau vide en sortie avec la valeur de PDO::ATTR_ERRMODE de 1.

Enfin, nous allons vérifier ce qui se passera si nous définissons ATTR_ERRMODE avec la valeur PDO::ERRMODE_EXCEPTION et nous aurons une erreur dans la requête SQL. Créez un fichier PHP appelé error.php et essayez ceci :

<?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 sortie de error.php est :

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

Cette fois, alors que nous définissons ATTR_ERRMODE avec la valeur PDO :: ERRMODE_EXCEPTION, il lancera PDOException qui génère une erreur fatale. Le script cessera de s’exécuter après la levée de l’exception. Il s’agit de l’approche la plus courante pour gérer les erreurs liées aux requêtes de base de données. La plupart du temps, nous définissons l’attribut ATTR_ERRMODE avec cette valeur pour gérer toute exception pouvant résider dans la requête SQL.