Skip to content

Crée une API interne en remplacement de ext/mysql

Francois Gannaz requested to merge 76-api-mysql into master

Après avoir tourné ext/mysqli dans tous les sens, je n'ai pas vu comment en faire un usage simple. Soit on se retrouve à manipuler des mysqli_real_escape_string(), soit on utilise des requêtes préparés associées à des variables (constantes interdites) dont il faut déclarer le type. J'ai donc préférer passer à PDO qui s'est imposé comme l'interface PHP pour les base de données. J'ai créé une classe DB pour en simplifier encore l'usage. C'est de la programmation aussi peu objet que possible.

Exemples pratiques

Cas général : itération sur les résultats

// avant
$query = "SELECT user.* FROM ... WHERE class_name LIKE '" . mysql_real_escape_string($name) . "'".
    . " AND x = " . ($x === null ? "NULL" : "'" . mysql_real_escape_string($x) . "'";
$result = query($query);
if (mysql_num_rows($result) > 0) {
    while ($user = mysql_fetch_object($result)) {

// après
$sql = "SELECT user.* FROM ... WHERE class_name LIKE :class AND x = :x";
$query = DB::query($sql, [':name' => $name, ':x' => $x]);
foreach ($query->fetchAll(PDO::FETCH_OBJECT) as $user) {
// variante
while ($user = $query->fetchObject()) {

Lire une valeur unique

// avant
$login = mysql_real_escape_string($_POST["user_login"]);
$pwd = mysql_real_escape_string(hash("sha256" , $_POST["user_pwd"]));
$query = "SELECT id_user, current_report FROM user WHERE login='".$login."' AND pwd='".$pwd."'";
$result = query($query);
if (mysql_num_rows($result) > 0) { // the user is in the DB
    $line = mysql_fetch_object($result);
    $id_user = $line->id_user;

// après
$login = $_POST["user_login"];
$pwd = $_POST["user_pwd"];
$id_user = DB::queryScalar(
   "SELECT id_user FROM user WHERE login = ? AND pwd = ?",
   [$login, hash("sha256" , $pwd)]
);

Netbeans peut compléter le résultat de query(), par exemple query(...)-> ctrl-espace.

Closes #76 (closed)

Edited by Francois Gannaz

Merge request reports