Masar
Masar
Bac Tunisie
Entraîner la reconnaissance
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.

Signature de reconnaissance — l'énoncé se trahit ainsi

« isset($_POST[…]) »

« mysql_connect … mysql_query … mysql_num_rows »

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

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 :
    1. vérifie `isset(POST[cp]);2.reˊcupeˋre_POST['cp'])` ; 2. récupère `cp` et `$qt` ;
    3. se connecte (`mysql_connect("localhost","root","")`) et sélectionne la base `bd_coop` ;
    4. teste si le produit existe (`SELECT` + `mysql_num_rows`) ;
    5. si oui : `INSERT` dans `commande` avec la date système et affiche « Commande enregistrée » ; si non : « Produit introuvable » ;
    6. 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) :

```php
<?
if (isset(_POST['cp'])) {cp = POST[cp];_POST['cp'];qt = POST[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 :

```php
rep=mysqlquery("selectcodeprodfromproduitwherecodeprod=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,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 corrigés EasyPHP du bac SI. En production moderne : PDO/mysqli préparés, comptes limités, validation serveur stricte. Le barème d’examen note la première ; ne confondez pas les deux.

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

Entraînement 01 / 02

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

```php
<?
if (isset(_POST['niveau'])) {niv = POST[niveau];mysqlconnect("localhost","root","");mysqlselectdb("bdphoto");_POST['niveau']; mysql_connect("localhost", "root", ""); mysql_select_db("bd_photo");rep = mysql_query("select * from membre where niveau_m='niv");if(mysqlnumrows(niv'"); if (mysql_num_rows(rep) != 0)
{
while (res=mysqlfetcharray(res = mysql_fetch_array(rep))
{
echo "<b>Nom : </b>"; echo res[nomm];echo"";echo"<b>Niveau:</b>";echores['nom_m']; echo " "; echo "<b>Niveau : </b>"; echores['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>";
?>
```

Entraînement 02 / 02

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

```php
<?
if (isset(_POST['ref'])) {ref = POST[ref];_POST['ref'];prix = POST[prix];mysqlconnect("localhost","root","");mysqlselectdb("bdatelier");_POST['prix']; mysql_connect("localhost", "root", ""); mysql_select_db("bd_atelier");rep = mysql_query("select ref_p from piece where ref_p='ref");if(mysqlnumrows(ref'"); if (mysql_num_rows(rep) == 1)
{
mysql_query("update piece set prix_p='prixwhererefp=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>";
?>
```

Méthode / Automatismes
  • 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.
Pièges classiques
  • É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.