formateur informatique

Créer un nouveau client à facturer en Php

Accueil  >  Technique  >  Php  >  Php Avancé  >  Créer un nouveau client à facturer en Php
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Nouveaux clients et factures en Php

Dans la formation Php précédente, nous avons monté une interface Web pour gérer l'approvisionnement des stocks d'un magasin. C'est un code Php qui a permis d'actualiser les quantités renseignées dans une table de base de données MySql. Ici, nous souhaitons débuter les travaux pour offrir une interface Web permettant d'établir la facturation d'un nouveau client.

Interface Web Php pour gérer la facturation de nouveaux clients



Et cette application doit exploiter la même base de données MySql de facturation, pour laquelle nous avions construit les relations entre les tables.

Sources et présentation de la problématique
Il s'agit d'un développement décomposé en plusieurs étapes, étant donnée la complexité de l'application finale à offrir. C'est pourquoi nous devons commencer par récupérer les sources restituant les solutions que nous avons avancées jusqu'alors. La décompression conduit au fichier de la page Web principale. Il est nommé index.php.

Sources Html et Php à télécharger pour créer interface facturation et création client en ligne

Il représente l'interface Web d'approvisionnement des stocks. Le fichier facturation.php est celui qui nous intéresse pour cette formation. Les ressources externes sont disposées dans les sous dossiers.

Ajouter projet Web facturation clients dans interface EasyPhp

Comme vous le savez, ce projet doit être référencé dans EasyPhp en désignant son adresse issue de l'explorateur Windows et en lui attribuant un nom. Les deux serveurs, Http et Database doivent être démarrés.
  • Dans l'interface d'EasyPhp, cliquer alors sur le bouton Open du module MySql Administration,
Nous ouvrons ainsi l'interface d'administration de PhpMyAdmin. Dans la liste des bases de données du volet de gauche, vous devez visualiser la base stocks. Il s'agit des données relationnelles que nous avons exploitées dans les deux formations précédentes.

Base de données relationnelles MySql pour facturation clients et gestion des stocks

Si vous ne la possédez pas, vous devez la créer en la nommant stocks et en réglant le système d'interclassement sur utf8_general_ci. Ensuite, vous devez y importer le fichier stocks.sql situé dans le sous dossier bdd du dossier de décompression. Sur cette base de données, vous devez alors créer le compte utilisateur suivant :
  • Nom d'utilisateur : gStock,
  • Nom d'hôte : Adresse locale, ici : 127.0.0.1,
  • Mot de passe : gS123k12,
Il s'agit des informations exploitées dans le fichier connexion.php. Celui-ci est imbriqué dans la construction de l'application Web. Il initialise ainsi la chaîne de connexion à la base de données. Pour cet utilisateur, vous devez octroyer les privilèges nécessaires en cochant la case Tout cocher. Une fois tous ces paramétrages réglés, nous pouvons accéder à l'interface Web pour la facturation de nouveaux clients.
  • Dans l'interface d'EasyPhp, cliquer sur le lien du projet pour accéder à sa page d'accueil,
Interface Web Php pour approvisionner et gérer les stocks en base de données MySql

Nous retrouvons l'interface Web que nous avons finalisée lors de la formation précédente. Elle permet d'approvisionner les stocks pour une référence désignée.
  • Dans le pied de la page Web, cliquer sur l'icône de facturation,
Page Web Php à développer pour créer et facturer les clients archivés en base de données MySql

Nous accédons au contenu de la page Web liée nommée facturation.php. Elle doit permettre de désigner un client à facturer à l'aide de la première liste déroulante. Pour ce client, elle doit autoriser d'ajouter tour à tour à la facture, tous les articles achetés, à l'aide de la seconde liste déroulante.

Mais elle doit aussi proposer de créer un nouveau client à la volée, n'existant donc pas encore en base de données. C'est pourquoi il existe un bouton Créer le client en haut de l'interface. Une fois créé et archivé en base de données, il pourra être facturé comme n'importe quel autre client. Et c'est tout l'enjeu de cette formation.



