Page 1 sur 1

Fonction + boucle (génération de mots de passe)

Posté : 05 nov. 2008, 22:25
par sgrunt
Bonjour,

Je débute en php donc je me heurte à plein de problèmes lors de l'interprétation de mes scripts et là je ne sais pas trop quoi faire car je débute tout juste dans les fonctions.

En fait j'ai une table mysql avec un champ pour le mot de passe. J'ai une centaine d'enregistrements et je veux mettre un pass aléatoire pour chacun.
Alors j'ai lu un tuto qui m'a aidé à faire un script pour faire un pass aléatoire (merci google)
J'ai fais mon petit script, il fonctionne.
Je lui ai joins une requête sql "insert into" pour qu'il mettre le pass dans la table, ca a marché, mais jusque là ca ne le fait que pour un seul enregistrement (logique).

Donc je me suis dit je vais mettre une petite boucle autour de ca et c'est bon! bin non :s
Il me renvoit:
Fatal error: Cannot redeclare generer_pass() (previously declared in /opt/lampp/htdocs/mdp.php:8) in /opt/lampp/htdocs/mdp.php on line 8
Donc: c'est pas possible de mettre une fonction dans une boucle ? :s

Voici le code:

Code : Tout sélectionner

$taille_mdp=8; for($i=1;$i<=78;$i++) { function Generer_pass($taille_mdp) { // Initialisation des caractères utilisables $char = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); for($i=0;$i<$taille_mdp;$i++) { $pass .= ($i%2) ? strtoupper($char[array_rand($char)]) : $char[array_rand($char)]; } return $pass; } $mot_de_passe = Generer_pass($size); //requete qui insère les mdp dans la table adherent $requete="INSERT INTO adherent (mdp_adh) VALUES ('$mot_de_passe');"; // Exécution de la requête mysql_query($requete) or die ("Requête impossible".mysql_error()); } echo "Fin!";
Et sinon, la ligne 8 c'est celle du for.

C'est pas un script qui va durer c'est juste pour une fois c'est pour ca qu'il y a un chiffre dans le for..


J'espère que vous pourrez m'aider, merci d'avoir lu en tout cas.
Bonne soirée
Jerem

Posté : 05 nov. 2008, 23:17
par furiouslol
En fait a chaque boucle tu redéfini la fonction, sort la déclaration de ta fonction de ton for et regarde ce que ca donne

Posté : 06 nov. 2008, 13:42
par AB
Cannot redeclare generer_pass() (previously declared in /opt/lampp/htdocs/mdp.php:8)
En fait ton message d'erreur dit que php ne peux pas redéclarer la fonction generer_pass() qui a été déjà préalablement déclarée

En php5 on ne peux pas déclarer plusieurs fois la même fonction, donc cela ne peux pas fonctionner dans ton exemple étant donné que ta fonction est déclarée à chaque itération dans la boucle.

Mais cela ne t'empêche aucunement de faire appel plusieurs fois à la même fonction "externe" depuis l'intérieur d'une boucle.

Donc en suivant le conseil de furiouslol, ça devrait fonctionner.

Posté : 06 nov. 2008, 15:42
par sgrunt
C'est bon j'ai réussi :D Enfin, grâce à vous deux!

J'ai sortis la fonction de la boucle et je n'ai mis que la ligne où j'appelle la fonction dans ma boucle. Et c'est bon :)

En plus, je mettais trompé de requête! On va dire que c'était la fatigue... Il me fallait un UPDATE en fait.

Du coup ca donne ceci:

Code : Tout sélectionner

$taille_mdp=8; function Generer_pass($taille_mdp) { // Initialisation des caractères utilisables $char = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); for($i=0;$i<$taille_mdp;$i++) { $pass .= ($i%2) ? strtoupper($char[array_rand($char)]) : $char[array_rand($char)]; } return $pass; } for($i=1;$i<=78;$i++) { $mot_de_passe = Generer_pass($taille_mdp); //requete qui insère les mdp dans la table adherent $requete="UPDATE adherent SET mdp_adh='$mot_de_passe' WHERE id_adh=$i;"; // Exécution de la requête mysql_query($requete) or die ("Requête impossible".mysql_error()); } echo "Fin!";
Il a fonctionné j'ai un mot de passe pour ma centaine d'adhérents :)
Est ce que c'est une mauvaise méthode de faire ce que j'ai fais?
C'est pour un tout petit site d'un club rien de très confidentiel.

Merci de votre aide! J'avais la solution au bout du nez encore une fois :roll:
Super forum, toujours là pour mes problèmes :)

Jerem