IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Bouton suivre - ne plus suivre - suivre - ne plus suivre etc.


Sujet :

jQuery

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Bouton suivre - ne plus suivre - suivre - ne plus suivre etc.
    Bonjour à tous

    J'espère que je suis dans la bonne section.

    J'ai un problème avec de l'Ajax. En fait, je voudrais créer un bouton "suivre" qui, lorsqu'on clique dessus envoie des données en post à un script en php qui les envoie dans la bdd, puis le bouton passe en "ne plus suivre". Lorsqu'on clique sur ne plus suivre, le javascript envoie les données du formulaire en post à un autre script en php qui update la bdd. Ce n'est peut-être pas très clair expliqué ainsi
    J'ai trouvé une solution super crade pour faire ça mais je pense que vous pourrez m'aider à faire bien bien mieux. En plus au bout de 3 clics d'affilés sur le dit bouton il y a un rechargement de la page (que je ne voudrais pas). Ma solution n'est pas la bonne...

    Voilà le html :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <div id="follow">
    <?php
    if ($friendsql[0] == $_SESSION['login'])
            {
    ?> 
    	<form method="post", action="#" id="formcom2">
    	<input type="hidden" name="loginpage" value="<?php echo $login ?>">
    	<input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    	<input type="submit" class="neplussuivre" value="- Ne plus suivre"/>
    	</form> 
     
    	<div id="newdiv" style="display: none;">
    	<form method="post", action="#" id="formcom2">
    	<input type="hidden" name="loginpage" value="<?php echo $login ?>">
            <input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    	<input type="submit" class="neplussuivre" value="- Ne plus suivre"/>
    	</form>
    	</div>
     
    	<div id="newdiv2" style="display: none;">
    		<form method="post", action="#" id="formcom">
    		    <input type="hidden" name="loginpage" value="<?php echo $login ?>">
    		     <input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    		      <input type="submit" class="suivre" value="+ Suivre"/>
    		   </form>
    	</div>
    <?php   
                    }
            else
                   {
    ?> 
    	<form method="post", action="#" id="formcom">
    		<input type="hidden" name="loginpage" value="<?php echo $login ?>">
    		<input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    		<input type="submit" class="suivre" value="+ Suivre"/>
    		</form>
    		<div id="newdiv" style="display: none;">
    				<form method="post", action="#" id="formcom2">
    				<input type="hidden" name="loginpage" value="<?php echo $login ?>">
    				<input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    				<input type="submit" class="neplussuivre" value="- Ne plus suivre"/>
    				</form>
    		</div>
    		    <div id="newdiv2" style="display: none;">
    			<form method="post", action="#" id="formcom">
    					<input type="hidden" name="loginpage" value="<?php echo $login ?>">
    					<input type="hidden" name="login" value="<?php echo $_SESSION['login'] ?>">
    					<input type="submit" class="suivre" value="+ Suivre"/>
    			</form>
    			</div>

    Ne criez pas je sais que c'est horrible

    Les deux scripts js (un pour suivre et l'autre pour ne plus suivre) :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $(function() {
    	$("#formcom").submit(function(){
    		login = $(this).find("input[name=login]").val();
    		loginpage = $(this).find("input[name=loginpage]").val();
    		$.post("scripts/follow.php", {login: login, loginpage: loginpage}, function(data) {
    			if(data != "ok")
    			{
    				$(".error").empty().append(data);
    			}
    			else
    			{
    				//$("#resultatAjax").hide().append(login+" a follow : "+loginpage).slideDown();
    				$("#formcom").hide();
    				$("#newdiv").show();
    			}
    		});
    		return false;
    	});
    });
    $(function() {
    	$("#formcom2").submit(function(){
    		login = $(this).find("input[name=login]").val();
    		loginpage = $(this).find("input[name=loginpage]").val();
    		$.post("scripts/unfollow.php", {login: login, loginpage: loginpage}, function(data) {
    			if(data != "ok")
    			{
    				$(".error").empty().append(data);
    			}
    			else
    			{
    				//$("#resultatAjax").hide().append(login+" a follow : "+loginpage).slideDown();
    				$("#formcom2").hide();
    				$("#newdiv2").show();
    			}
    		});
    		return false;
    	});
    });

    Et les deux php :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    include('../../config.php');
     
    extract($_POST);
    if(isset($login) && !empty($login))
    {
    $time = date("Y-m-d H:i:s");
    $sql = "INSERT INTO friends(follower, friend, dateheure) VALUES ('".$login."', '".$loginpage."', '".$time."')";
    $name = mysqli_query($aVar, $sql);
    echo "ok";
    }
    else
    {
    	echo "error following";
    }
    ?>

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    include('../../config.php');
     
    extract($_POST);
    if(isset($login) && !empty($login))
    {
    $sql = "DELETE FROM friends WHERE follower='".$login."' AND friend='".$loginpage."'";
    $name = mysqli_query($aVar, $sql);
    echo "ok";
    }
    else
    {
    	echo "error following";
    }
    ?>

    Je m'entraine en Ajax je n'en avais encore jamais fait alors s'il vous plait ne m'engueulez pas j'espère que vous pourrez vite m'aider à améliorer ça.

    Je vous remercie beaucoup d'avance...

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Le code en lui-même n'est pas si crade que ça. Ton problème c'est plutôt le raisonnement, et apparemment tu en es bien conscient

    Ce n'est pas un hasard si un serveur s'appelle un serveur. Les navigateurs sont aussi parfois appelées clients web. Fais la comparaison avec un bar : il y a les clients, qui font des « requêtes » (ils commandent quelque chose) et le serveur « répond » avec les boissons demandées.

    Le Web c'est pareil : ton navigateur fait des requêtes et le serveur apporte du contenu. Le contenu en l'occurence, c'est l'information dans la bdd qui indique si le client suit ou ne suit pas actuellement. Lors d'une première connexion (le client entre dans le bar), le client n'est pas censé connaître cette information : il doit la demander au serveur. Ensuite, s'il apprend qu'il est en train de suivre, il fait la demande de ne plus suivre ; dans le cas contraire il demande à suivre.

    La première connexion correspond à la requête non Ajax que fait ton navigateur pour obtenir la page entière. À ce moment, ton serveur doit envoyer l'information « l'utilisateur suit » ou « l'utilisateur ne suit pas », mais pas les deux. Tu n'as qu'un seul formulaire à générer (au lieu de 6 dans ton code actuel !).

    Les requêtes suivantes sont faites en Ajax. En réponse à ces requêtes il est important que le serveur informe le client de sa nouvelle situation : s'il est à présent en train de suivre ou pas. Ainsi le client peut mettre à jour son affichage pour que l'utilisateur (l'humain qui utilise le client) soit informé de la réussite ou de l'échec de la requête, et aussi mettre à jour l'adresse à laquelle envoyer la prochaine requête (scripts/follow.php ou scripts/unfollow.php).

    Comme dans un bar, c'est le client qui choisit ce qu'il consomme (quelle requête envoyer), mais c'est le serveur qui manipule les boissons (l'information dans la bdd).



    Edit:
    Aouch.
    En faisant ça tu t'exposes exactement aux mêmes failles de sécurité qu'avec l'ancienne directive register_globals. Explications ici.

    Un exemple utilisant ton code : en supposant que j'ai accès à ton site, je tape cette adresse dans mon navigateur :
    Code URL : Sélectionner tout - Visualiser dans une fenêtre à part
    unfollow.php?login='%20OR%20TRUE%3B%20--
    Le morceau bizarre est la forme URL-encodée de la chaîne "' OR TRUE; --". Avec ton extract, cela va devenir le contenu de ta variable $login. Maintenant regarde ta requête SQL :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    "DELETE FROM friends WHERE follower='".$login."' AND friend='".$loginpage."'"
    Avec ce que j'ai mis dans $login, la requête devient :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM friends WHERE follower='' OR TRUE; --' AND friend=''
    Tu devines ce qui va se passer ? Ce qui suit les tirets -- est considéré comme un commentaire : c'est ignoré. La clause OR TRUE dans le WHERE est vraie tout le temps. Autrement dit, le DELETE va s'exécuter sans condition, la table entière va être vidée !

    Comme tu le vois ce n'est pas compliqué de trouver un pattern d'injection SQL. Et encore, moi je ne suis qu'un petit vandale, je ne connais que les astuces pour détruire. Imagine ce qu'un vrai pirate est capable de faire – consulter la config de ton serveur SQL, insérer du contenu piégé, etc.

    Tu le sais sans doute, ce genre d'attaque s'appelle un injection SQL. Pour t'en protéger, utilises des requêtes préparées ou échappe tes variables avant des les insérer dans tes requêtes.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour la super explication. C'est on ne peut plus clair.

    Je vais corriger ça tout de suite. La sécu n'était pas vraiment vraiment le but du truc mais au moins comme ça, ça sera nickel

Discussions similaires

  1. [PPT-2003] Bouton "Temps total d'un diaporama marche plus"
    Par bolide7 dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 26/03/2012, 18h23
  2. Le bouton de mise en veille de fonctionne plus
    Par koKoTis dans le forum Windows XP
    Réponses: 21
    Dernier message: 11/06/2007, 08h07
  3. Réponses: 52
    Dernier message: 13/03/2007, 15h07
  4. pc ne démarre plus du tout, meme plus de bios
    Par lavazavio dans le forum Ordinateurs
    Réponses: 11
    Dernier message: 23/02/2007, 22h53
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo