Tester un script de gestion de BdD
Ce billet explique comment tester un script php pour les manipulations Create, Read, Update, Delete (CRUD) d'une base de données sur un serveur distant.
Pour cette présentation, le code du script CRUD de démonstration utilisé, "MyCrud.php", figure dans l'onglet ci-dessous.
La base de données "testCrud" ciblée n'a qu'une seule table "student".
Cette table a 3 champs :
num : la clé primaire auto-incrémentée de type int ;
name : de type varchar(10) ;
course : de type varchar(24).
Pour les différentes opérations à tester, j'utilise l'interface graphique WEB fournie par le site Postman.
Les différentes opérations qui sont nécessaire pour ce test, sont illustrées ci-dessous :
Choisir "POST" comme type de requête "http" ;
Indiquer le chemin d'accès au script à tester ;
Choisir "body -raw -JSON" pour la nature du codage des données transmises par la requête ;
Saisir au format JSON la donnée à transmettre (exemple : dans l'illustration ci-dessous { "op":"read" } est la donnée à transmettre pour effectuer une lecture de la table) ;
Cliquer sur le bouton "Send" pour transmettre la requête ;
- Choisir JSON pour lire facilement le résultat de la requête.
L'image ci-dessus, montre le test de lecture des données de la table "student".
Le seul paramètre à transmettre au script est "op" avec la valeur "read". En format JSON, cela s'écrit {"op":"read"}.
Pour ces requêtes de lecture, le script "MyCrud.php" par ces 2 lignes de code "$response = array("Message"=>$msg, "Data"=>$data) ;" et "echo json_encode( $response );" renvoie, au format JSON, le tableau "associatif" don les 2 clés sont :
Message : dont la valeur est une information sur le déroulement de la requête ;
Data : dont la valeur est le tableau dont chaque clé sera un enregistrement de la table "student", chaque entrée figure entre { } ;
<?php header('Content-Type: text/html; charset=UTF-8'); $hostname = 'localhost'; $database = 'testcrud'; $username = 'root'; $password = ''; $mysqli = new mysqli($hostname, $username, $password, $database); // Vérification de la connexion if (mysqli_connect_errno()) { $msg = "HTTP/1.1 428 Failed to connect to MySQL:" . mysqli_connect_error(); header($msg); exit(); } // utf8 mysqli_set_charset($mysqli,"utf8"); // récupérer les info brutes tranmise par l'URL $encodedData= file_get_contents('php://input'); $decodedData=json_decode($encodedData,true); if (!(isset($decodedData['op']) && strlen($decodedData['op'])>0)){ $msg="HTTP/1.1 427 requete trop mal formulée ! : l'argument <<opération>> n'est pas défini "; header($msg); exit(); } $op= $decodedData['op']; $msg =""; $data = array(); switch ($op) { case "create": // variables attendues : $studentName, $course $studentName= $decodedData['studentName']; $course= $decodedData['course']; // --------------------- $sql = "SELECT * FROM student WHERE name ='".$studentName."'"; $result = $mysqli ->query($sql); if ($result) { if ($result->num_rows > 0) { $msg = "create OK : mais l'étudiant : " . $studentName . " est déjà enregistré..."; } else { $sql = "INSERT INTO student (name, course) values('" . $studentName ."','".$course."')"; $result2 = $mysqli ->query($sql); if ($result2){ $msg = "create OK : l'étudiant :" . $studentName . ", cours :" . $course ." a bien été enregistré "; } else { $msg = "create KO : pb INSERT INTO "; } } } else { $msg = "create KO : Pb SELECT "; } break; case "read": $sql = "SELECT * FROM student ORDER BY num DESC"; $result = $mysqli ->query($sql); if ($result) { if ($result->num_rows > 0) { // extraire chacun des enregistrements $msg=" read OK : "; while($row = $result->fetch_assoc()) { $data[] = $row; } } else { $msg=" read OK : mais pas de donnée dans la table"; } } else { $msg = "read KO : "; } break; case "update": // variables attendues $studentName, $ course, $num $studentName= $decodedData['studentName']; $course= $decodedData['course']; $num= $decodedData['num']; // --------------------- $sql = "SELECT * FROM student WHERE num ='" .$num. "'"; $result = $mysqli ->query($sql); if ($result) { if ($result->num_rows > 0) { // il y a un enregistrement à mettre à jour $sql = "UPDATE student SET name = '". $studentName . "', course = '". $course . "' WHERE num ='" .$num. "'" ; $result2 = $mysqli ->query($sql); if ($result2) { $msg=" update OK : enregistrement " .$num ." mis à jour"; } else{ $msg=" update KO : enregistrement " .$num ." n a pas été mis à jour"; } } else { $msg=" update OK : mais pas de donnée d'index ".$num. " dans la table"; } } else{ $msg=" update KO : pb avec SELECT"; } break; case "delete": // variable attendue $num $num= $decodedData['num']; // --------------------- $sql = "SELECT * FROM student WHERE num ='" .$num. "'"; $result = $mysqli ->query($sql); if ($result) { if ($result->num_rows > 0) { // il y a un enregistrement à supprimer $sql ="DELETE FROM student WHERE num ='" .$num. "'"; $result2 = $mysqli ->query($sql); if ($result2) { $msg=" delete OK : l'enregistrement " .$num ." est supprimé"; } else{ $msg=" delete KO : l'enregistrement " .$num ." n' a pas été supprimé"; } } else { $msg=" delete OK : mais pas de donnée d'index ".$num. " dans la table"; } } else{ $msg=" delete KO : pb avec SELECT"; } break; default : $msg="HTTP/1.1 426 requete trop mal formulee ! : l'argument <<opération>> inattendu est : " . $op; header($msg); break; } // fermeture $mysqli->close(); // affichage - transmission des résutats $response = array("Message"=>$msg, "Data"=>$data); echo json_encode( $response ); ?>
-
L'image ci-dessous, montre le test de création d'un enregistrement dans la table "student". Les paramètres à transmettre au script sont
"op" avec la valeur "create".
"studentName" avec pour valeur le nom de l'étudiant à inscrire
"course" avec pour valeur le nom du cours suivi par cet étudiant.
En format JSON, cela s'écrit {"op":"create", "studentName":"nomEtudiant","course":"nomCoursSuivi"}.
Pour ces requêtes de création, le script "MyCrud.php", toujours lors de l'exécution de "$response = array("Message"=>$msg, "Data"=>$data)" renvoie, au format JSON, le tableau "associatif" dont les clés :
Message : avec pour valeur une information sur le déroulement de la requête;
Data : avec par valeur un tableau vide ;
L'image ci-dessous, montre le test de mise à jour des données d'un enregistrement de la table "student". Les paramètres à transmettre au script sont
"op" avec la valeur "update";
"num" avec le numéro de l'enregistrement à mettre à jour ;
"studentName" avec pour valeur le nom de l'étudiant modifié (ou pas) ;
"course" avec pour valeur le nom du cours modifié (ou pas) ;