8800 sujets

Développement web côté serveur, CMS

Bonjour à nouveau,

Je tente de faire un générateur de mot de passe. Un clic sur un bouton remplirait une textbox avec un mot de passe générer aléatoirement.

Voici le résultat :
upload/50375-Capture.PNG
Et voici le formulaire :
<form name="add_user" method="post" action="ajouterAdherent_add.php">
<?php
$req="select * from adherent order by NomAdherent asc";
		$exec=mysql_query($req);
			  
		echo '<br>Nom de l adhérent : <select name="NomAdherent">';
		while ($ligne=mysql_fetch_array($exec))
		   {
				echo '<option value="'.$ligne['NomAdherent'].'">'.$ligne['NomAdherent'];   
		   }
		echo '</select><br>';
?>
<label for="mdpUtiliateur">Mot de passe :</label><br/>
          <input type="password" name="mdpUtilisateur" value="<? include('ajouterAdherent_add.php')?>" readonly="readonly"/><input type="button" value="Générer un mot de passe" onclick="<?include('ajouterAdherent_add.php')?>" />
<br>
           <input type="submit" name="submit" value="Ajouter l'adhérent" /></form>

Puis voici là page du générateur :
<?php
include "connexion.php";
$_SESSION['mess'] = '';
$_nomAdherent = htmlentities($_POST["nomAdherent"]);
$_mdpUtilisateur = htmlentities($_POST["mdpUtilisateur"]);


if (!isset($_nomAdherent) || !isset($_mdpUtilisateur))
{
    echo'
    <script>
        document.location="javascript:history.back()";
    </script>';
}
else
{
		$req="select NomAdherent, mdpUtilisateur from adherent where NomAdherent=$_nomAdherent";
		$exec=mysql_query($req);
		if (mysql_num_rows($exec)==0)
		{
			$num=1;
			}
			else
			{
			$ligne=mysql_fetch_array($exec);
			$num=$ligne['Id'] + 1;
		}
        $sql="update into adherent (mdpUtilisateur) values ('$mdpUtilisateur')";
		mysql_query($sql);
        header ("Location: ajouterAdherent.php");
}
?>

<!-- GENERATEUR DE MOTS DE PASSE -->
<?php
function genererMDP ($longueur = 8){
    // initialiser la variable $mdp
    $mdp = "";
 
    // Définir tout les caractères possibles dans le mot de passe, 
    // Il est possible de rajouter des voyelles ou bien des caractères spéciaux
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
 
    // obtenir le nombre de caractères dans la chaîne précédente
    // cette valeur sera utilisé plus tard
    $longueurMax = strlen($possible);
 
    if ($longueur > $longueurMax) {
        $longueur = $longueurMax;
    }
 
    // initialiser le compteur
    $i = 0;
 
    // ajouter un caractère aléatoire à $mdp jusqu'à ce que $longueur soit atteint
    while ($i < $longueur) {
        // prendre un caractère aléatoire
        $caractere = substr($possible, mt_rand(0, $longueurMax-1), 1);
 
        // vérifier si le caractère est déjà utilisé dans $mdp
        if (!strstr($mdp, $caractere)) {
            // Si non, ajouter le caractère à $mdp et augmenter le compteur
            $mdp .= $caractere;
            $i++;
        }
    }
 
    // retourner le résultat final
    return $mdp;
}
 
?>


Où est le problème ? Est-ce que c'est le fait d'avoir la modification de la base de données et le générateur sur la même page qui pose un problème ?

Cordialement,
lizeal
Modifié par lizeal (10 Feb 2014 - 16:43)
Bonjour, je ne vois pas ou tu appelles ta fonction php genererMDP() ?

Mais je penses que tu ne t'y prend pas bien. Le mot de passe doit être géré via javascript. De plus, il faut que l'utilisateur puisse voir le mot de passe généré.
Oui je ne sais pas comment on fait appel à une fonction dans une page php.

