Skip to content

Instantly share code, notes, and snippets.

@mdevoldere
Last active February 9, 2020 10:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdevoldere/99071c1e3a06b2db54a54110f9ee0099 to your computer and use it in GitHub Desktop.
Save mdevoldere/99071c1e3a06b2db54a54110f9ee0099 to your computer and use it in GitHub Desktop.
PHP: Interaction avec PDO
<?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');
}
}
}
<?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