Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
WB-CWeb et TIC

PHP/MySQL — flux requête web, branches et messages

Idée directrice

Le troisième lot note les scripts côté serveur : récupérer $_POST, ouvrir MySQL (syntaxe d’examen mysql_*), vérifier l’existence des clés, INSERT/UPDATE/SELECT, puis echo du message de succès ou d’échec. Ce n’est pas un exercice de schéma SQL pur (chapitre BD) : l’enjeu est le flux formulaire → PHP → réponse HTML. Syntaxe attestée i-c3-03 (EasyPHP) = legacy d’examen.

Ce qui aide à reconnaître la démarche

« isset($_POST[…]) »

« mysql_connect … mysql_query … mysql_num_rows »

« echo … message de succès / échec »

Besoin d’un point de départ ? Voir la méthode
  • Ordre stable : isset → variables → connect → select_db → requête(s) → num_rows → echo → close.
  • Tester l’existence avant INSERT/UPDATE (comme le corrigé Helali sur candidat/spécialité).
  • Prévoir le else de récupération incorrecte si le POST manque.
Les pièges à vérifier dans ta démarche
  • Écrire seulement le SQL sans isset / echo — ce n’est plus le flux web noté.
  • Un seul message d’échec pour des causes distinctes quand le sujet en distingue plusieurs.
  • Remplacer silencieusement mysql_* par un framework : hors attendu d’examen si la consigne suit le modèle EasyPHP.
Sujet principal

Exercice — dans l'esprit des sujets du bac

2 questionsCorrigé masqué

