PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#51 02-10-2014 10:24:26

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

bonjour Jc,
excuses moi pour cette faute, je ne savais pas que cela était important, maintenant que je le sais je ne l'oublierai pas,
Je vais appliquer la correction, te tiens au courant de mes "avançées".

Merci beaucoup
pierrot

Hors ligne

#52 02-10-2014 15:52:35

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour Jc,

je crois que sans <form..submit> il ne doit pas être possible de passer de cfg-element-35-7 à $nomtobd puisque je n'ai pas de submit dans un <form> ?
La connexion enregistre donc obligatoirement une donnée, mais toujours "value vide"
Je crois de plus en plus que je ne vais pas pouvoir éviter AJAX, que je connais très très peu.
Ça fait quasiment 3 semaines que je butte sur cette difficulté, je dois maintenant la contourner.
Avec tout les codes que j'ai essayés, cela aurai du fonctionner, mais ce n'est pas, je pense, un problème de code php, php n'y peut rien sans <form>

qu'en penses tu ?
pierrot

Hors ligne

#53 02-10-2014 22:08:13

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonsoir

Il n'y a que deux possibilités en effet
Soit :

1) on passe par un <form action="" method="post">  .... <input type="submit"></form>
2) on n'utilise pas la balise <form></form> et on passe par Js avec Ajax.

Donc faut se décider wink

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#54 03-10-2014 12:23:28

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour Jc,

OK, je passe par Js / Ajax, j'ai commencé à regarder comment ça fonctionne hier.
Je crois qu'il doit être possible d'utiliser un Js du formulaire déjà existant ( Jquery).
Il contient:
jQuery('#cfg-contactform-35 .cfg-submit').click(function()

C'est normal que je n'ai pas de onclick nulle part ? regardes mon html du bouton submit ci-dessous :

<div class="cfg-element-container">
  <div class="cfg-element-set" id="cfg-element-35-32-set" >
    <div class="cfg-element-content">
    <input type="submit" class="cfg-submit " name="cfg-element-35-32" id="cfg-element-35-32" value="Envoi du message"   />
    </div>
  </div>
</div>

D’après ce que je crois comprendre, le traitement du formulaire ce fait en donc en JS avec contactform-35

En tout cas, le Php précédent n'est pas perdu..
Je me demandais si il ne faudrait pas créer 2 fichiers, l'un pour se connecter et l'autre pour insérer, et pourquoi pas aussi extraire, de telle sorte que je puisse les rappeler quand je le voudrai.
Bref, je redémarre.. une prise de tête hmm
Comme tu l'as écris , c'est le métier qui rentre ... oui, mais je t'assure qu'il rentre pas vite..
Une nouvelle fois merci,
pierrot

Hors ligne

#55 03-10-2014 15:15:42

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

Un jour vous nous dites

je crois que sans <form..submit> il ne doit pas être possible de passer de cfg-element-35-7 à $nomtobd puisque je n'ai pas de submit dans un <form> ?

puis le lendemain vous nous montrez :

<input type="submit" class="cfg-submit " name="cfg-element-35-32" id="cfg-element-35-32" value="Envoi du message"   />

ce qui constitue le submit de votre formulaire. Donc votre formulaire passe par une soumission html. Vous devez donc avoir un <form>...</form> quelque par dans votre code.. cherchez mieux.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#56 03-10-2014 16:00:18

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Pour confirmation, tu trouveras ci-dessous le code html le  code html de ma page formulaire
la Div nom prenom
<!-- NOM PRENOM -->

<div class="cfg-element-container">
  <label class="cfg-label" id="cfg-element-35-7-label" ><span class="cfg-label-value">Nom Prénom</span><span class="cfg-required">*</span></label>
      <div class="cfg-element-set" id="cfg-element-35-7-set" >
    <div class="cfg-element-content">
    <input type="text" class="cfg-type-text cfg-form-value " name="cfg-element-35-7" id="cfg-element-35-7"  />
    </div>
  </div>
  <div class="cfg-clear"></div>
</div>

Puis la Div submit de la même page html ou se trouve name="cfg-element-35-7" qui pose probleme

<div class="cfg-element-container">
  <div class="cfg-element-set" id="cfg-element-35-32-set" >
    <div class="cfg-element-content">
    [b]<input type="submit" class="cfg-submit " name="cfg-element-35-32" id="cfg-element-35-32" value="Envoi du message"   />[/b]
    </div>
  </div>
</div>
<div class="cfg-loading">&nbsp;</div>

Je n'ai rien d'autre, ce n'est pas manque d'avoir "fouillé" les fichiers du formulaire,j'ai aussi pensé que je me trompais en ne les trouvant pas, mais je dois me rendre à  l'évidence, il n'y a pas de <form>, ni de onclick, ni rien qui y ressemble.

La difficulté  vient de la transmission des données entre formulaire HTML et code php... alors cherché et trouvé un fichier JS contactform.js qui génère le submit et l'envoie en POST vers le fichier PHP : form-validation.php (jQuery.post('cfg-contactform-35/inc/form-validation.php'
Ce script devrait permettre de gérer l'enregistrement des données de mon html et ensuite passer au traitement bd dans  form-validation.php, , je me trompe ?

Fichier contactform.JS

jQuery(function(){
  /*
  if(!jQuery.isFunction(jQuery.fn.on)){
    var jquery_version_error_message = 'The contact form requires jQuery 1.7.2 to work properly.<br />jQuery '+jQuery().jquery+' is loaded.';
    jQuery('.cfg-contactform').prepend('<p style="color:#FF0000">'+jquery_version_error_message+'</p>');
  }
  */
  jQuery('#cfg-contactform-35 .cfg-uploadfilename').val(''); // FF may keep the file name in the cfg-uploadfilename input after submitting and refreshing the page
  jQuery('#cfg-contactform-35 .cfg-captcha-refresh').click(function(){
  $('#cfg-contactform-35 .cfg-captcha-img').attr('src','cfg-contactform-35/inc/captcha.php?r=' + Math.random());
  });
  [b]jQuery('#cfg-contactform-35 .cfg-submit').click(function()[/b]
  {

    var formcontainer = jQuery(this).closest('.cfg-contactform');
    var loading = formcontainer.find('.cfg-loading');
    var formcontainer = jQuery(this).closest('.cfg-contactform');
    var loading = formcontainer.find('.cfg-loading');
   
    loading.show();
   
    var submit_btn =  jQuery(this);
    submit_btn.hide();
   
    formcontainer.find('.cfg-errormessage').hide().remove();
   
    var form_value_array = Array();
    var radio_value = Array();
    var checkbox_value = Array();
    var selectmultiple_value = Array();
    var deleteuploadedfile_value = Array();
   
    formcontainer.find('.cfg-form-value').each(function()
    {
      var elementlabel = jQuery(this).closest('.cfg-element-container').find('.cfg-label-value');
      var elementlabel_id = elementlabel.closest('label').attr('id');
      var elementlabel_value = elementlabel.html();

      // catch uploads
      if(jQuery(this).hasClass('cfg-uploadfilename'))
      {........}
     
      // catch input text values, textarea values, select values
      if(jQuery(this).is('.cfg-type-text, .cfg-type-textarea, .cfg-type-select'))
      {.......}
      // catch radiobutton values
      if(jQuery(this).is(':radio'))
      {....}
      // catch checkbox values
      if(jQuery(this).is(':checkbox'))
      {..}
      // catch multiple select values
      if(jQuery(this).hasClass('cfg-type-selectmultiple'))
      {....}
      // catch time values
      if(jQuery(this).hasClass('cfg-type-time'))
      {.....}
    });  
   
    // catch list of uploaded files to delete
    formcontainer.find('.cfg-deleteuploadedfile').each(function()
    {..}); 
    var captcha_img;
    var captcha_input; 
    if(formcontainer.find('.cfg-captcha-img').length)
    {...}
   
    // console.log(deleteuploadedfile_value);
    // console.log(form_value_array);
   
    [b]jQuery.post('cfg-contactform-35/inc/form-validation.php',[/b]
        {.... },
        function(data)
        {....} /* end function data */
      ); /* end jQuery.post */
  }); /* end click submit */
 
  // DELETE UPLOADED FILE
  jQuery('body').on('click', '#cfg-contactform-35 .cfg-deleteupload', function()
  {....}); 
});

Cela engage  AJAX pour communiquer avec ma bd et php pour traiter, tu l'avais d'ailleurs évoqué.
Je crois, j’espère.. cette fois "tenir le bon bout".

je ne saurai assez te remercier, ça doit devenir répétitif pour toi, pourtant je ne peux faire que ça, il est rare d'être ainsi accompagner dans la durée.
Il faut juste que tu me dises si je dois te tutoyer ?, je suis un tantinet "vieille France, et suis gêné de te tutoyer alors quoi tu ne le fais pas.
Pierrot

Dernière modification par pierrot35 (03-10-2014 16:04:32)

Hors ligne

#57 03-10-2014 16:22:06

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

New - En fait, il apparaîtrait que le formulaire soit conçu pour automatiquement récupérer tous les éléments html dont les class sont listées dans le script....
Donc il suffirait de traiter l'insertion en db dans form-validation.php
Si c'est ça, ça sent l'écurie..:)
pierrot

Hors ligne

#58 04-10-2014 02:06:21

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

Wow, je ne sais pas si c'est vous qui avez fait ce code, mais c'est une technique que je déconseille vivement. Elle consiste à garder le bouton submit html d'un formulaire sans définir le formulaire au niveau html, et reconstituer le formulaire au niveau Js pour l'envoyer comme si cela avait été fait via html. Le problème ici, c'est que la longueur du code nécessaire pour envoyer les paramètres via ajax du formulaire est multiplié par 5 au bas mot, peu performant (au lieu de passer par des ID d'éléments on passe par des classes, des "closest", etc... qui sont aussi des moyens peu performants pour lire le DOM), et des problèmes de portabilité se posent car chaque navigateur a ses propres spécificités à ce niveau.
A cette complexité vient se rajouter le fait que votre formulaire contient un upload de fichier et une gestion de captcha, qui font que je vous déconseille vivement d'utiliser cette technique.
La première chose que je vous conseille de faire est de supprimer le bouton de soumission <input type="submit" /> de formulaire classique pour ne pas créer de conflit html/js au niveau gestion soumission. Ensuite, il est plus performant de gérer la soumission de fichier et la gestion de captcha et la soumission de formulaire d'une manière indépendante en ajax. Pour le bouton de soumission mettez un bouton comme ceci


<button id="btn_submit" onclick="submit_form()">Envoyer</button>
 

Ensuite pour gérer l'appel ajax passez par une structure comme celle-ci:


function submit_form(){
  var mon_nom=$('#nom').val();
  $.ajax({
     url:'https://mondomaine.fr/validation_form.php',
     data:{ nom:mon_nom, ...., sid:Math.random()},
     type:"post",
     complete: function(xhr,result){
        // code gestion de retour appel ajax.

     }
  });
}
 

Voilà Bon week-end wink

EDIT :

Cela engage  AJAX pour communiquer avec ma bd et php pour traiter

Attention on est pas dans une architecture MVVM mais MVC, donc notre appel AJAX ne communique pas avec la BD directement mais avec un contrôleur Ajax en PHP (ici validation_form.php).

Dernière modification par Jc (04-10-2014 02:09:37)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#59 04-10-2014 13:43:01

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

bonjour JC,

Vous savez, je ne serai jamais un pro..
Il est vrai que je n'ai pas fait se code, j'avais fait mon propre formulaire "classiquement" avec <form.. input..> etc.., mais je n'en était pas satisfait notamment au niveau du captcha et au niveau de l'envoi mail vers la personne qui remplissait le formulaire, et du retour de contact vers ma propre boite mail.
Mon formulaire ne faisait pas très pro, c'est pour cela que je suis reparti d'une autre base et l'ai modifié pour obtenir ce que je voulais.

Cette réorientation
Tout cela me perd un peu, je ne comprend pas tout mais je vais travailler sur ce que vous me dites et tenter de tout "reconceptualiser":
Je  pensais avoir compris.., AJAX fait bien le pont entre le php ( form-validation.ph) et la bd, qui lui gère l'insertion des données en bd, mais ou est passée la connexion bd, également dans le php ( form-validation.ph) ou dans un php sur la page html ?
Et c'est bien le submit HTML qui appelle AJAX .. en fait c'est une boucle..
Je vais chercher des topologies de tout ça sur internet.

En entrant le code function submit_form(){.} que vous m'indiquez,  je vais devoir supprimer les anciens codes ,  le(s)quel(s) ? , je risque de faire des bêtises...


Mon bilan
Cela fait maintenant presque 3 semaines que je tente d'intégrer de nouvelles dimensions, je suis totalement autodidacte et essaye apprendre "sur le tas"..
Souvenez vous d’où nous sommes partis, un simple code de protection "syndicale", et comme je vous le disais, plus j'avance et plus je m'aperçois de mon ignorance grandissante..

Si je n'y arrive pas ce weekend, je vais devoir rester sur la méthode d'insertion en db dans form-validation.php.
Je sais que ce n'est pas conforme à ce que vous préconisez, par ailleurs avec raison me semble t'il, mais je dois rester dans ma réalité de débutant très moyen et pense être, en l'état, bien incapable de maîtriser ce que vous indiquez, ce que je regrette réellement, j'aurai bien souhaité avoir du top, mais c'est comme ça, à chacun ses capacités.. ça semble si simple pour vous..

Même avec cette méthode d'insertion du traitement de toutes données en bd via form-validation.php , je vais devoir adapter le code que j'ai réalisé avec votre précieux concours, mais il ne s'agit plus d'une seule donnée, mais d'un pack complet..
Faut il encore renommer chaque variable, faut il faire tout en même temps, etc.. mais cela restera vraisemblablement maintenant que du codage et de l'articulation méthodologique.

Je dois ensuite retourner rapidement sur l'appli pour me "battre" avec postgresql ( le calcul et la mise à jour de données en temps réel sur l'Ihm).
Si vous pouvez m'accompagner pour le dernier coup de pouce..
Merci encore et bilan ce WE
Cordialement
Pierrot

Hors ligne

#60 04-10-2014 19:28:48

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonsoir

Je  pensais avoir compris.., AJAX fait bien le pont entre le php ( form-validation.ph) et la bd, qui lui gère l'insertion des données en bd, mais ou est passée la connexion bd, également dans le php ( form-validation.ph) ou dans un php sur la page html ?
Et c'est bien le submit HTML qui appelle AJAX .. en fait c'est une boucle..

Ajax c'est quoi? C'est un composant du navigateur (XMLHttpRequest appelé XHR en JQuery ou en raccourci) qui permet d'effectuer une requête serveur via le protocole http ou https en mode asynchrone. Cela permet donc de mettre à jour une page sans devoir la recharger.
Un formulaire HTML, lorsqu'il est soumi au serveur en html, l'est via une requête synchrone http ou https et route sur une nouvelle page (qui peut être la même) et va générer un rechargement de la page. Ce n'est donc pas la même chose.

Donc quand on a un formulaire avec captcha ou upload fichier, on ne peut pas le faire en mode synchrone, car l'upload va recharger la page et si le client avait déjà rempli les informations demandées dans le formulaire, il va devoir le refaire et cela peut le dissuader, trouvant cela trop fastidieux. On peut donc faire l'upload de fichier en Ajax et le captcha en ajax, et la soumission du formulaire en mode synchrone ou en ajax également.

En ce qui concerne l'appel à la base de données elle doit se faire via PHP. L'idéal est de faire une classe php de gestion de connexion à la BD et de la mettre en include partout là où vous en avez besoin (contrôleur métier ou contrôleur Ajax principalement).

Bon dimanche wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#61 05-10-2014 11:45:21

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Saluton,

Il faut reconnaître que, pour le débutant, Ajax introduit une couche de complexification de représentation de l'architecture qui a de quoi le dérouter.
Je connais même des professionnels qui se retranchent derrière de "pseudo" problématiques de performances pour privilégier JAVA à PHP et des applets à Ajax, voire javascript, alors, qu'en fait, ils sont juste atteints du "baby duck syndrom"


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#62 05-10-2014 18:16:02

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

Merci Mk pour ce retour. Beaucoup de programmeurs Java sont de culture application compilées desktop ou client serveur LAN toujours en mode compilé. Il est vrai que ce type d'architectures quand elles sont portées dans un contexte web, le web devient un facteur limitant en termes de performances applicatives pour ces solutions, car leur architecture n'est pas adaptée pour le web.
Après grâce aux websockets cet effet va se réduire avec le temps, et va reporter la charge au niveau gestion des connexions sur les serveurs et va rajouter une couche donc sur des solutions déjà basées sur des api ou webservices SOAP en termes de consommation de ressources.
Cependant pour utiliser websockets, ils devront bien apprendre à faire un appel ajax, car c'est de cette façon qu'une telle connexion doit être initiée.

Bonne fin de week-end.

Dernière modification par Jc (05-10-2014 18:32:17)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#63 06-10-2014 07:25:31

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

@Pierrot35
Voici comment vous pourriez structurer votre contrôleur ajax en POO côté PHP


require_once('bdconnect.php');

Class AjaxManager{
  // classe statique. Attention: Seule la méthode LaunchRequest doit être publique.

}
print AjaxManager::LaunchRequest($_POST);
 

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#64 06-10-2014 19:19:07

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour Jc,

j'ai pas réussi.. et vais "m'acharner" encore qq jours avant de revenir sur "ma terre".

Il me manque toujours un bout du mécano pour que je comprenne et pour avoir une vision globale.
Je m'aperçois que, comme je viens de le lire sur votre précédent post et celui de Infantimigulo, les informations qui circulent sur le net concernant cette thématique sont souvent incohérentes les unes avec les autres, parfois même contradictoires, et , pour un non initié comme moi, cela biaise du raisonnement, à en être découragé ou même se sentir un limité.. si ce n'est pas id..

Donc je repose le tout, et me relance, je deviens convaincu que c'est un concept qui, à terme,va devenir nécessaire presque à tous.

Si vous le voulez bien, nous redémarrons.. doucement.

Voila le code que vous m'avez indiqué, j'ai tenté de le compléter mais sans résultat, je ne l'ai pas tout compris.
Vous trouverez après celui-ci, un autre code que j'ai travaillé pour tendre vers un raisonnement à mon niveau, avant de le recomplexifier par le votre, néanmoins je crois que je commence à me représenter un peu mieux le concept, c'est pas encore très clair, mais ... mais le voile se lève..

  [b]// JC[/b]
    function submit_form()
    {
        var donneesbd=$('#donnesbd').val(); // quelles variables ? ou une variable tierce  comme relais ?
        $.ajax(
            {
             url:'https://.........eu.fr/IhmWeb........php/cfg-contactform-35/inc/form-validation.php',
            data:{ nom:mon_nom, ...., sid:Math.random()}, // idem quelle data pourquoi faire ?
            type:"post",
             complete: function(xhr,result)
                {
       xhr.onreadystatechange  = function()
                    {
                    // etat  terminé
                    if(xhr.readyState  == 4)
                            {
                            //200 page trouvée ==> ok  
                            if(xhr.status  == 200)
                            //  données serveur récupérées dans  XMLHttpRequest:  ?    
                            // ==> connexion bd
                             :}
                             else
                             {
                             document.ajax.dyn="Error code " + xhr.status;
                            ;}
                    }        
                }
        }
        };

Ma base de reflexion / RECONFIG

function submitForm()
{ // instanciation xhr
    var xhr;
    if(window.XMLHttpRequest || window.ActiveXObject)
    {
  if(window.XMLHttpRequest)
      {
    xhr = new XMLHttpRequest();
      }
      else
      { // Internet Explorer <7
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e)
        {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
      }
    }
    else
    {
  alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
  return;
    }
// 1/ définition de l'action de la requette, disponibilité des données, état et  étant donné par l'attribut readyState de XMLHttpRequest------------
    //propriété activée évènement changement d'état ==> assignation fonction
// 2/ affectation action à effectuer sous forme d'une fonction, quand le serveur aura répondu........................................................
    xhr.onreadystatechange  = function() // Requete récupération données formulaire
    {
    // si etat  terminé
       if(xhr.readyState  == 4)
       {
    //si action prête = 200 page trouvée ==> ok  
        if(xhr.status  == 200)
        {
 // 3/ envoi de la Requete récupération données formulaire sur form-validation.php....................................................................
        // ==> ? GET / POST ??  url ==> topologie données les données, un fichier + chemin répertoire == > login / Mdp?
        xhr.open("GET", "form-validation.php", true);
        xhr.send(null);      
        ;}
        else
        {}
       }
// 4/ connexion et enregistrement bd-----------------------------------------------------------------------------------------------------------
}
</script>
</div>
 </FORM>

Et puis le changement du submit que j'ai remis dans<Div> .. <form>

<div>
<FORM method="POST" name="ajax" action="">
    <div class="cfg-element-content">
    <!--<input type="submit" class="cfg-submit " name="cfg-element-35-32" id="cfg-element-35-32" value="Envoi du message"   />-->
    <!-- modi ajout Jc -->
    <button id="btn_submit" onclick="submit_form()">Envoyer</button>
<script>
</div>
</FORM>

J'espère que ça ne va pas me griller l'envoi mail  du formulaire.

pierrot

Hors ligne

#65 06-10-2014 22:31:30

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonsoir,

Oui on va reprendre les choses, vous semblez être perdu en effet.

1) Quand vous voulez soumettre un formulaire en ajax, le mieux pour simplifier le code, éviter les conflits, c'est de tout faire en ajax. Donc n'utilisez plus la balise <form></form> html.

2) Prenons le cas d'un formulaire (sans balise form) avec nom, prénom et email à transmettre au serveur


// code HTML
<input id="form_nom" class="form_nom" placeholder="Patrônyme" maxlength="25" />
<input id="form_prenom" class="form_prenom" placeholder="Prénoms" maxlength="50" />
<input id="form_email" class="form_email" placeholder="adresse courriel" maxlength="50" />
<button id="btn_submit" onclick="submit_form()">Envoyer</button>
 

3) Maintenant la fonction javascript de traitement


function submit_form(){
  // on récupère les informations saisies dans le formulaire
  var lastname=$('#form_nom').val();
  var firstnames=$('#form_prenom').val();
  var email=$('#form_email').val();
  // on peut par exemple avant d'envoyer au serveur vérifier la validité des informations saisies (format)
  if (verification_saisie(lastname,firstnames,email)===false){return false;}
  // tout est ok on envoie les informations au serveur en ajax
  $.ajax({
       // url de la page de traitement ajax php
       url:'https://mondomaine.fr/validation_form.php',
       // données à transmettre
       data :{ fn:'validate_form', NOM:lastname, PRENOMS:firstnames, EMAIL:email, sid:Math.random()},
       type: 'post',
       complete: function(xhr,result){
           // code de traitement de la réponse du serveur.
           // Dans un premier temps il ne s'agit pas de traiter les erreurs de requête comme vous l'avez fait il y a l'event error pour le faire,
           // Mais on va traiter les erreurs applicatives s'il y en a (erreurs gérées) et la réponse du serveur (nouvelles données ou tout simplement le message qui dit que tout est ok.
          // On va considérer que le retour serveur se fait au format JSON.
           var RETOUR_SERVEUR=jQuery.parseJSON(xhr.responseText);
           if (RETOUR_SERVEUR.message==='ok'){ alert('votre formulaire a bien été validé en base de données.'); } else { alert('Une erreur est survenue lors du traitement de la soumission de votre formulaire avec l'erreur suivante: [' + RETOUR_SERVEUR.message +']');}
       }
  });
}
function verification_saisie(lastname,firstnames,email){
   var error_notfound=false;  
   // code de vérification de saisie.
   // retourne false si erreur trouvée, sinon retourne true.
  return error_notfound;
}
 

4) Voyons maintenant le code de validation_form.php


  function check_entries($nom,$prénoms,$email){
     // code vérification retourne true si tout est ok sinon retourne false

  }

  function validation_database($nom,$prenoms,$email){
     require_once('connect_db.php');
     // code de validation en base de données (MySQL,postgreSQL, etc...)
     // si erreur alors on fait un print de l'erreur ex:
     if ($erreur_trouvee){ print json_encode(array('message'=>' Une erreur est survenue dans la validation en base de données (-4)'));return false;}
     // si tout ok
    return true;
  }


   if (!isset($_POST['fn']) || empty($_POST['fn'])){ print json_encode(array('message'=>' Erreur dans les paramètres soumis au serveur (-1)'));exit;}
   $fn=$_POST['fn'];
   switch ($fn){
      default: print json_encode(array('message'=>'Fonction Ajax inconnue / non gérée.'));exit;
      break; case 'validate_form':
         if (!isset($_POST['NOM']) || !isset($_POST['PRENOMS']) || !isset($_POST['EMAIL'])) {
             print json_encode(array('message'=>' Erreur dans les paramètres soumis au serveur (-2)'));exit;  
         }
         $nom=$_POST['NOM']; $prenoms=$_POST['PRENOMS']; $email=$_POST['EMAIL'];
         // on peut vérifier (recommandé) que le format des données transmises est acceptable (on ne fait pas confiance au client).
         if (check_entries($nom,$prenoms,$email)===false){ print json_encode(array('message'=>' Erreur dans le format des paramètres soumis au serveur (-3)'));exit;}
         if (validation_database($nom,$prenoms,$email)===false){exit;}
         // on arrive ici donc tout c'est bien passé
         print json_encode(array('message'=>'ok'));
   }
 

Voilà tout le processus a été expliqué. En espérant que cela vous aide à y voir plus clair.

++

Dernière modification par Jc (07-10-2014 03:10:40)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#66 06-10-2014 22:32:59

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

@MK: j'ai fait d'une pierre deux coups, vous pouvez intégrer ce que je viens de faire dans un tuto du site wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#67 07-10-2014 06:59:41

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Vous trouverez après celui-ci, un autre code que j'ai travaillé pour tendre vers un raisonnement à mon niveau, avant de le recomplexifier par le votre, néanmoins je crois que je commence à me représenter un peu mieux le concept, c'est pas encore très clair, mais ... mais le voile se lève..

Si je peux me permettre, j'ai justement simplifié au maximum et écrit le stricte nécessaire pour que tout fonctionne nickel. Donc si vous devez retenir quelque chose, croyez-moi retenez ce que j'ai fait pour comprendre : pas de fioritures ni de code inutile.

var xhr;
    if(window.XMLHttpRequest || window.ActiveXObject)
    {
    if(window.XMLHttpRequest)
        {
        xhr = new XMLHttpRequest();
        }
        else
        { // Internet Explorer <7
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e)
            {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    }

Ici vous avez essayé de construire une instanciation du composant XmlHttpRequest pour qu'elle soit compatible crossbrowser. La compréhension d'une gestion Ajax de A à Z en Javascript nécessite une bonne connaissance du Javascript. Tout ceci est inutile dans le code que je vous ai présenté car ce code est intégré dans le Framework JQuery et vous n'avez pas besoin de vous occuper de cette tâche. Néanmoins vu que cela complique votre compréhension, je vous invite par commencer à comprendre le fonctionnement via mon code, et ensuite si vous voulez savoir comment cela fonctionne "sous le capot" en javascript pur, pas de soucis, on peut voir cela ensemble si vous souhaitez.

Et c'est bien le submit HTML qui appelle AJAX

Ceci est faux. Un formulaire HTML <form></form> avec un bouton submit ne passe pas par Ajax pour envoyer le formulaire au serveur.

Je dois ensuite retourner rapidement sur l'appli pour me "battre" avec postgresql ( le calcul et la mise à jour de données en temps réel sur l'Ihm).

Pouvez-vous préciser ce qui nécessite de la mise à jour temps réél? ceci n'est pas anodin et doit être justifié.

Bonne journée.

Dernière modification par Jc (07-10-2014 08:11:47)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#68 07-10-2014 09:47:21

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

merci Jc pour ce retour smile,

Je vais me concentrer sur vos conseils, ligne à ligne, et abandonner internet pour "faire de la soudure", je m'aperçois que cela porte la confusion dans la compréhension de vos explications, pour en final obérer la faculté de raisonner globalement.

Ce que vous notez concernant un tuto, j'y avais pensé, mais je crois que c'est encore prématuré.
Ce n'est pas moi qui serait capable de faire un tel tuto, il s'agit de votre tuto, donc du ressort de vos qualités et de votre expertise.
Si vous le voulez bien, dés que j'aurai fini ce thème, je formaliserai ce tuto avec des termes de débutant, et vous corrigerez en terme de technicité, pour obtenir un document accessible à tous et expert dans son objet.
Des tutos, il y en a à profusion, d'une part ils concernent très souvent la capture de données dans la bd avec des <form> ( ici c'est l'inverse), et d'autre part sont souvent remplis de "barbarismes" difficile à digérer., notamment dés que l'on touche Ajax.
Il est facile de compliquer des choses simples ( ça je sais faire..), mais rendre simple des choses compliquées c'est autrement plus pareil.
smile
Si je comprends, je pense que les autres débutants comprendront aussi.

Je reviens vers vous dés que j'aurai assimilé ce que vous m'indiquez.

J'ai maintenant du pain sur la planche,
Pierrot

Hors ligne

#69 07-10-2014 11:11:54

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Excuse pour le tuto, je n'avais vu que c'était destiné à Infantimigulo, que je salue, étant telgrucien.

Hors ligne

#70 07-10-2014 17:50:00

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

(re)
J'entre bien mes données dans ma table avec mon php ?

J'ai un fichier connectbd dans le même répertoire :

<?php
session_start();
        $db=mysql_connect("...........eu.mysql", "........_eu", "*********");
        mysql_select_db("..........._eu.mysql", $db);
 ?>

Est ce qu'il faut que je mette le code d'enregistrement des données dans la bd aussi dans ce fichier, comme ci-dessous ?

<?php
session_start();
        $db=mysql_connect("...........eu.mysql", "........_eu", "*********");
        mysql_select_db("opuscloud_eu.mysql", $db);
[b] $sql="INSERT INTO confid (nomprenom) VALUES ('$nomtobase')";[/b]
[b] $sql="INSERT INTO confid (email) VALUES ('$email')";[/b]
[b] $sql="INSERT INTO confid (telephone) VALUES ('$telephone')";[/b]
[b] $sql="INSERT INTO confid (typecontact) VALUES ('$typecontact')";[/b]
 ?>

Puisque dans le php, j'appelle le fichier ci-dessus ( require_once('connect_db.php')
> celui-ci établit gère déjà les codes de validation en base de données
> donc je ne fais juste qu'appeler connectdb.php qui s'occupe de tout le traitement bd ( connexion,validation et enregistrements) ?

Sinon ou est le choix de la table de la bd ?
J'approche..


Concernant "la mise à jour en temps réel", je me suis probablement mal expliqué :
Mais cela est un autre problème, je travaille en java/struts/glassfish avec Netbeans : dans l'appli, j'ouvre un popup, puis l'utilisateur entre ces données qui sont enregistrées dans postgresql lorsque le popup est validé, ensuite des triggers traitent ces données et mettent la bd à jour, mais les données traitées (opérations arithmétiques simples) ne se mettent pas à jour dans le popup au fur et à mesure qu'elles sont saisies, les résultats sont stockés, mais ne réapparaissent instantanément.

Si vous le voulez bien je vous en ferai part ultérieurement, je ne veux pas vous "squatter", ce que vous faites en ce moment est déjà énorme, et j’espère infiniment que cela servira à d'autres que moi seul.
Une chose après l'autre, et à chaque jour sa galère..

pierrot

Hors ligne

#71 07-10-2014 19:03:53

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonsoir,

Une chose après l'autre, et à chaque jour sa galère..

A ce propos, avez-vous compris avec Ajax? vous en êtes où? Parce qu'à ce propos, le but c'est que vous ayez compris.

J'entre bien mes données dans ma table avec mon php ?

Je confirme wink

require_once('connect_db.php')

oui normalement cet appel se charge de se connecter directement à la BD, vous n'avez plus qu'à requêter ensuite.
Je vous conseille d'utiliser PDO, autant s'y mettre de suite, c'est la meilleure couche d'abstraction d'accès aux données de PHP (elle est standard).

$sql="INSERT INTO confid (nomprenom) VALUES ('$nomtobase')";
$sql="INSERT INTO confid (email) VALUES ('$email')";
$sql="INSERT INTO confid (telephone) VALUES ('$telephone')";
$sql="INSERT INTO confid (typecontact) VALUES ('$typecontact')";

à remplacer par


 // Rappel dans connect_db.php
 try {
    $PDOInstance = new PDO($DSN_string, $USER_string, $PWD_string);
    $PDOInstance->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {print 'PDO_err : '.$e->getMessage();}
// dans votre code maintenant (en dehors de connect_db.php)
$result=$PDOInstance->query("INSERT INTO confid (nomprenom,email,telephone,typecontact) VALUES ('$nomtobase','$email','$telephone','$typecontact')";
 

Voilà ++

Dernière modification par Jc (07-10-2014 19:18:07)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#72 08-10-2014 10:52:22

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour JC,

OUI, je pense avoir le schéma en tête, il y a certains points que je n'ai pas totalement intégrés mais l'essentiel est le raisonnement.
Mais j'ai un doute sur le JS du submit "envoyer", si je ne trompe pas il doit bien être en JQUERY comme ceci :
jQuery(function(){
function submit_form(){...}

et non en format classique : <script type="text/javascript">...</script>

Isoler mon ph
Si j'isole mon fichier php sous un autre nom, donc sans l'intégrer dans le fichier existant form-validation.php de l'ancien formulaire, ce serait peut être mieux ?


Maintenant je vais pouvoir refaire mon formulaire avec cette méthode, (modules :  envoi/réception mail, textarea, checkbox, etc..) puisque l'ancien est de fait devenu invalide.

Question Div
Donc, je vais devoir, pour chaque div (sans <form>), entrer un input (div/email, textarea, etc..), puis laisser le script submit engager la chaîne de traitement de l'ensemble des input, cela est bien valide ?

Je voudrais récupérer et enregistrer l'Ip du contact :
    <?php
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    else
    $ip=$_SERVER['REMOTE_ADDR'];
    echo $ip;
    ?>
Avec cela je peux enregistrer $ip dans ma bd en l'ajoutant au JS ?
var ip=$('#form_ip').val();
+
php
function check_entries($nomprenom,$email,$telephone,$typecontact,$ip)

Ou faut il que je l'input aussi ?
Cela n'est pas urgent...

Avant cela, je vérifie tout les codes avant de lancer le formulaire et espère que ça va bien se passer.
Merci pour votre patiente et votre pédagogie,
Pierrot

Hors ligne

#73 08-10-2014 14:03:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Bonjour,

Mais j'ai un doute sur le JS du submit "envoyer", si je ne trompe pas il doit bien être en JQUERY comme ceci :
jQuery(function(){
function submit_form(){...}

et non en format classique : <script type="text/javascript">...</script>

Wow, il semblerait que vous partez de loin en techno web... Ca fait longtemps que vous faites du Java?
Sinon pour vous répondre sur ce point, le code javascript fourni n'est pas à modifier niveau contexte/structure, comme vous venez de le faire par exemple, sauf à l'adapter en orienté objet, mais là vous n'y êtes pas non plus.

Ensuite <script type="text/javascript">...</script> n'est pas du tout la forme classique, mais la forme "inline" qui est à proscrire dans un contexte pro, car elle ne permet pas la gestion de cache du code principalement. La bonne méthode est d'utiliser l'insertion par référence comme un include de fichier dans votre page html


<head>
<script type="text/javascript" lang="fr-fr" src="libs/js/jquery/jquery-1.11.0.min.js"></script>
<script type="text/javascript" lang="fr-fr" src="libs/js/mabibliotheque.js"></script>
</head>
 

En veillant à bien charger le Framework jquery avant votre bibliothèque contenant votre fonction submit_form() comme ici.

Si j'isole mon fichier php sous un autre nom, donc sans l'intégrer dans le fichier existant form-validation.php de l'ancien formulaire, ce serait peut être mieux ?

De quel fichier php à isoler parlez-vous?

Donc, je vais devoir, pour chaque div (sans <form>), entrer un input (div/email, textarea, etc..), puis laisser le script submit engager la chaîne de traitement de l'ensemble des input, cela est bien valide ?

Oui

Je voudrais récupérer et enregistrer l'Ip du contact


$ip=$_SERVER['REMOTE_ADDR']; // C'est la seule méthode à utiliser. Rien d'autre.
 

Avec cela je peux enregistrer $ip dans ma bd en l'ajoutant au JS ?
var ip=$('#form_ip').val();

??? Javascript est interprété et éxécuté côté client donc navigateur, PHP l'est exclusivement côté serveur. L'adresse IP de l'internaute connecté étant connue d'office par le serveur, pas besoin de l'intégrer dans votre code html pour le récupérer en Js et le renvoyer au serveur!!! Donc oubliez ce code!

A bientôt smile

EDIT:
Pour information, 


// écriture en Jquery
var nom = $('#form_nom').val();

// écriture en javascript pur
var nom = document.getElementById('form_nom').value;
 

Dernière modification par Jc (08-10-2014 14:19:03)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#74 08-10-2014 16:35:35

pierrot35
Membre
Inscription : 16-08-2014
Messages : 63

Re : Protéger par un formulaire toutes les IHM d'une même session php

Je vous comprends plus que bien wink,

Pour vous éclairer en toute sincérité ( je sais que ce n'est pas le but de ce forum)
Les technos et le codage informatique.. une longue histoire.. de 8 mois environ, ce n'est pas mon métier de base, mais de fil en aiguille ...et des heures à ne plus compter.. je brosse petit à petit un ensemble de techno que souvent je découvre à l'avancement.
Cela m'engage en permanence vers des connaissances de plus en plus élargies sans avoir la possibilité de les consolider une à une comme je le voudrais, jusqu'à les confondre en terme d'applicatifs.
Java/posrgresql/glassfish/struts/,.. je me suis lancé sur ces technos  ( livres, tutos, et appuis de temps en temps) en travaillant sur une appli qui à la base était déjà formaté avec ces technos, donc pas le choix, il à bien fallu que je me les approprie partiellement pour évoluer vers ce que je veux faire maintenant.
C'est comme ça que j'ai commencé, par mimétisme, en testant ce que je faisais jusqu'à ce que ça marche..
Ma difficulté fondamentale, enfin je le pense, est que je travaille sur une techno, puis passe sur une autre, et ainsi de suite, si bien que j'ai du mal à capitaliser ce que j'apprends pour le réinvestir sans me replonger dans ce que j'avais compris, ou souvent cru comprendre, 3 semaines avant, surtout qu'à chaque fois que je pousse une porte il y en a des dizaines d'autres derrière, à la fin ça fait beaucoup..
Je suis bien conscient de cela, ne m'en cache pas et ne forge pas non plus de prétentions, qui seraient par ailleurs démontées par le premier véritable informaticien venu.
Ce que je sais par contre, est que ça avance et que ça finira par aboutir, c'est un travail de fourmi, surtout que, lorsqu'on a des petites jambes on doit faire des petits pas, sinon.. on se casse L..
Je ne peux vous en dire plus en public, mais si cela vous intéressait, je peux vous envoyer un lien vers l'appli et vous verriez que ce n'est pas une petite appli "creuse".
Elle à une longue histoire derrière elle qui se compte en années...et vais pas la laisser tomber maintenant, même avec mes petits moyens.
Si vous vouliez d'autres infos, plus précises et plus circonstanciées, je vous enverrai avec plaisir celles-ci par mail privé, en confiance.

Pour revenir sur des choses plus factuelles :
J'ai ce code dans mon head

<head><meta charset="utf-8" />
<title>demande informations complémentaires</title>
<... je ne colle pas tout le code >
<meta name="description" content="" />
<meta name="robots" content="all" />
<meta name="generator" content="Bluefish 2.2.2" />
<meta http-equiv="Cache-Control" content="must-revalidate, max-age=0, public" />
<meta http-equiv="Expires" content="-1" />
<link rel="stylesheet" href="//*****.eu/onewebstatic/e5de4412f9.css" />
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<!-- Contact Form Start -->
[color=#ff1f4b][b]<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>[/b][/color]
<script src="cfg-contactform-35/js/contactform.js"></script>
<link href="cfg-contactform-35/css/contactform.css" rel="stylesheet" type="text/css" />
<script src="cfg-contactform-35/js/swfupload/swfupload.js"></script>
<script src="cfg-contactform-35/js/swfupload/swfupload.queue.js"></script>
<script src="cfg-contactform-35/js/swfupload/fileprogress.js"></script>
<script src="cfg-contactform-35/js/swfupload/handlers.js"></script>
<script src="cfg-contactform-35/js/upload.js"></script>
[b]<!-- ajout 06 10 2014 -->
<script src="cfg-contactform-35/js/scriptformulaire.js"></script>[/b]
<!-- fin ajout 06 10 2014 -->
<link href="cfg-contactform-35/js/swfupload/default.css" rel="stylesheet" type="text/css" />
<!-- Contact Form End -->
<link rel="stylesheet" href="//******/onewebstatic/a5a436fc4c.css" />
</head

Il faut aussi que je rajoute quand même la bibli ? <script type="text/javascript" lang="fr-fr" src="libs/js/mabibliotheque.js"></script>

Bon, j'y retourne, je clique sur envoyer et rien ne bouge, je vais voir ce qui se passe.
Je reviens vers vous plus tard
pierrot

Dernière modification par pierrot35 (08-10-2014 16:37:30)

Hors ligne

#75 08-10-2014 18:21:58

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protéger par un formulaire toutes les IHM d'une même session php

Il faut aussi que je rajoute quand même la bibli ? <script type="text/javascript" lang="fr-fr" src="libs/js/mabibliotheque.js"></script>

Maintenant que j'ai vu votre header, il semblerait qu'il y ait deux fichiers js "redondants" à vérifier donc s'il n'y a pas moyen d'en faire un seul tout propre tout beau
: <script src="cfg-contactform-35/js/contactform.js"></script> et <script src="cfg-contactform-35/js/scriptformulaire.js"></script>

Sinon pendant qu'on y est, habituez-vous à déclarer vos CSS en premier, ensuite les frameworks s'il y en a, ensuite leur plugins, et en derniers vos lib applicatives js. (En général un par module => donc toujours qu'un sur la page car elle est chargée dynamiquement en fonction des paramètres d'url idéalement => On ne charge que ce que l'on a besoin et rien d'autre).

++

Dernière modification par Jc (08-10-2014 18:22:31)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums