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

Langage PHP Discussion :

migration de mysql vers pdo


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut migration de mysql vers pdo
    Bonjour,

    Je suis perdu.

    J'ai fait le formulaire suivant :

    Code html : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form action="register.php" method="post"><br /><br />
    Nom : <input type="text" name="name" size="40" maxlength="256" /><br /><br />
    Pseudo : <input type="text" name="login" size="40" maxlength="256" /><br /><br />
    Mot de Passe : <input type="password" name="pass" size="40" maxlength="256" /><br /><br />
    Adresse e-mail : <input type="text" name="email" size="40" maxlength="256" /><br /><br />
    Localisation : <input type="text" name="location" size="40" maxlength="256" /><br /><br />
    Site internet / Blog : <input type="text" name="website" size="40" maxlength="256" /><br /><br />
    <input type="submit" value="S'inscrire" />
    </form>

    Rien de bien compliqu� jusque l�. Puis je veux �crire ces infos dans une base de donn�es mysql :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?php
     
     
     
    	if (isset($_POST['login']) and isset($_POST['pass']))
     
    	    {
    		  if ($_POST['login'] != "" and $_POST['pass'] != "")
    		   {
    		   		$nom = $_POST['name'];
    				$pseudo = $_POST['login'];
    				$motdepasse = $_POST['pass'];
    				$email = $_POST['email'];
    				//$date_creation = now();
    				$localisation = $_POST['location'];
    				$site = $_POST['website']; 
    				$pass = md5 ($motdepasse);
     
     
    				require ("connexion.php");
     
    				$query = 'INSERT INTO users (user_login, user_password, user_email, user_name, user_location, user_website) VALUES ($pseudo, $pass, $email, $nom, $localisation, $site)';
    				$stmt = $bdd->prepare($query);
     
     
     
    				$stmt->execute();
     
    							 }
    		   		   else
    		   {
    		   echo 'Les informations saisies sont incorrectes !';
    		   }
    		}
    ?>

    Au final, �a n'�crit rien du tout dan ma bdd et je ne comprends pas pourquoi si ce n'est que comme je d�bute sur PDO je dois avoir loup� qqch mais je ne sais pas trop quoi.

    Quelqu'un peut m'aider, svp ?

  2. #2
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Regardes les exemples de la doc http://php.net/manual/fr/pdo.prepare.php
    Tu trouve que cela ressemble � ce que tu as fait ?

    EDIT : Si tu fais une requ�te pr�par�e, il faut :
    1/ Utiliser des marqueurs nomm�s ou interrogatifs pour symboliser tes variables dans la pr�paration de la requ�te
    2/ Associer tes marqueurs avec bindParam ou bindValue avant d'utiliser execute(), ou sinon passer le tableau des marqueurs et de leur valeur dans execute()

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    J'avais vu cette doc et j'ai recopi� aussi la m�thode avec bindparam mais j'avais tjs le m�me probl�me !!

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Bon, j'ai tout relu et corrig� le code.

    J'obtiens donc ceci :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <?php
    	if (isset($_POST['login']) and isset($_POST['pass']))
     
    	    {
    		  if ($_POST['login'] != "" and $_POST['pass'] != "")
    		   {
    		   		$nom = $_POST['name'];
    				$pseudo = $_POST['login'];
    				$motdepasse = $_POST['pass'];
    				$email = $_POST['email'];
    				$localisation = $_POST['location'];
    				$site = $_POST['website']; 
    				$pass = md5 ($motdepasse);
     
    				require ("connexion.php");
     
    				$query = 'INSERT INTO users (user_login, user_password, user_email, user_name, user_location, user_website) VALUES (:pseudo, :pass, :email, :nom, :localisation, :site)';
    				$stmt = $bdd->prepare($query);
     
    				$stmt->bindParam(':pseudo', $pseudo);
    				$stmt->bindParam(':pass', $pass);
    				$stmt->bindParam(':email', $email);
    				$stmt->bindParam(':nom', $nom);
    				$stmt->bindParam(':localisation', $localisation);
    				$stmt->bindParam(':site', $site);
     
    				$stmt->execute();
    			 }
    		   		   else
    		   {
    		   echo 'Les informations saisies sont incorrectes !';
    		   }
    		}
    ?>

    Ce code est fonctionnel...

    ... mais... �a m'a pas l'air tr�s propre tout �a...

    Vous en pensez quoi ?

  5. #5
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    C'est parfaitement propre.

    Cela dit souvent on utilise un tableau avec les marqueurs et leurs valeurs correspondantes que l'on passe en param�tre dans execute(). C'est souvent plus rapide et pratique que de binder s�par�ment les valeurs.

    Mais d'un autre c�t� le fait de binder s�par�ment les variables permet de leur attribuer s�par�ment un type sp�cifique (option que tu n'utilise pas dans ton exemple), alors que quand on passe un tableau le mode chaine de caract�re (PDO:: PARAM_STR) est utilis� par d�faut pour toutes les valeurs du tableau.


    EDIT: Utilises plut�t l'op�rateur "&&" � la place de "and", ce n'est pas tout � fait la m�me chose et "&&" � un comportement plus pr�visible dans les conditions multiples (les priorit�s d'ex�cution ne sont pas les m�mes).

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    ok je remplace mes and par des &&

    autre chose ; j'aimerais afficher un texte selon que mon enregistrement s'est bien pass� ou non.

    avec mysql, j'aurais fait un if (!$stmt) mais l� �a n'a pas l'air de marcher.

    une id�e ?

  7. #7
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Ben si c'est pareil,

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //renvoie true ou false
    $result = $query->execute();
     
    if($result)
    {
    //OK
    }
    else
    {
    //erreur
    }
    Cela dit comme tu t'int�resse � PDO tu devrais jeter un oeil du c�t� de la gestion des erreurs avec PDO::ERRMODE_EXCEPTION que tu peux mettre en param�tre dans ta connexion ou sinon plus tard dans le code en faisant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    et donc apr�s tu peux utiliser le gestionnaire d'exception en faisant :
    Code : 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
    //...
    require ("connexion.php");
     
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
    $requete_ok = true;
     
    try {
            $query = 'INSERT INTO users (user_login, user_password, user_email, user_name, user_location, user_website) VALUES (:pseudo, :pass, :email, :nom, :localisation, :site)';
    	$stmt = $bdd->prepare($query);
     
    	$stmt->bindParam(':pseudo', $pseudo);
    	$stmt->bindParam(':pass', $pass);
    	$stmt->bindParam(':email', $email);
    	$stmt->bindParam(':nom', $nom);
    	$stmt->bindParam(':localisation', $localisation);
    	$stmt->bindParam(':site', $site);
     
    	$stmt->execute();
        }
    catch(PDOException $e)
        {
            // en phase production
            $requete_ok = false;
     
            //en phase de développement on affiche les détails
           echo $e->getMessage();
        }
     
    if($requete_ok) ...
    l'avantage est que tu g�re en une seule fois toutes les erreurs de ta requ�te, pas seulement au niveau du execute comme pr�c�demment mais aussi au niveau du prepare et du bind des variables.

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Effectivement j'essaye de faire un maximum de gestion d'erreurs pour obtenir un r�sultat assez professionnel.

    Toutefois, ton id�e me pose un petit probl�me... r�cup�rer les erreurs est une chose qui m'int�resse mais le getMessage() me fait afficher l'erreur sous l'oeil de l'utilisateur.
    Deux cas se pr�sentent alors :
    - l'utilisateur est mal intentionn� et gr�ce au message d'erreur il peut trouver une faille.
    - l'utilisateur s'en fiche et je lui affiche donc des trucs qu'il ne comprend pas et dont il se moque pas mal.

    Je fais fausse route ?

    Sinon pourquoi pas �crire l'erreur dans une table de la bdd et l'affiche dans un "panneau d'administration" ?

  9. #9
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Citation Envoy� par Black_Layer Voir le message
    Toutefois, ton id�e me pose un petit probl�me... r�cup�rer les erreurs est une chose qui m'int�resse mais le getMessage() me fait afficher l'erreur sous l'oeil de l'utilisateur.
    Je fais fausse route ?
    Tu n'as pas lu le commentaire juste au dessus de echo $e->getMessage(); ??
    Il va de soit qu'on �crit cette ligne (si besoin) uniquement en phase de d�veloppement, et qu'on l'efface ou qu'on la met en commentaire lors de la phase de production (si tu pr�f�re quand le site est en ligne).

    Si tu fais pas attention � ce qu'on �crit... et en plus m�me pas un point pour dire que mes messages t'ont aid�s
    Grossier personnage va!

  10. #10
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Ok alors 2 choses :

    1- Je n'avais pas lu le commentaire
    2- Tes messages ne m'ont pas simplement aid� ; ils m'ont rendu un �noooooorme service

  11. #11
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Bon �a va mieux alors un dernier petit conseil sur pdo : il est aujourd'hui tr�s conseill� de d�sactiver l'�mulateur de requ�tes pr�par�es avec l'option
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    (qu'on ne met g�n�ralement qu'une fois dans les options de sa connexion).

    Le gros avantage est que l'�mulateur de requ�tes pr�par�es va passer la main � l'�mulateur de la bdd, si possible, et sinon reprendre la main en cas de besoins. On y gagne en performances et aussi en facilit� pour le typage des donn�es car le typage sera par d�faut celui demand� par la bdd. Cela �vite au passage l'erreur grossi�re des variables pass�es dans la clause LIMIT qui posent un probl�me si on ne type pas les variables explicitement en entier, vu que l'�mulateur PDO type en string par d�faut (et mysql exige un entier).

    par exemple :
    Code : 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
    $_GET['limite'] = 2;
    try
    {
    	$query = "SELECT * FROM membres LIMIT ?";
     
    	$stmt = $bdd->prepare($query);
     
    	$stmt->execute(array($_GET['limite']));
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }
    // SYNTAXE ERREUR : impossible de typer un tableau dans execute donc pas de solution sauf si on désactive l'émulateur de requêtes préparées.
    // Si l'on ne désactive pas l'émulateur il faut utiliser un bind en spécifiant un type entier :
    $_GET['limite'] = 2;
    try
    {
    	$query = "SELECT * FROM membres LIMIT ?";
     
    	$stmt = $bdd->prepare($query);
     
    	$stmt->bindParam(1, $_GET['limite'],PDO::PARAM_INT);
     
    	$stmt->execute();
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }
    // OK
     
    // Le plus simple, pratique et optimisé est encore de désactiver l'émulateur de requêtes préparées
    $_GET['limite'] = 2;
    try
    {
            $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
     
    	$query = "SELECT * FROM membres LIMIT ?";
     
    	$stmt = $bdd->prepare($query);
     
    	$stmt->execute(array($_GET['limite']));
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }
    // OK
    Donc il est tr�s recommand� de d�sactiver l'�mulateur de requ�tes pr�par�es qui est trop g�n�raliste pour pouvoir �tre optimis� (ne pas oublier que l'on y gagne aussi en performances).

    EDIT : Et pour la route, md5 est aujourd'hui compl�tement d�pass�. A n'utiliser que pour compatibilit� avec d'anciennes donn�es. Le minimum pour les nouveaux codes aujourd'hui est sha256 disponible entre autre avec la fonction hash :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    $hash_mdp = hash("sha256",$pass);
    Sinon pour le forum, quand un message va dans la bonne direction on sugg�re de cliquer sur les pouces lev�s en bas des messages. Perso on y gagne rien mais c'est utile pour les �ventuels visiteurs qui cherchent une r�ponse en parcourant le forum

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Whaouuu !! J'ai vraiment de la chance que tu te sois int�ress� � mon topic !!

    - Pour ce qui est du :
    Code php : S�lectionner tout - Visualiser dans une fen�tre � part
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    si je le mets directement dans connexion.php, �a le fait ou c'est pas bon ?

    - Je ne savais pas que le md5 �tait d�pass� ; merci de m'en informer.

    - Toujours dans mon soucis de faire un bon code, j'aimerais v�rifier que le pseudo n'est pas d�j� utilis� (quoi de plus con que deux personnes sous le m�me pseudo).
    J'ai cherch� sur le net et j'ai vu pas mal de scripts utilisant SELECT count(*) puis data[0] etc... mais ce script g�n�re d'apr�s les retours pas mal d'erreurs car "data[0] ce n'est pas le nombre de r�sultats retourn�s par la requ�te mais la premi�re colonne demand�e dans le select".

    Je pourrais donc faire un script classique parcourant la bdd � la recherche du login et comparant avec le login recherch�... mais l� �a m'a l'air lourd.

    Une id�e de script plus simple ou de correction du select count(*) ?

    - Derni�re chose, j'ai vu un script de connexion o� il y avait tout le code php, puis tout le code html et ce dans le m�me fichier "inscription.php".

    C'est mieux de travailler avec un seul fichier ou de s�parer les deux ?

  13. #13
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Citation Envoy� par Black_Layer Voir le message
    Code php : S�lectionner tout - Visualiser dans une fen�tre � part
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    si je le mets directement dans connexion.php, �a le fait ou c'est pas bon ?
    Oui, la mani�re la plus lisible (� mon avis) pour passer des options lors de la connexion est de faire comme dans cette petite classe de connexion

    Citation Envoy� par Black_Layer Voir le message
    - Toujours dans mon soucis de faire un bon code, j'aimerais v�rifier que le pseudo n'est pas d�j� utilis� (quoi de plus con que deux personnes sous le m�me pseudo).
    J'ai cherch� sur le net et j'ai vu pas mal de scripts utilisant SELECT count(*) puis data[0] etc... mais ce script g�n�re d'apr�s les retours pas mal d'erreurs car "data[0] ce n'est pas le nombre de r�sultats retourn�s par la requ�te mais la premi�re colonne demand�e dans le select".
    Cela devrait fonctionner mais cela d�pend de comment c'est mis en place.
    Avec pdo on recommande d'utiliser fetchColumn comme dans l'exemple n�2 de ce lien

    D'un autre c�t�, si ta table est bien construite tu devrais avoir le champ "pseudo" en tant que champ unique, ou comme cl� primaire. Tu pourrais donc - � cette condition seulement - te servir de cette caract�ristique pour faire ton insert et simplement g�rer l'exception car l'insert ne fonctionnera pas si deux pseudo sont identiques.
    Code : 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
    $pseudo_multiple = null;
     
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
    try
    {
    	$query = "INSERT INTO membres (pseudo) VALUES(?)"; 
     
    	$stmt = $bdd->prepare($query);
     
    	$stmt->execute(array($_POST['pseudo']));
    }
    catch (PDOException $e)
    {
    	$pseudo_multiple = true;
    }
     
     
    if (isset($pseudo_unique)) echo 'ce pseudo est déjà utilisé';

    Citation Envoy� par Black_Layer Voir le message
    - Derni�re chose, j'ai vu un script de connexion o� il y avait tout le code php, puis tout le code html et ce dans le m�me fichier "inscription.php".

    C'est mieux de travailler avec un seul fichier ou de s�parer les deux ?
    C'est comme tu veux mais on � l'habitude d'essayer de ne pas trop compliquer les choses. Au final, il faut un maximum de lisibilit� pour se rep�rer rapidement dans les scripts. Evidemment plus on entasse de code plus cela devient compliqu�, mais cela d�pend aussi de l'organisation. Ta question pose donc plus g�n�ralement le probl�me de l'organisation du code. Tu peux regarder du c�t� du mod�le MVC qui est un exemple d'organisation de code et que tu peux adapter suivant tes besoins (en reprenant tout ou partie des id�es d�velopp�es). Enfin bon c'est un vaste d�bat.
    Dans ton cas pr�cis et en consid�rant que l'on ne connait rien au mod�le MVC tu vas te poser des questions contradictoires entre redondance de code (si tu emploies deux fichiers totalement distincts) et complexit� du contr�leur : si tu n'as qu'un seul fichier le contr�leur aura pour mission d'utiliser et d'afficher le code suivant la fonctionnalit� demand�e (il peut bien entendu appeler des scripts externes via des "include").
    A toi de voir. En fait sur de petits sites o� il y a peu d'�volution, on se prend g�n�ralement pas trop la t�te et on fait plut�t comme on le sent (souvent au plus rapide et simple). On appr�cie surtout les avantages d'un mod�le bien con�u quand il y a beaucoup de maintenance et d'�volution, autrement le temps de conception/mise en place peut �tre disproportionn� par rapport au besoin final. Cependant certains on leurs habitudes et emploient syst�matiquement un mod�le bien d�fini. Comme je le disais c'est un vaste d�bat.

  14. #14
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Citation Envoy� par ABCIWEB Voir le message
    la mani�re la plus lisible (� mon avis) pour passer des options lors de la connexion est de faire comme dans cette petite classe de connexion
    Les classes et moi, �a fait 4... je vais donc me contenter d'ins�rer la ligne dans connexion.php et je verrai pour les classes plus tard.

    Dois-je rajouter aussi [PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION ou pas ?
    Dans la faq �a dit "�met une exception". Cette exception va-t-elle s'affiche aux yeux de mes utilisateurs ?

    Citation Envoy� par ABCIWEB Voir le message
    D'un autre c�t�, si ta table est bien construite tu devrais avoir le champ "pseudo" en tant que champ unique, ou comme cl� primaire.
    le champ pseudo est effectivement en unique mais je veux effectuer un test avant la tentative d'inscription pour �viter que SQL ne me retourne l'erreur "barbare" 1062 (me disant que le champ est identique � un autre).

    Concernant le mod�le, je vais continuer en MVC car j'ai "appris" � tout s�parer ; c'est plus simple quand il n'y a qu'un petit truc � changer.

    Citation Envoy� par ABCIWEB Voir le message
    Le minimum pour les nouveaux codes aujourd'hui est sha256
    Le mot "minimum" sous-entendrait-il qu'il y a mieux encore ? Si oui, quoi ?

    Merci pour tout le temps que tu me consacres !

  15. #15
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Concernant les options PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION etc. il faut bien prendre conscience qu'elles valent pour toutes la dur�e d'ex�cution du script, * � moins bien s�r de changer leur valeur plus loin dans ton script avec setAttribute (comme montr� dans mes exemples).

    Donc si par exemple du d�clare l'option PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION dans la classe de connexion cit�e plus haut - et qu'on appelle simplement en faisant $bdd = C_PDO::getC(); - cela implique que tu devras g�rer les erreurs avec un bloc try/catch (comme dans mes exemples) pour toutes tes requ�tes (* � moins bien s�r...) Ce n'est g�n�ralement pas un probl�me mais il faut bien s'en souvenir car sinon pour toute erreur tu auras un message d'erreur d�taill� qui commencera par "uncautch exception ..." m�me pour les visiteurs.

  16. #16
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Citation Envoy� par Black_Layer Voir le message
    Les classes et moi, �a fait 4... je vais donc me contenter d'ins�rer la ligne dans connexion.php et je verrai pour les classes plus tard.
    Oui mais en m�me temps elle est d�j� toute faite cette classe. Il suffit juste de lui indiquer le lien vers ton fichier (qui contient les variables de connexion) dans le "require_once" et c'est tout. Et �ventuellement d'ajouter ou supprimer des options de base pour la connexion.
    Pour le reste elle n'a qu'une seule mani�re d'�tre utilis�e c'est de l'appeler en faisant $bdd = C_PDO::getC(); pour avoir la connexion.
    L'avantage est que tu peux l'appeler cinquante fois dans ton script (depuis une fonction, une classe, bref depuis n'importe o� et plusieurs fois dans ton code) et la connexion ne se fera qu'une fois et proprement.

    Citation Envoy� par Black_Layer Voir le message
    Dois-je rajouter aussi [PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION ou pas ?
    Dans la faq �a dit "�met une exception". Cette exception va-t-elle s'affiche aux yeux de mes utilisateurs ?
    Tu n'as pas encore compris ? Quand on utilise ce mode c'est justement pour g�rer les erreurs. Plut�t que d'afficher ou cacher les erreurs le code �met une exception, mais le code continue, et s'il y a une erreur elle sera report�e dans le bloc "catch". Mais on fait bien ce que l'on veut dans le bloc "catch", soit afficher l'erreur en question (ce qui peut �tre utile dans la phase de d�veloppement du site), soit faire tout autre chose...
    Citation Envoy� par Black_Layer Voir le message
    le champ pseudo est effectivement en unique mais je veux effectuer un test avant la tentative d'inscription pour �viter que SQL ne me retourne l'erreur "barbare" 1062 (me disant que le champ est identique � un autre).
    ... et donc si tu fais comme je t'ai montr� avec le bloc try/catch pour l'exemple d'insertion dans ce pr�c�dent message, tu verras qu'en cas de doublon cela ne fait rien d'autre que de passer la variable "$pseudo_multiple" � true, simplement parce que cela nous arrange de faire ainsi. Et le code continue et l'on pourra utiliser "$pseudo_multiple" pour dire que (si on est pass� dans le catch c'est que la requ�te ne fonctionne pas et tr�s probablement d� � un pb doublon) le pseudo est d�j� utilis�.
    Fais des tests !
    Dans l'absolu l'erreur pourrait venir aussi de la table "membres" qui n'existerait pas ou que ta requ�te est mal �crite. Mais bon une fois que ton script est rod�... Cela dit rien ne t'emp�che de faire plusieurs bloc try/catch pour distinguer plus pr�cis�ment les erreurs.

    Citation Envoy� par Black_Layer Voir le message
    Le mot "minimum" sous-entendrait-il qu'il y a mieux encore ? Si oui, quoi ?
    Oui sha512 si tu pr�f�re. Mais bon d�j� sha256 offre des performances normalement suffisantes et puis il ne faut pas croire que cela soit le principal pb de s�curit�. Quelque soit le hashage un mot de passe trop court et commun est mort d'avance.

  17. #17
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Citation Envoy� par ABCIWEB Voir le message
    Il suffit juste de lui indiquer le lien vers ton fichier
    Dans ce cas je vais voir pour la rajouter mais j'aime bien comprendre le code que j'utilise donc je vais tenter de la comprendre compl�tement avant.
    Citation Envoy� par ABCIWEB Voir le message
    dans le "require_once"
    Pourquoi require_once plut�t que require ? dans les faqs, il est dit que require_once n'est appel� qu'une seule fois... mais je ne comprends pas car require aussi !
    Citation Envoy� par ABCIWEB Voir le message
    Tu n'as pas encore compris ?
    Si si, apr�s de multiples relectures, �a y est j'ai compris le syst�me d'exception (d�sol�, j'ai parfois un peu de mal avec les nouveaut�s).
    Citation Envoy� par ABCIWEB Voir le message
    ... et donc si tu fais comme je t'ai montr� avec le bloc try/catch pour l'exemple d'insertion dans ce pr�c�dent message, tu verras qu'en cas de doublon cela ne fait rien d'autre que de passer la variable "$pseudo_multiple" � true, simplement parce que cela nous arrange de faire ainsi. Et le code continue et l'on pourra utiliser "$pseudo_multiple" pour dire que (si on est pass� dans le catch c'est que la requ�te ne fonctionne pas et tr�s probablement d� � un pb doublon) le pseudo est d�j� utilis�.
    Fais des tests !
    Jutement j'en fais des tests et ce qu'on peut dire c'est que je gal�re.
    En effet, si je pratique de la sorte, dans le try, j'ex�cute une requ�te insert sauf que comme justement mon login est en champ unique, �a cr�e dans ma bdd une erreur 1062 Duplicate entry ; ce qui est logique mais du coup �a ne va pas plus loin et �a m'affiche une page blanche (m�me si je mets un echo dans le catch) !!!!

    Pour palier � cel�, j'ai donc envisag� de faire le test avec les fameux select count(*) et fetchColumn ; � savoir que ce test est fait avant l'insert gr�ce jutement au select.
    Le probl�me, c'est que �a ne fonctionne pas non plus !!!
    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
    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
     
    // [...]
    require ("connexion.php");
     
    				 // on recherche si ce login est déjà utilisé par un autre membre
     
    				 	$log_in = $_POST['login'];
    					$reqcount = "SELECT count(*) FROM users WHERE user_login=:log";
    					$sth = $bdd->prepare($reqcount);
    					$sth->bindParam(':log', $log_in);
    					$sth->execute();
     
    					$result = $sth->fetchColumn();
    					//echo $result;
     
    				 //$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'"'; 
     
     
    					 if ($result>0) 
    					 { 
    							$nom = $_POST['name'];
    							$pseudo = $_POST['login'];
    							$motdepasse = $_POST['pass'];
    							$email = $_POST['email'];
    							$localisation = $_POST['location'];
    							$site = $_POST['website']; 
    							$pass = hash("sha256",$motdepasse);
    							$query = 'INSERT INTO users (user_login, user_password, user_email, user_name, user_foundation, user_location, user_website) VALUES (:pseudo, :pass, :email, :nom, now(), :localisation, :site)';
    							$stmt = $bdd->prepare($query);
    							$stmt->bindParam(':pseudo', $pseudo);
    							$stmt->bindParam(':pass', $pass);
    							$stmt->bindParam(':email', $email);
    							$stmt->bindParam(':nom', $nom);
    							$stmt->bindParam(':localisation', $localisation);
    							$stmt->bindParam(':site', $site);
    							$passed = $stmt->execute();
    									if($passed){
    										echo "passed";
    									} 
    									else {
    										echo "failed";
    									} 
    							exit(); 
    					}
    					else 
    					{ 
    						$erreur = 'Un membre possède déjà ce login.'; 
    					} 
    // [...]

    Si je rentre un login existant, ce code retourne... failed !!!
    C'est � s'en arracher les yeux !!

    Citation Envoy� par ABCIWEB Voir le message
    Oui sha512 si tu pr�f�re. Mais bon d�j� sha256 offre des performances normalement suffisantes
    J'avoue, pour le coup la question �tait juste � titre informatif.

    Et tout cas, au risque de me r�p�ter, merci de ton aide ; elle m'est tr�s pr�cieuse !!

  18. #18
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Citation Envoy� par Black_Layer Voir le message
    Pourquoi require_once plut�t que require ? dans les faqs, il est dit que require_once n'est appel� qu'une seule fois... mais je ne comprends pas car require aussi !
    Nan, require_once ne peut �tre appel� qu'une seule fois, require peut �tre appel� plusieurs fois.

    Citation Envoy� par Black_Layer Voir le message
    Jutement j'en fais des tests et ce qu'on peut dire c'est que je gal�re.
    En effet, si je pratique de la sorte, dans le try, j'ex�cute une requ�te insert sauf que comme justement mon login est en champ unique, �a cr�e dans ma bdd une erreur 1062 Duplicate entry ; ce qui est logique mais du coup �a ne va pas plus loin et �a m'affiche une page blanche (m�me si je mets un echo dans le catch) !!!!
    Sans doute que tu as oubli� d'indiquer l'option PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION et dans ce cas les erreurs ne sont pas intercept�es ni g�r�es par le try/catch

    Citation Envoy� par Black_Layer Voir le message
    Pour palier � cel�, j'ai donc envisag� de faire le test avec les fameux select count(*) et fetchColumn ; � savoir que ce test est fait avant l'insert gr�ce jutement au select.
    Le probl�me, c'est que �a ne fonctionne pas non plus !!!
    C'est dans ces cas qu'on utilise echo $e->getMessage(); dans le bloc catch pour avoir plus d'information sur la cause de l'erreur. Ce qui t'aurais sans doute indiqu� "duplicate entry..." en effet c'est si $result == 0 que tu devrais faire l'insertion

    Quand on utilise de nouvelles techniques il faut avoir une page de travail minimaliste pour faire pas mal de test et ensuite on int�gre dans le code final. Si tu vas trop vite en ne faisant pas assez de tests et que tu veux tout de suite tester en situation r�elle tu perdras finalement beaucoup de temps car il sera plus difficile d'isoler les erreurs.
    Par exemple fais des tests avec simplement mes bouts de code dans une page s�par�e puis modifies les options, et triture le code jusqu'� ce que tu aies bien saisi le fonctionnement (sans oublier de consulter la doc et les exemples de la doc concernant les fonctions que tu emploies).

    EDIT : Eventuellement si tu pouvais renommer le titre de ton premier message par "migration de mysql vers pdo" ou quelque chose dans le genre cela me semblerait plus appropri� car pour l'instant on a pas parl� de formulaire d'inscription et le sujet �voqu� est centr� sur le passage vers pdo (je dis cela pour faciliter les recherches des utilisateurs du forum).

  19. #19
    Membre averti
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    Mai 2007
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Par d�faut
    Citation Envoy� par ABCIWEB Voir le message
    Nan, require_once ne peut �tre appel� qu'une seule fois, require peut �tre appel� plusieurs fois.
    L'instruction require_once est identique � require mise � part que PHP v�rifie si le fichier a d�j� �t� inclus et si c'est le cas, ne l'inclut pas une deuxi�me fois.
    Mis � part le cas o� je suis un gros boulet et o� j'�cris donc deux fois l'inclusion d'un m�me fichier, ce cas de figure peut-il se produire autrement ?

    Citation Envoy� par ABCIWEB Voir le message
    Sans doute que tu as oubli� d'indiquer l'option PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION et dans ce cas les erreurs ne sont pas intercept�es ni g�r�es par le try/catch
    Non non, je n'ai pas oubli� ; je ne sais pas ce qui se passe avec mon h�bergeur (one.com) mais d�s que le code dans le try a plant�, il ne va m�me pas au catch (j'ai essay� avec un echo), il m'affiche directement une page blanche !!

    Citation Envoy� par ABCIWEB Voir le message
    C'est dans ces cas qu'on utilise echo $e->getMessage(); [...] en effet c'est si $result == 0 que tu devrais faire l'insertion
    H� ouais, � force de coder jusqu'� 3 heures du matin en recopiant certaines lignes de codes prises sur le net avec la fatigue, on fait n'importe quoi !
    Morale de cette histoire : pensez � dormir

    Citation Envoy� par ABCIWEB Voir le message
    Si tu vas trop vite en ne faisant pas assez de tests et que tu veux tout de suite tester en situation r�elle tu perdras finalement beaucoup de temps car il sera plus difficile d'isoler les erreurs.
    Ayant fait pas mal de d�veloppement lors de mes �tudes (cobol, fortran, c,c++,c#, java, etc), c'est pas moi qui vais dire le contraire.
    Cependant, il est imp�ratif que le site "fini" soit en ligne dans 2 mois et je suis bien loin d'avoir fini (certaines pages sont d�j� pr�tes, j'ai une �bauche de css mais encore pas mal de boulot de codage sur la partie "blog") et c'est pour cette raison que j'essaye de sauter certaines �tapes (parfois � tort comme dans le cas pr�sent, parfois � raison dans d'autres cas non cit�s puisque n'ayant pas pos� de probl�mes).
    Mais sinon, je suis enti�rement d'accord avec toi, je fais ce qu'il ne faut pas faire !

    Citation Envoy� par ABCIWEB Voir le message
    Eventuellement si tu pouvais renommer le titre de ton premier message
    Je l'avais envisag� mais je ne savais pas quoi mettre ; c'est donc chose faite.

    Citation Envoy� par ABCIWEB Voir le message
    Concernant les options PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION etc. il faut bien prendre conscience qu'elles valent pour toutes la dur�e d'ex�cution du script, * � moins bien s�r de changer leur valeur plus loin dans ton script avec setAttribute (comme montr� dans mes exemples).

    Donc si par exemple du d�clare l'option PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION dans la classe de connexion cit�e plus haut - et qu'on appelle simplement en faisant $bdd = C_PDO::getC(); - cela implique que tu devras g�rer les erreurs avec un bloc try/catch (comme dans mes exemples) pour toutes tes requ�tes (* � moins bien s�r...) Ce n'est g�n�ralement pas un probl�me mais il faut bien s'en souvenir car sinon pour toute erreur tu auras un message d'erreur d�taill� qui commencera par "uncautch exception ..." m�me pour les visiteurs.
    Du coup cette id�e qui me semblait g�niale le para�t un peu moins.
    Non pas que je ne sois pas capable de mettre un try/catch, mais que je pourrais oublier par-ci par-l� et �a ne serait pas propre !!

  20. #20
    Expert confirm�

    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par d�faut
    Citation Envoy� par Black_Layer Voir le message
    Du coup cette id�e qui me semblait g�niale le para�t un peu moins.
    Non pas que je ne sois pas capable de mettre un try/catch, mais que je pourrais oublier par-ci par-l� et �a ne serait pas propre !!
    Bah oui et en m�me temps c'est pas propre � cette option. A la base on d�fini les options qui sont sens�es nous servir le plus souvent et ensuite on emploie setAttibute au coup par coup suivant des besoins sp�cifiques. Si tu utilises principalement le mode "exception" et que tu l'a configur� dans ta connexion, rien ne t'emp�che par la suite de faire � tout moment
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    pour revenir � la configuration de pdo par d�faut.

    T'as bien fait de passer � pdo. Non seulement parce que l'extension mysql sera obsol�te en php5.5, mais en plus � l'usage pdo est plus agr�able � �crire et accessoirement plus portable

Discussions similaires

  1. migration de mysql vers postgresql
    Par ANISSS dans le forum PostgreSQL
    R�ponses: 6
    Dernier message: 18/05/2007, 15h19
  2. R�ponses: 3
    Dernier message: 08/03/2007, 10h53
  3. Migration de Mysql vers Sql Server
    Par bluecurve dans le forum MS SQL Server
    R�ponses: 1
    Dernier message: 06/02/2007, 00h21
  4. Re besoin de vous pour migration de mysql vers dsl server
    Par scaleo dans le forum MS SQL Server
    R�ponses: 4
    Dernier message: 07/11/2006, 13h45
  5. [SGBD] Migration de mysql vers PostgreSQL ?
    Par haffouff dans le forum SQL Proc�dural
    R�ponses: 12
    Dernier message: 25/05/2006, 15h29

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