C'est obligé d'utiliser du javascript ? Bon en fait je crois que je suis vraiment à la ramasse, je vais tout recommencer.

Merci des réponses.
Modérateur
Bonjour,

alors en php, on va générer un document (généralement du html) qui va être envoyé au visiteur. Lui va recevoir du HTML dans lequel il n'y a plus trace de php.
Et pour un peu de révision: http://www.alsacreations.com/article/lire/558-PHP-introduction-initiation.html Smiley cligne

Il y a donc trois manières de faire:
1) renvoyer la page au serveur et la recharger avec un code généré.
2) Gérer ça du côté client sans rechargement, javascript sera donc nécessaire.
3) Mixer les deux, faire de l'ajax pour récupérer en javascript un code généré par le serveur.

Dans la plupart des cas, l'option 2 semble la plus sensée.
Ok très bien donc je vais m'orienter sur du Javascript. Je vous tiens au courant de ma réussite et si vous avez d'autres choses à me dire qui pourrait m'enrichir je suis preneuse !
Merci !
Du coup en faisant appel à du Javascript ça va beaucoup mieux ...
var keylist="abcdefghijklmnopqrstuvwxyz123456789"
var temp=''
function generatepass(plength)
{
	temp=''
	for (i=0;i<plength;i++)
	temp+=keylist.charAt(Math.floor(Math.random()*keylist.length))
	return temp
}
function populateform(enterlength)
{
	document.add_user.mdpUtilisateur.value=generatepass(enterlength)
}

<form name="add_user" method="post" action="ajouterAdherent_add.php">
<?php
// on choisi l'adhérent
$req="select NomAdherent, PrenomAdherent from adherent order by NomAdherent asc";
		$exec=mysql_query($req);
		echo 'Nom de l adhérent : <select name="NomAdherent">';
		while ($ligne=mysql_fetch_array($exec))
		   {
				echo '<option value="'.$ligne['NomAdherent'].'">'.$ligne['NomAdherent']. " " .$ligne['PrenomAdherent'];   
		   }
		echo '</select><br>';
?>
<!-- on lui génère un mdp -->
<input type="hidden" name="thelength" size=1 value="6">
<input type="button" value="Générer un mot de passe"  onClick="populateform(this.form.thelength.value)" /><input type="password" name="mdpUtilisateur" value="<? include('ajouterAdherent_add.php')?>" readonly="readonly" size=3/><br>
<input type="submit" class="btn_addSuppEdit" name="submit" value="Ajouter l'adhérent" /></form>


Merci à vous
Modérateur
Salut,

J'arrive un peu après la bataille.

lizeal a écrit :
Du coup en faisant appel à du Javascript ça va beaucoup mieux ...


Oui mais on est dans un cas de JS obstructif et intrusif (voir ton code). Or, on peut faire sans JS et on peut le faire dans le cas où le JS est optionnel.

le php :

<?php
    if(isset($_GET) && !empty($_GET['genererPasse'])){
        $listCharacters = array_merge(range('a','z'),range('A','Z'),range(0,9));
        $output = '';    
        for ($i = 0; $i < mt_rand(8,12); $i++) {
            $output .= $listCharacters[array_rand($listCharacters)]; 
        }
        header('location:'.$_SERVER['PHP_SELF'].'?motDePassGenere='.$output);
    }
?>


le html :

    <form action="#" method="post" id="formulaire">
        <!-- etc. -->
        <div id="motDepasse">
            <div><a href="<?php echo $_SERVER['PHP_SELF'] ?>?genererPasse=1" id="bouton">générer mot de passe</a></div>
            <div>
                <label for="motDePassGenere">mote de passe généré : </label>
                <input type="text" name="motDePassGenere" id="motDePassGenere" value="<?php if(!empty($_GET['motDePassGenere'])) echo $_GET['motDePassGenere'] ?>" />
            </div>
        </div>
        <!-- etc. -->
        <div><input type="submit" /></div>
    </form>


le script en lui même (générer un mot de passe) :

        window.addEventListener('load',function(){
            var form = document.getElementById('formulaire');
            if(form){               
                
                var bouton = document.getElementById('bouton'),
                    motDePassGenere = document.getElementById('motDePassGenere');
                    
                bouton.addEventListener('click',function(e){
                    var alphaMin = range('a','z'),
                        alphaMaj = range('A','Z'),
                        chiffres = range(0,9),
                        listCharacters = array_merge(alphaMin,alphaMaj,chiffres),
                        output = '';
                        
                        
                    for (var i = 0; i < (8 + (Math.floor(Math.random() * 4))); i++) {
                       output += listCharacters[array_rand(listCharacters)]; 
                    }
                    motDePassGenere.value = output;
                        
                    
                    e.preventDefault();
                });
            }
                
        });


fonctions JS utiles pour le script :

        function array_rand (input, num_req) {
          var indexes = [];
          var ticks = num_req || 1;
          var checkDuplicate = function (input, value) {
            var exist = false,
              index = 0,
              il = input.length;
            while (index < il) {
              if (input[index] === value) {
                exist = true;
                break;
              }
              index++;
            }
            return exist;
          };
        
          if (Object.prototype.toString.call(input) === '[object Array]' && ticks <= input.length) {
            while (true) {
              var rand = Math.floor((Math.random() * input.length));
              if (indexes.length === ticks) {
                break;
              }
              if (!checkDuplicate(indexes, rand)) {
                indexes.push(rand);
              }
            }
          } else {
            indexes = null;
          }
        
          return ((ticks == 1) ? indexes.join() : indexes);
        }


        function range (low, high, step) {
            var matrix = [];
            var inival, endval, plus;
            var walker = step || 1;
            var chars = false;
          
            if (!isNaN(low) && !isNaN(high)) {
              inival = low;
              endval = high;
            } else if (isNaN(low) && isNaN(high)) {
              chars = true;
              inival = low.charCodeAt(0);
              endval = high.charCodeAt(0);
            } else {
              inival = (isNaN(low) ? 0 : low);
              endval = (isNaN(high) ? 0 : high);
            }
          
            plus = ((inival > endval) ? false : true);
            if (plus) {
              while (inival <= endval) {
                matrix.push(((chars) ? String.fromCharCode(inival) : inival));
                inival += walker;
              }
            } else {
              while (inival >= endval) {
                matrix.push(((chars) ? String.fromCharCode(inival) : inival));
                inival -= walker;
              }
            }
          
            return matrix;
        }
        
        function array_merge () {
            var args = Array.prototype.slice.call(arguments),
              argl = args.length,
              arg,
              retObj = {},
              k = '',
              argil = 0,
              j = 0,
              i = 0,
              ct = 0,
              toStr = Object.prototype.toString,
              retArr = true;
          
            for (i = 0; i < argl; i++) {
              if (toStr.call(args[i]) !== '[object Array]') {
                retArr = false;
                break;
              }
            }
          
            if (retArr) {
              retArr = [];
              for (i = 0; i < argl; i++) {
                retArr = retArr.concat(args[i]);
              }
              return retArr;
            }
          
            for (i = 0, ct = 0; i < argl; i++) {
              arg = args[i];
              if (toStr.call(arg) === '[object Array]') {
                for (j = 0, argil = arg.length; j < argil; j++) {
                  retObj[ct++] = arg[j];
                }
              }
              else {
                for (k in arg) {
                  if (arg.hasOwnProperty(k)) {
                    if (parseInt(k, 10) + '' === k) {
                      retObj[ct++] = arg[k];
                    }
                    else {
                      retObj[k] = arg[k];
                    }
                  }
                }
              }
            }
            return retObj;
        }
[/i][/i][/i]
Modifié par niuxe (11 Feb 2014 - 21:29)
Effectivement c'est plus complet, ne m'y connaissant pas trop je garde ma version plus simplifiée lol
Je te remercie !