Remplir les listes déroulantes
Au premier chargement de la page Web de facturation, les listes déroulantes doivent être opérationnelles. La première doit proposer toutes les références des clients archivés en base de données MySql. La seconde doit offrir toutes les références des produits qu'il est possible d'acheter, eux aussi archivés en base de données, mais dans une autre table. Il n'en est rien pour l'instant. Ces listes sont vides. Nous devons nous connecter aux tables MySql respectives pour extraire les informations correspondantes, par requêtes Sql exécutées par le code Php.
  • A la racine du dossier de décompression, cliquer droit sur le fichier facturation.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur comme le Notepad ++,
Vous notez la présence du formulaire encapsulant les contrôles Html, à partir de la ligne 34.

...
<form id='formulaire' name='formulaire' method='post' action='rep_facture.php'>
<div class='titre_h1' style='height:350px;'>
<div style='width:10%; height:50px; float:left;'></div>
<div style='width:35%; height:50px; float:left; font-size:20px; font-weight:bold; text-align:left; color:#a13638;'>
<u>Informations du client</u><br />
</div>
<div style='width:10%; height:50px; float:left;'></div>
<div style='width:35%; height:50px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
<input type='button' id='creer_client' name='creer_client' value='Créer le client' />
</div>
<div style='width:10%; height:50px; float:left;'></div>

<div style='width:10%; height:75px; float:left;'></div>
<div style='width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Réf. Client :<br />
<select id='ref_client' name='ref_client'>
<option value='0'>Choisir client</option>
<?php

?>
</select>
</div>
...


Les listes déroulantes sont respectivement positionnées à partir des lignes 49 et 82. Elles se nomment ref_client et ref_produit. Chacune propose la première ligne du premier choix par défaut, inscrite par la balise option. Et pour chacune, une section de code Php est prévue juste en dessous. C'est dans ces sections que doit intervenir un code Php restituant les informations issues de la base de données. Elles doivent être restituées les unes en dessous des autres dans les listes déroulantes.
  • Dans la section Php de la première liste déroulante, ajouter le code suivant :
...
<div style='width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Réf. Client :<br />
<select id='ref_client' name='ref_client'>
<option value='0'>Choisir client</option>
<?php
$requete = 'SELECT Client_num FROM clients ORDER BY Client_num;';
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo '<option value=''.$retour['Client_num'].''>'.$retour['Client_num'].'</option>';
}

?>
</select>
</div>
...
  • Dans la section Php de la seconde liste déroulante, ajouter le code suivant :
...
<div style='width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Réf. Produit :<br />
<select id='ref_produit' name='ref_produit'>
<option value='0'>Réf. produit</option>
<?php
$requete = 'SELECT Article_code FROM articles ORDER BY Article_code;';
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo '<option value=''.$retour['Article_code'].''>'.$retour['Article_code'].'</option>';
}

?>
</select>
</div>
...


Nous restituons exactement les mêmes techniques que celles que nous avons mises en oeuvre dans le développement de l'interface pour l'approvisionnement des stocks. Tout d'abord, nous sommes en capacité d'exécuter des requêtes Sql sur la base de données du fait de l'initialisation de la chaîne de connexion, précisément dans le fichier connexion.php. Celui-ci est imbriqué dans la construction des pages Web.

Champ de la clé primaire de la table MySql des clients pour réceptionner valeurs par code Php

Pour remplir la première liste déroulante, nous sélectionnons toutes les informations du champ de la clé primaire (SELECT Client_num FROM clients). C'est lui qui identifie chaque client de façon unique. La fonction Php mysqli_query permet alors d'exécuter cette requête sur la base de données, désignée par la chaîne de connexion en premier paramètre. Nous exploitons ensuite une boucle while afin de parcourir chaque enregistrement extrait par la requête. A chaque passage, c'est la fonction Php mysqli_fetch_array qui découpe chaque ligne en tableau de variables, sur les informations de champ. Dès lors, nous pouvons restituer dans une balise option, tous les numéros de client, les uns en dessous des autres :

echo'<option value=''.$retour['Article_code'].''>'.$retour['Article_code'].'</option>';

Champ de la clé primaire de la table MySql des articles pour charger liste déroulante du formulaire par le code Php

Dans la section Php de la seconde liste déroulante, nous opérons de la même façon. Nous réceptionnons cette fois toutes les références de la table articles (SELECT Article_code FROM articles). Le champ Article_code est la clé primaire identifiant chaque produit comme unique. Nous exécutons la requête et, parcourons tous les enregistrements résultants. Nous restituons chaque code article dans la seconde liste déroulante.
  • Enregistrer les modifications (CTRL + S) et basculer sur le navigateur Web,
  • Rafraîchir la page à l'aide de la touche F5 du clavier,
  • Déployer la liste déroulante des clients,
Remplir contenu listes déroulantes sur formulaire Web Php avec données de tables MySql

Les références issues de la table clients sont proposées. Elles ne sont que deux pour l'instant. L'objectif final de cette formation est précisément de permettre la création de nouveaux clients à la volée. Ainsi, ils pourront être facturés dans l'enchaînement.
  • Déployer la liste déroulante des produits,
Tous les codes issus de la table articles sont énumérés.



Extraire les données d'une liste déroulante
Quelques travaux sont à réaliser avant de nous soucier de la création des clients. Au choix d'une référence client dans la première liste déroulante, ses données associées doivent être extraites et restituées dans les contrôles Html de la même ligne. Il s'agit de la civilité, du nom et du prénom.

De même, au choix d'un code article dans la seconde liste déroulante, les informations correspondantes doivent être affichées sur la même ligne. Il s'agit de la quantité en stock, de la désignation et du prix du produit.
  • Revenir dans le code de la page facturation.php,
Nous l'avons constaté brièvement, à soumission, le formulaire appelle un code externalisé à placer dans le fichier rep_facture.php.

...
<div style='float:left; width:80%; height:350px; text-align:center;'>
<form id='formulaire' name='formulaire' method='post' action='rep_facture.php'>
<div class='titre_h1' style='height:350px;'>
...


Celui-ci est disponible à la racine du dossier de décompression. C'est alors la fonction Javascript recolter qui doit se charger de récupérer les données de son traitement. Elle est située en entête de code, précisément à partir de la ligne 6.

...
<script language='javascript' type='text/javascript'>
function recolter()
{
document.getElementById('formulaire').request({
onComplete:function(transport){
document.getElementById('').value=transport.responseText;
}
});
}

</script>
...


Elle exploite des objets Ajax pour que le transfert s'opère sans recharger la page Web. C'est pourquoi le fichier prototype.js est déclaré en référence dans le fichier entete.php, lui-même imbriqué dans la construction de ce projet.

Un choix dans chacune de ces listes doit donc déclencher le traitement serveur. Mais ce traitement diffère selon la liste déroulante actionnée. C'est la raison pour laquelle, avant d'appeler la fonction recolter, nous devons inscrire un paramètre dans une zone de texte masquée. Cette zone de texte existe déjà. Elle est placée en ligne 127. Son identifiant est param.
  • Supprimer l'attribut disabled de ce contrôle input,
...
<div style='width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
<input type='button' id='ajouter' name='ajouter' value='Ajouter' style='margin-top:10px;' /><br />
<input type='text' id='param' name='param' style='visibility:hidden;' />
</div>
...


Ce dernier empêche l'internaute d'accéder à la zone de saisie pour la modifier. Il n'est pas intéressant ici puisque la zone est de toute façon masquée. Mais il empêche surtout le formulaire de transmettre sa valeur. Nous devons donc impérativement l'éliminer.

Selon la valeur de ce paramètre, nous saurons si nous devons extraire les informations du client ou bien les informations de l'article. Nous devons donc ajouter un gestionnaire d'évènements dans chaque liste déroulante. Il doit se charger de déclencher les actions au changement de valeur détecté.
  • Dans la liste des clients, ajouter le gestionnaire d'évènements, mentionné en gras :
...
<select id='ref_client' name='ref_client' onchange='document.getElementById('param').value = 'recup_client';recolter();'>
<option value='0'>Choisir client</option>
<?php
$requete = 'SELECT Client_num FROM clients ORDER BY Client_num;';
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo '<option value=''.$retour['Client_num'].''>'.$retour['Client_num'].'</option>';
}
?>
</select>
...
  • Dans la liste des articles, ajouter le gestionnaire d'évènements, mentionné en gras :
...
<select id='ref_produit' name='ref_produit' onchange='document.getElementById('param').value = 'recup_article';recolter();'>
<option value='0'>Réf. produit</option>
<?php
$requete = 'SELECT Article_code FROM articles ORDER BY Article_code;';
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo '<option value=''.$retour['Article_code'].''>'.$retour['Article_code'].'</option>';
}
?>
</select>
...


Nous exploitons premièrement la méthode Javascript getElementById de l'objet document. C'est elle qui permet de pointer sur un contrôle dont le nom lui est passé en paramètre. Grâce à sa propriété value, nous accédons à son contenu. Nous l'affectons d'un paramètre textuel différent selon la liste déroulante appelante. Et puis, dans les deux cas, nous appelons la fonction recolter pour réceptionner les données issues du traitement serveur.

Désormais, nous devons donc écrire le code Php réalisant le traitement approprié. Dans les deux cas, il s'agit d'extraire les informations de la base de données, en fonction d'un choix émis dans une liste déroulante.
  • A la racine du dossier de décompression, cliquer droit sur le fichier rep_facture.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec le Notepad,
<?php
$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');

mysqli_close($liaison2);
?>


Celui-ci initialise la chaîne de connexion puis la referme. C'est avant cette fermeture destinée à libérer les ressources, que nous devons intercaler nos traitements Php.
  • Avant la fermeture de la connexion, ajouter le code mentionné en gras :
...
$liaison2 = mysqli_connect('127.0.0.1', 'gStock', 'gS123k12');
mysqli_select_db($liaison2, 'stocks');

if(isset($_POST['param']))
{
switch($_POST['param'])
{
case 'recup_client':

break;

case 'recup_article':

break;
}
}


mysqli_close($liaison2);
...


Ce traitement serveur est nécessairement conditionnel. Tout d'abord, nous vérifions l'existence du paramètre transmis grâce à la fonction Php isset. Souvenez-vous, c'est l'instruction Php $_POST qui permet de restituer la valeur transmise par le contrôle d'un formulaire.

Ensuite, pour traiter toutes les possibilités, nous préférons exploiter une instruction de branchement switch. Nous l'avions démontrée au travers d'une formation destinée à découvrir le langage Php. Elle permet d'énumérer chronologiquement tous les cas à prévoir. Et nous en ajouterons au fur et à mesure du développement de cette application de facturation Web. Et dans ce contexte, une instruction switch est à la fois plus claire et plus productive qu'une instruction if.

Le premier cas correspond donc à la récupération des informations du client. Le second correspond à la récupération des informations de l'article. Dans chacune des branches, il suffit d'exécuter une requête sélection adaptée. Il s'agit exactement de la même technique que celle que nous avons mise en oeuvre pour restituer les données d'une référence, dans la formation précédente sur l'approvisionnement des stocks.
  • Dans chaque branche, ajouter le code Php mentionné en gras :
...
switch($_POST['param'])
{
case 'recup_client':
$requete = 'SELECT * FROM clients WHERE Client_num = '.$_POST['ref_client'].';';
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
$chaine = $retour['Client_civilite'].'|'.$retour['Client_nom'].'|'.$retour['Client_prenom'];
print($chaine);

break;

case 'recup_article':
$requete = 'SELECT * FROM articles WHERE Article_code = ''.$_POST['ref_produit'].'';';
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
$chaine = $retour['Article_designation'].'|'.$retour['Article_PUHT'].'|'.$retour['Article_Qte'];
print($chaine);

break;
}
...


Nous construisons la syntaxe de la requête Sql permettant d'extraire les données dans la table correspondante. Dans le premier cas, il s'agit de la table clients. Dans le second, nous pointons sur la table articles. La clause Where est nécessairement adaptée pour récolter seulement l'enregistrement correspondant au choix effectué dans la liste déroulante. Dans le premier cas, le critère est posé sur le champ Client_num. Dans le second, la condition porte sur le champ Article_code. L'égalité doit être vérifiée sur la valeur transmise par la liste déroulante correspondante. Attention néanmoins ! Pour la première requête, la valeur dynamique n'est pas encadrée de côtes. Le champ Client_num est en effet numérique. Dans la seconde, elles sont absolument nécessaires en revanche. Le champ Article_code est textuel.

Ensuite, les techniques sont classiques. Nous exécutons les requêtes grâce à la fonction Php mysqli_query. Nous découpons l'information sur les champs grâce à la fonction mysqli_fetch_array. Dès lors, c'est la variable $retour qui permet d'atteindre l'information de chaque champ par son nom. Nous les concaténons toutes dans la variable $chaine. Nous prenons soin néanmoins de les séparer du caractère remarquable de la barre verticale (|). Puis, nous renvoyons l'information concaténée à la page appelante par l'instruction print.
  • Enregistrer les modifications (CTRL + S) et revenir dans le code de la page facturation.php,
Nous devons réceptionner les données transmises par le traitement serveur, grâce à la fonction Javascript recolter. Cette réception est aussi conditionnelle. Selon le paramètre transmis, nous ne devons pas restituer les informations dans les mêmes contrôles Html.
  • Adapter le code Javascript de la fonction recolter, comme suit :
...
<script language='javascript' type='text/javascript'>
function recolter()
{
document.getElementById('formulaire').request({
onComplete:function(transport){
switch(document.getElementById('param').value)
{
case 'recup_client':
var tab_info = transport.responseText.split('|');
document.getElementById('civilite').value = tab_info[0];
document.getElementById('nom_client').value = tab_info[1];
document.getElementById('prenom_client').value = tab_info[2];
break;

case 'recup_article':
var tab_info = transport.responseText.split('|');
document.getElementById('designation').value = tab_info[0];
document.getElementById('puht').value = tab_info[1];
document.getElementById('qte').value = tab_info[2];
break;

}

}
});
}
</script>
...


Nous exploitons de nouveau une instruction switch, mais en Javascript cette fois. Nous prévoyons les autres cas qu'il s'agira de traiter. Grâce à la fonction split, nous découpons l'information transmise (transport.responseText) sur le caractère remarquable de la barre verticale. Il en résulte un tableau de variables que nous nommons tab_info. Nous n'avons plus qu'à accéder à ses rangées dans l'ordre, pour restituer l'information correspondante dans le contrôle Html dédié. Comme toujours, nous pointons sur ce dernier grâce à la méthode Javascript getElementById de l'objet document. C'est alors sa propriété value qui permet d'accéder à son contenu pour inscrire la valeur découpée.
  • Enregistrer les modifications (CTRL + S),
  • Basculer sur la fenêtre du navigateur,
  • Recharger la page Web en validant sa barre d'adresse,
  • Choisir un numéro de client dans la première liste déroulante,
  • Choisir un code article dans la seconde liste déroulante,
Comme vous le remarquez, dans l'un et l'autre cas, les informations associées, issues de la base de données MySql, sont parfaitement restituées sur le formulaire Web, dans les contrôles Html prévus à cet effet.

Récupérer informations de base de données MySql aux choix de références dans listes déroulantes sur formulaire Web Php

Certains alignements laissent à désirer. La quantité et le prix unitaire devraient être alignés à droite dans leur zone. Il s'agit en effet de valeurs numériques. Il suffit simplement de régler l'attribut CSS text-align. A vous de définir les préférences de présentation qui vous conviennent.

...
<div style='width:15%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Qté en stock :<br />
<input type='text' id='qte' name='qte' disabled style='text-align:right;'/>
</div>
<div style='width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Désignation du produit :<br />
<input type='text' id='designation' name='designation' disabled />
</div>
<div style='width:25%; height:75px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
Prix unitaire HT :<br />
<input type='text' id='puht' name='puht' disabled style='text-align:right;'/>
</div>
...




Création d'un nouveau client
Grâce aux relations que nous avions mises en oeuvre sur les tables de cette base de données MySql, il n'est fort heureusement pas possible de créer la facture d'un client n'existant pas. Soit il est proposé dans la liste déroulante, soit il doit être créé en amont. C'est la raison de la présence du bouton Créer le client en haut de l'interface.

Cette création doit se faire selon les informations saisies dans les contrôles Html Civilité, Nom du client et Prénom du client. Mais un garde-fou est nécessaire. Un client déjà archivé ne doit pas être créé une seconde fois. Pour cela, nous proposons de réaliser une première requête de vérification sur la base de données. Si un enregistrement propose le même nom et le même prénom, l'insertion doit être avortée. Nous devons donc mettre en oeuvre une double clause Where.
  • Revenir dans le code de la page facturation.php,
  • En haut du formulaire, ajouter le gestionnaire d'évènements suivant au bouton creer_client,
...
<div style='width:10%; height:50px; float:left;'></div>
<div style='width:35%; height:50px; float:left; font-size:16px; font-weight:bold; text-align:left;'>
<input type='button' id='creer_client' name='creer_client' value='Créer le client' onclick='document.getElementById('param').value = 'creer_client';recolter();'/>
</div>
<div style='width:10%; height:50px; float:left;'></div>
...


La technique est similaire à celle employée pour les listes déroulantes. Mais cette fois, l'action intervient au clic sur le bouton. Un paramètre d'identification est tout d'abord transmis dans la zone de texte dédiée, pour connaître l'action à réaliser côté serveur. Puis, la fonction recolter est appelée pour réceptionner les résultats du traitement.

Nous devons donc considérer ce nouveau cas dans le fichier rep_facture.php.
  • Basculer dans le code de la page rep_facture.php,
  • Dans le switch, ajouter la branche suivante :
...
$chaine = $retour['Article_designation'].'|'.$retour['Article_PUHT'].'|'.$retour['Article_Qte'];
print($chaine);
break;

case 'creer_client':
$requete = 'SELECT COUNT(Client_num) AS nb FROM clients WHERE Client_nom=''.$_POST['nom_client'].'' AND Client_prenom=''.$_POST['prenom_client'].'';';
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
if($retour['nb']>0)
print('Le client existe déjà. Il ne peut donc pas être créé');
else
{

}
break;

}
}
...


La fonction Sql Count permet de compter sur un champ tous les enregistrements résultants. Nous récoltons la valeur de retour dans un champ nb que nous créons à la volée grâce à la clause AS. Ce décompte dépend d'une double condition. C'est pourquoi dans la clause Where de la requête, nous recoupons la condition sur l'égalité du nom et du prénom. Nous exécutons cette requête avec la fonction Php mysqli_query. Pour accéder à l'information du champ nb, nous découpons les valeurs retournées avec la fonction mysqli_fetch_array. Si la valeur retournée est supérieure à zéro ($retour['nb']>0), nous en déduisons qu'un enregistrement correspondant existe déjà. Donc nous retournons l'indication à l'internaute.

Dans le cas contraire (else), nous devons donc procéder à l'insertion de ces informations. Il en résultera la création du nouveau client. Nous devons réceptionner l'information de retour dans la fonction Javascript recolter.
  • Revenir dans le code de la page facturation.php,
  • Dans le switch de la fonction recolter, ajouter la branche suivante :
...
document.getElementById('qte').value = tab_info[2];
break;

case 'creer_client':
alert(transport.responseText);
break;


}
...


Pour l'instant, nous nous contentons de restituer le message transmis dans une boîte de dialogue, grâce à la fonction Javascript alert.

Nous proposons de tester le fonctionnement à ce stade.
  • Enregistrer les modifications (CTRL + S) et basculer sur la fenêtre du navigateur,
  • Recharger la page Web en validant sa barre d'adresse,
  • Choisir un numéro de client à l'aide de la première liste déroulante,
  • Puis, cliquer sur le bouton Créer le client,
Message serveur Php indiquant que le client existe déjà en base de données MySql

Comme nous n'avons pas modifié ni le nom ni le prénom, la requête Sql trouve un enregistrement concordant. De fait, le message explicite apparaît sur l'écran de l'internaute.

Nous devons désormais développer le code permettant la création d'un client non recensé.
  • Revenir dans le code de la page rep_facture.php,
  • Dans la branche du if, remplacer le message par le texte nok,
  • Dans le else, ajouter le code Php suivant :
...
case 'creer_client':
$requete = 'SELECT COUNT(Client_num) AS nb FROM clients WHERE Client_nom=''.$_POST['nom_client'].'' AND Client_prenom=''.$_POST['prenom_client'].'';';
$retours = mysqli_query($liaison2, $requete);
$retour = mysqli_fetch_array($retours);
if($retour['nb']>0)
print('nok');
else
{
$requete = 'INSERT INTO clients(Client_civilite, Client_nom, Client_prenom) VALUES (''.$_POST['civilite'].'', ''.$_POST['nom_client'].'', ''.$_POST['prenom_client'].'');';
$retours = mysqli_query($liaison2, $requete);
if($retours==1)
print(mysqli_insert_id($liaison2));

}
break;
}
...


Simplement,nous engageons une requête Sql Insert Into permettant d'ajouter les informations du formulaire dans les champs respectifs de la table clients. Nous l'exécutons comme toujours grâce à la fonction mysqli_query. Si la valeur retournée vaut 1, cela signifie qu'un enregistrement a correctement été ajouté. Dans ce cas, nous retournons la valeur du dernier ID créé, grâce à la précieuse fonction Php mysqli_insert_id. Elle prélève la dernière valeur auto-incrémentée du champ de la clé primaire. Cette astuce permet d'éviter de réaliser une nouvelle requête à la recherche de cette information.
  • Enregistrer les modifications et revenir dans le code de la page facturation.php,
Lorsque la création du nouveau client a lieu, nous devons exploiter l'ID retourné pour l'ajouter dans la liste déroulante des clients. Et nous devons placer le focus sur cette dernière valeur, pour automatiser les actions. Ainsi, dans l'enchaînement, l'administrateur pourra procéder à la facturation du nouveau client.
  • Dans la fonction recolter, adapter la dernière branche du switch, comme suit :
...
case 'creer_client':
var rep = transport.responseText;
if(rep=='nok')
alert('Le client existe déjà');

else
{
var liste = document.getElementById('ref_client');
var option = document.createElement('option');
option.value = rep;
option.text = rep;
liste.add(option);
liste.selectedIndex = liste.length-1;

}
break;
...


Nous déclarons un objet liste, représentant la liste déroulante des clients. La méthode createElement de l'objet document permet d'ajouter une ligne, grâce à l'attribut option passé en paramètre. Nous définissons la valeur et le texte de cette nouvelle balise, pour le contrôle select. Puis, nous exploitons la méthode add de l'objet liste pour la créer. Enfin, grâce à la propriété selectedIndex d'un objet liste déroulante, nous sélectionnons sa dernière valeur. Cette position est renvoyée par sa propriété length qui indique le nombre d'éléments qu'elle contient. Comme le premier élément est reconnu sur la rangée zéro, nous retranchons une unité à cette valeur.
  • Enregistrer les modifications et basculer sur la fenêtre du navigateur,
  • Recharger la page Web en validant sa barre d'adresse,
  • Dans le contrôle Civilité, saisir : Madame, par exemple,
  • Dans le contrôle du Nom, taper : Rouana,
  • Dans le contrôle du prénom, taper : Marie,
  • Puis, cliquer sur le bouton Créer le client,
Créer un nouveau client à facturer en base MySql au clic sur un bouton dans interface Web Php

Comme vous le constatez, aucun message n'apparaît. En revanche, un nouvel identifiant surgit, mis en valeur instantanément par la liste déroulante qui le sélectionne.

Nouvel identifiant du nouveau client créé en Php auto incrémenté dans table MySql par insertion données

Si vous affichez le contenu actualisé de la table clients dans PhpMyAdmin, vous constatez en effet la présence du nouveau client identifié. Voilà donc pour ce volet. Dans le prochain, nous réaliserons la facturation du client.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn