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 à réaliser pour ce test, sont illustrées ci-dessous :

  1. choisir POST comme type de requête "http" ;
  2. indiquer le chemin d'accès au script à tester ;
  3. choisir body -raw -JSON pour la nature du codage des données transmise par la requête ;
  4. 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) ;
  5. cliquer sur le bouton "Send" pour transmettre la requête ;
  6. choisir JSON pour lire facilement le résultat de la requête.
Cliquer pour agrandir l'image

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, lors de l'exécution des 2 lignes de code  "$response = array("Message"=>$msg, "Data"=>$data) ;" et "echo json_encode( $response );" le  script "MyCrud.php" renvoie, au format JSON, le tableau "associatif" à 2 entrées que sont :

  • Message : information sur le déroulement de la requête ;
  • Data : le tableau dont chaque entrée sera un enregistrement de la table "student", chaque entrée figure entre {}  ;

Cliquez sur le bouton pour copier le code
dans le presse papier
    
<?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" à 2 entrées :

  • Message : information sur le déroulement de la requête;
  • Data : le tableau vide ;
Cliquer pour agrandir l'image

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) ;
Cliquer pour agrandir l'image

L'image ci-dessous, montre le test de suppression d'un enregistrement de la table "student". Les paramètres à transmettre au script sont

  • "op" avec la valeur "delete";
  • "num" avec le numéro de l'enregistrement à supprimer ;
Cliquer pour agrandir l'image

L'image ci-dessous illustre un cas d'erreur. Les paramètres à transmettre au script sont en nombre insuffisant ou sont mal formulés.

Cliquer pour agrandir l'iamge
  •