La coopérative scolaire dispose déjà des tables MySQL produit(code_prod, libelle_prod, stock_prod) et commande(num_cmd, code_prod#, qte_cmd, date_cmd). Un formulaire HTML name="fcmd" envoie en POST vers commande.php les champs code_prod (name cp), qte (name qt) et le bouton submit name b1.

  1. Écrire le script PHP commande.php (syntaxe d’examen EasyPHP) qui :
    a. vérifie isset($_POST['cp']) ;
    b. récupère $cp et $qt ;
    c. se connecte (mysql_connect("localhost","root","")) et sélectionne la base bd_coop ;
    d. teste si le produit existe (SELECT + mysql_num_rows) ;
    e. si oui : INSERT dans commande avec la date système et affiche « Commande enregistrée » ; si non : « Produit introuvable » ;
    f. ferme la connexion.
  2. En une phrase, pourquoi ce script est un exercice web (WB) et non un exercice BD pur ?
Voir la correction commentéeAprès avoir posé votre démarche

Récupération PHP + connexion MySQL (syntaxe d’examen mysql_*, balises courtes éventuelles) :

<?
if (isset($_POST['cp']))
{
  $cp = $_POST['cp'];
  $qt = $_POST['qt'];
  $date = date('Y-m-d');
  mysql_connect("localhost", "root", ""); // connexion serveur (legacy examen)
  mysql_select_db("bd_coop");

Requête, branches et affichage :

  $rep = mysql_query("select code_prod from produit where code_prod='$cp'");
  if (mysql_num_rows($rep) == 1)
  {
    mysql_query("insert into commande values('', '$cp', '$qt', '$date')");
    echo "<b>Commande enregistree</b>";
  }
  else
  {
    echo "<b>Produit introuvable</b>";
  }
  mysql_close();
}
else
  echo "<b>la recuperation des donnees est incorrecte</b>";
?>

WB vs BD. Ici on enchaîne réception du formulaire web (isset, $_POST), exécution conditionnelle et réponse affichée au navigateur. Un exercice BD pur s’arrêterait au schéma ou à la requête SQL hors page PHP.

Legacy / sécurité. mysql_*, injection SQL par concaténation et root sans mot de passe sont la syntaxe des sujets du bac (EasyPHP). En production moderne : PDO/mysqli préparés, comptes limités, validation serveur stricte. Seule la première est attendue ; ne confondez pas les deux.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Exercices d'entraînement — une nuance à la fois

1 Drill WB-C.1 — Afficher les membres d’un club (SELECT + boucle)
Entraînement 01 / 03

Drill WB-C.1 — Afficher les membres d’un club (SELECT + boucle)

1 questionCorrigé masqué

Formulaire POST vers liste.php d’un club photo : champ name="niveau" (texte). Table déjà créée : membre(id_m, nom_m, niveau_m).

  1. Écrire liste.php : si isset($_POST['niveau']), connexion à bd_photo, SELECT des membres de ce niveau ; s’il y a des lignes, afficher nom et niveau dans une boucle mysql_fetch_array ; sinon echo « Aucun membre pour ce niveau » ; fermer la connexion.
Voir la correction commentéeAprès avoir posé votre démarche
<?
if (isset($_POST['niveau']))
{
  $niv = $_POST['niveau'];
  mysql_connect("localhost", "root", "");
  mysql_select_db("bd_photo");
  $rep = mysql_query("select * from membre where niveau_m='$niv'");
  if (mysql_num_rows($rep) != 0)
  {
    while ($res = mysql_fetch_array($rep))
    {
      echo "<b>Nom : </b>"; echo $res['nom_m']; echo " ";
      echo "<b>Niveau : </b>"; echo $res['niveau_m']; echo "<br>";
    }
  }
  else
    echo "<b>Aucun membre pour ce niveau</b>";
  mysql_close();
}
else
  echo "<b>la recuperation des donnees est incorrecte</b>";
?>
2 Drill WB-C.2 — Mise à jour d’un tarif (UPDATE conditionnel)
Entraînement 02 / 03

Drill WB-C.2 — Mise à jour d’un tarif (UPDATE conditionnel)

1 questionCorrigé masqué

Formulaire POST vers tarif.php d’un atelier de réparation : name="ref" (référence pièce) et name="prix" (nouveau prix). Table piece(ref_p, libelle_p, prix_p).

  1. Écrire tarif.php : récupération POST, connexion bd_atelier, si la référence existe alors UPDATE du prix et message « Tarif mis a jour », sinon « Reference inconnue », mysql_close.
Voir la correction commentéeAprès avoir posé votre démarche
<?
if (isset($_POST['ref']))
{
  $ref = $_POST['ref'];
  $prix = $_POST['prix'];
  mysql_connect("localhost", "root", "");
  mysql_select_db("bd_atelier");
  $rep = mysql_query("select ref_p from piece where ref_p='$ref'");
  if (mysql_num_rows($rep) == 1)
  {
    mysql_query("update piece set prix_p='$prix' where ref_p='$ref'");
    echo "<b>Tarif mis a jour</b>";
  }
  else
    echo "<b>Reference inconnue</b>";
  mysql_close();
}
else
  echo "<b>la recuperation des donnees est incorrecte</b>";
?>
3 Transfert — le contrôle JavaScript ne protège pas la base : refaire le test dans le PHP
Entraînement 03 / 03

Transfert — le contrôle JavaScript ne protège pas la base : refaire le test dans le PHP

4 questionsCorrigé masquéEn cours de relecture

Un club sportif gère ses inscriptions sous EasyPHP. La base bd_club contient les tables adherent(cin_adh, nom_adh), activite(code_act, nom_act) et inscription(cin_adh#, code_act#, date_ins). La page inscrire.html porte le formulaire name="fi", action="inscription.php", method="post", onsubmit="return verifInsc()", avec un champ texte name="cin" (8 chiffres), un champ texte name="cod" (code activité, 4 chiffres) et un bouton d'envoi name="b". La fonction JavaScript externe verifInsc() est déjà écrite et fonctionne : elle affiche un alert(...) puis fait return false dès qu'un champ est invalide.

  1. Citer deux situations concrètes dans lesquelles le script inscription.php reçoit malgré tout un CIN de 5 chiffres, alors que verifInsc() existe et fonctionne. Qu'en déduire sur le rôle exact d'un contrôle écrit en JavaScript ?
  2. Écrire le script inscription.php (syntaxe d'examen) qui : teste isset($_POST['b']) et isset($_POST['cin']) ; récupère $cin et $cod ; refait les deux contrôles (valeur numérique, longueur 8 et 4) et, si l'un échoue, affiche « Données non valides » sans ouvrir la base ; sinon se connecte à bd_club, vérifie que le CIN figure dans adherent et que le code figure dans activite, insère alors l'inscription avec la date système et affiche « Inscription enregistrée » ; en cas d'échec, distingue par un message propre l'adhérent absent, l'activité absente et les deux à la fois ; ferme la connexion.
  3. Pourquoi les deux contrôles doivent-ils être placés avant mysql_connect et avant toute requête ?
  4. Le contrôle JavaScript devient-il inutile ? Répondre en distinguant ce que chacun des deux contrôles apporte, et à qui.

Cet exercice et sa correction sont en cours de relecture. Tu peux les consulter ; l’exercice n’est pas encore proposé en séance.

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : le code JavaScript s'exécute chez le visiteur, donc le serveur ne peut rien en conclure.

Deux situations : (a) le navigateur a JavaScript désactivé ou bloqué par une extension — onsubmit n'appelle plus rien et le formulaire part tel quel ; (b) la requête POST atteint inscription.php sans passer par la page, depuis une copie locale du formulaire ou un outil de test — la fonction verifInsc() n'est alors jamais chargée.

Un contrôle JavaScript est donc un confort de saisie : message immédiat, aller-retour réseau évité. Ce n'est jamais une garantie sur les données reçues ; le seul contrôle que le serveur peut opposer est celui qu'il exécute lui-même.

2. Idée : valider d'abord, se connecter ensuite, puis distinguer chaque cause d'échec par son propre message.

<?
if(isset($_POST['b']) and isset($_POST['cin']))
  {
   $cin=$_POST['cin'];
   $cod=$_POST['cod'];
   if((!is_numeric($cin)) or (strlen($cin)!=8) or (!is_numeric($cod)) or (strlen($cod)!=4))
      echo "<b>Données non valides</b>";
   else
     {
      mysql_connect("localhost","root",""); //connexion au serveur
      mysql_select_db("bd_club"); //selection de la base
      $r1=mysql_query("select cin_adh from adherent where cin_adh='$cin'");
      $r2=mysql_query("select code_act from activite where code_act='$cod'");
      if((mysql_num_rows($r1)==1) and (mysql_num_rows($r2)==1))
        {
         mysql_query("insert into inscription values('$cin','$cod','".date('Y-m-d')."')");
         echo "<b>Inscription enregistrée</b>";
        }
      else if((mysql_num_rows($r1)==0) and (mysql_num_rows($r2)==1))
         echo "<b>Cet adhérent n'existe pas</b>";
      else if((mysql_num_rows($r1)==1) and (mysql_num_rows($r2)==0))
         echo "<b>Cette activité n'existe pas</b>";
      else
         echo "<b>Ni cet adhérent ni cette activité n'existent</b>";
      mysql_close();
     }
  }
else
  echo "<b>la récupération des données est incorrecte</b>";
?>


Trois points de barème : le else final du isset — une requête arrivée sans le bouton d'envoi reçoit une réponse au lieu d'une page vide ; les deux SELECT de présence avant l'ajout, sans lesquels on insère des clés étrangères qui ne pointent nulle part ; et un message par cause d'échec, le message unique pour tous les échecs étant précisément ce que le corrigé refuse. Les contrôles de longueur sont les mêmes que ceux de verifInsc(), réécrits ici : c'est cette répétition apparente qui est le vrai travail de l'exercice.

3. Idée : un test qui échoue ne doit rien coûter et rien exposer.

Une connexion ouverte puis refermée pour rien consomme une ressource du serveur à chaque envoi invalide. Surtout, les valeurs reçues sont recopiées telles quelles dans le texte des requêtes : tant qu'elles n'ont pas été validées, aucune requête ne doit être construite avec elles. Le test d'abord, la connexion ensuite — c'est aussi ce qui permet d'afficher « Données non valides » sans jamais toucher à bd_club.

4. Idée : les deux contrôles ne rendent pas le même service et ne s'adressent pas au même destinataire.

Le contrôle JavaScript sert l'utilisateur : il signale l'erreur au moment de la saisie, champ par champ, sans attendre une réponse du serveur, et évite un envoi inutile. Le contrôle PHP sert la base : il est le dernier point de passage avant l'écriture et décide seul de ce qui entre dans inscription. Retirer le premier dégrade l'ergonomie ; retirer le second laisse entrer n'importe quoi. On garde les deux, en sachant lequel des deux protège les données.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.