Last active
February 9, 2020 10:14
-
-
Save mdevoldere/99071c1e3a06b2db54a54110f9ee0099 to your computer and use it in GitHub Desktop.
PHP: Interaction avec PDO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* La classe Db permet d'interagir avec une connexion PDO | |
* | |
* - Initialisation d'instances PDO mysql ou sqlite via ses méthodes statiques | |
* - Requêtage sur une connexion PDO via ses méthodes d'instance | |
* | |
* | |
* // Exemple d'utilisation (initialisation d'une instance) | |
* $pdo = Db::mysql('nom_de_la_base', 'server_address', 'user', 'password'); | |
* $db = new Db($pdo); | |
* var_dump($db); | |
* // Exemple d'utilisation (requête simple) | |
* $result = $db->query('SELECT * from nom_d_une_table;'); | |
* var_dump($result); | |
* // Exemple d'utilisation (requête de lecture paramétrée) | |
* $id = 37; | |
* $result = $db->fetch('SELECT * from nom_d_une_table WHERE id=:id;', [':id' => $id]); | |
* var_dump($result); | |
* // Exemple d'utilisation (requête d'écriture paramétrée) | |
* $new_item = ['firstname' => 'John', 'lastname' => 'Snow']; | |
* $result = $db->exec('INSERT INTO nom_d_une_table (firstname, lastname) VALUES (:firstname, :lastname);', $newItem); | |
* var_dump($result); | |
* | |
* @author MDevoldere | |
* @version 1.0 | |
* @access public | |
*/ | |
class Db | |
{ | |
/** | |
* Connexion PDO MySQL | |
* @param string $dbname | |
* @param string $host | |
* @param string $user | |
* @param string $pwd | |
* @return PDO | |
*/ | |
public static function mysql(string $dbname, string $host = 'localhost', string $user = 'root', string $pwd = ''): \PDO | |
{ | |
try { | |
return new PDO('mysql:host=' . $host . ';port=3306;dbname=' . $dbname . ';charset=utf8', $user, $pwd, [ | |
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, | |
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, | |
PDO::ATTR_EMULATE_PREPARES => false | |
]); | |
} catch (PDOException $e) { | |
exit('Db Connection Error (1)'); | |
} | |
} | |
/** | |
* Connexion PDO SQLite | |
* @param string $path | |
* @return PDO | |
*/ | |
public static function sqlite(string $path) | |
{ | |
try { | |
$db = new PDO(('sqlite:' . $path), 'charset=utf8'); | |
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | |
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); | |
$db->exec('pragma synchronous = off;'); | |
return $db; | |
} catch (PDOException $e) { | |
exit('Db Connection Error (2)'); | |
} | |
} | |
/** @var PDO $pdo */ | |
protected $pdo; | |
/** Constructeur | |
* @param PDO $_pdo La connexion PDO à utiliser | |
*/ | |
public function __construct(PDO $_pdo) | |
{ | |
$this->pdo = $_pdo; | |
} | |
/** Exécute une requête de lecture simple | |
* @param string $_query La requête à exécuter | |
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1ère ligne trouvée | |
* @return array|false Le jeu de résultat ou empty si aucun résultat | |
*/ | |
public function query(string $_query, bool $_all = false): array | |
{ | |
try { | |
$stmt = $this->pdo->query($_query); | |
$r = (($_all === false) ? $stmt->fetch() : $stmt->fetchAll()); | |
return !empty($r) ? $r : []; | |
} catch (Exception $e) { | |
exit('Db Query Error'); | |
} | |
} | |
/** Exécute une requête de lecture paramétrée | |
* @param string $_query La requête à exécuter | |
* @param array $_values Les paramètres de la requête | |
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1er ligne trouvée | |
* @return array Le jeu de résultat ou empty si aucun résultat | |
*/ | |
public function fetch(string $_query, array $_values = [], bool $_all = false): array | |
{ | |
try { | |
$stmt = $this->pdo->prepare($_query); | |
if ($stmt->execute($_values)) { | |
$r = (($_all === false) ? $stmt->fetch() : $stmt->fetchAll()); | |
$stmt->closeCursor(); | |
return !empty($r) ? $r : []; | |
} | |
return []; | |
} catch (Exception $e) { | |
exit('Db Fetch Error'); | |
} | |
} | |
/** Exécute une requête d'écriture paramétrée | |
* @param string $_query La requête à exécuter | |
* @param array $_values Les paramètres de la requête | |
* @return int Le nombre de lignes affectées | |
*/ | |
public function exec(string $_query, array $_values = []): int | |
{ | |
try { | |
$stmt = $this->pdo->prepare($_query); | |
if ($stmt->execute($_values)) { | |
$r = $stmt->rowCount(); | |
$stmt->closeCursor(); | |
return $r; | |
} | |
return 0; | |
} catch (Exception $e) { | |
exit('Db Exec Error'); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** Classe DbTable : Représente une table | |
* | |
* @author MDevoldere | |
* @version 1.0 | |
* @access public | |
*/ | |
class DbTable | |
{ | |
/** @var Db $db Représente une connexion vers une base de données */ | |
protected $db; | |
/** @var string $name Le nom de la table */ | |
protected $name; | |
/** @var string $pk Le nom de la clé primaire de la table */ | |
protected $pk; | |
/** Constructeur de la classe | |
* @param Db $_db La connexion à la base de données | |
* @param string $_table Le nom de la table | |
* @param string $_pk Le nom de la clé primaire | |
*/ | |
public function __construct(Db $_db, string $_table, string $_pk = 'id') | |
{ | |
$this->db = $_db; | |
$this->name = $_table; | |
$this->pk = $_pk; | |
} | |
/** Récupère toutes les lignes/colonnes de la table courante | |
* @return array $result le résultat de la requête | |
*/ | |
public function getAll(): array | |
{ | |
return $this->db->query(("SELECT * FROM " . $this->name . ";"), true); | |
} | |
/** Récupère toutes les lignes de la table courante et fait correspondre les clés du tableau du jeu résultat avec la valeur de la clé primaire de chaque élément | |
* @return array $result le résultat de la requête sous forme de tableau | |
*/ | |
public function getAllSorted(): array | |
{ | |
$in = $this->getAll(); | |
$out = []; | |
if (!$in) { | |
return $out; | |
} | |
foreach ($in as $k => $v) { | |
$out[$v[$this->pk]] = $v; | |
} | |
return $out; | |
} | |
/** Récupère un élément de la table à partir de son identifiant | |
* @param int $_id l'identifiant à rechercher | |
* @return array $result le résultat de la requête sous forme de tableau | |
*/ | |
public function get(int $_id): array | |
{ | |
return $this->db->fetch("SELECT * FROM " . $this->name . " WHERE " . $this->pk . "=:id;", [':id' => $_id], false); | |
} | |
/** Récupère un élément de la table à partir de la valeur d'une colonne | |
* @param string $_col la colonne sur laquelle la recherche est effectuée | |
* @param string $_value la valeur à rechercher | |
* @param bool $_all true = retourne toutes les lignes trouvées. false = retourne la 1er ligne trouvée | |
* @return array|false $result le résultat de la requête sous forme de tableau | |
*/ | |
public function getBy(string $_col, string $_value, bool $_all = false): array | |
{ | |
return $this->db->fetch("SELECT * FROM " . $this->name . " WHERE " . \basename($_col) . "=:cond;", [':cond' => $_value], $_all); | |
} | |
/** Insère un nouvel élément | |
* @param array $_values Le tableau de valeurs correspondant à la table courante | |
* @return int Le nombre de lignes affectées | |
*/ | |
public function insert(array $_values): int | |
{ | |
$cols = \array_keys($_values); | |
$vals = (':' . \implode(', :', $cols)); | |
$cols = \implode(',', $cols); | |
return $this->db->exec("INSERT INTO " . $this->name . " (" . $cols . ") VALUES (" . $vals . ");", $_values); | |
} | |
/** Met à jour un élément | |
* @param array $_values Le tableau de valeurs correspondant à la table courante. Doit contenir l'identifiant de la ligne à mettre à jour. | |
* @return int Le nombre de lignes affectées | |
*/ | |
public function update(array $_values): int | |
{ | |
$cols = []; | |
foreach ($_values as $k => $v) { | |
$cols[$k] = ($k . '=:' . $k); | |
} | |
return $this->db->exec("UPDATE " . $this->name . " SET " . \implode(', ', $cols) . " WHERE " . $this->pk . "=:" . $this->pk . ";", $_values); | |
} | |
/** Supprime un élément | |
* @param int $_id L'identifiant de la ligne à supprimer | |
* @return int Le nombre de lignes affectées | |
*/ | |
public function delete(int $_id): int | |
{ | |
return $this->db->exec("DELETE FROM " . $this->name . " WHERE " . $this->pk . "=:id;", [':id' => $_id]); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment