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

PHP & Base de données Discussion :

Connexion et passage de paramètres


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Par défaut Connexion et passage de paramètres
    Bonjour à toutes et à tous,

    Je viens du monde merveilleux de delphi, et m'intéresse à PHP, car je vais bientôt devoir utiliser ce langage. Après plusieurs essais, je voulais avoir quelques éclaircissements de la part d'une communauté rompu à ce genre d'exercices, donc voilà mes petites questions :

    I-) Connexion à la base de données :
    ===========================

    En utilisant l'API MySQL, il y a en gros deux modes de connexion, non persistant (mysql_connect) et persistant (mysql_pconnect). Dans les deux cas on est obligé de fournir le nom d'utilisateur et le mot de passe.

    • Dans le cas d'une connexion non persistante, quel est le meilleur moyen de stocker le nom d'utilisateur et le mot de passe après une première identification, puisque à chaque nouvelle page, on est obligé de se reconnecter à la base.

    • Dans le cas d'une connexion persistante, est on obligé à chaque script d'une nouvelle page d'insérer à nouveau la commande de connexion (à savoir mysql_pconnect(....)) ? Au quel cas, je retombe sur mon problème de nom d'utilisateur / mot de passe. Si ce n'est pas le cas, quelqu'un aurait il un exemple de code ?


    II-) Requête MySQL et passage de paramètres :
    ====================================

    J'ai passé plusieurs heures à me demander pourquoi une requête ne me retournai aucune valeur, malgré la formulation correcte de celle-ci. Je me suis finalement aperçu que cela provenait de la manière de passer les paramètres. Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $idclient = $_GET['idclient']; // récupéré dans l'url
    $qrinfosclient="SELECT * FROM clients WHERE clients.IdClient = '$idclient'"; //IdClient est alpha numérqiue !
    $resultinfosclient=mysql_query($qrinfosclient);
     
    $infos=mysql_fetch_object($resultinfosclient);
    /* ....etc... */
    La requête ne renvoi aucune valeur, cependant si j'ajoute simplement une visualisation de la requête et cas d'enregistrement vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (mysql_fetch_row($resultinfosclient) <= 0)
      {
        die($qrinfosclient);
      }
    j'obtiens une magnifique requête tout à fait conforme au SQL de MySQL, qui plus est, il suffit de copier et de coller celle-ci dans un éditeur de requête, pour qu'elle renvoi bien des données que j'attendais.

    Après plusieurs essais, le code suivant fonctionne pour remplacer les paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $idclient = $_GET['idclient']; // récupéré dans l'url
    $qrinfosclient='SELECT * FROM clients WHERE clients.IdClient = \''.$idclient.'\''; //IdClient est alpha numérqiue !
    $resultinfosclient=mysql_query($qrinfosclient);
     
    $infos=mysql_fetch_object($resultinfosclient);
    /* ....etc... */
    Cela ne m'arrange guère car je trouve l'autre écriture nettement plus clair et moins lourde à mettre en œuvre !

    Quelqu'un pourrait me dire pourquoi la première solution ne fonctionne pas? Car sur les différents sites visités, dont les tutos et FAQ de développez.net, les deux syntaxes sont utilisées.

    D'avance merci pour vos réponses.

    Bonne journée.

    Sined.

  2. #2
    Membre confirmé Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut il sufft de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $qrinfosclient="SELECT * FROM clients WHERE IdClient = '$idclient' ";
    $resultinfosclient=mysql_query($qrinfosclient) or die ( requette invalaide) ;
     
    etc ...
    Initule à mon sens de préciser la table quand la requete ne porte que sur une seule table .

    le SELECT recherche les données,
    la seconde instruction permet de les charger,
    même la section ' or die... ' n'est pas indispensable.

    nimbus

  3. #3
    Membre expérimenté Avatar de chtipitou
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 175
    Par défaut
    Citation Envoyé par dnode57 Voir le message
    • Dans le cas d'une connexion non persistante, quel est le meilleur moyen de stocker le nom d'utilisateur et le mot de passe après une première identification, puisque à chaque nouvelle page, on est obligé de se reconnecter à la base.

    • Dans le cas d'une connexion persistante, est on obligé à chaque script d'une nouvelle page d'insérer à nouveau la commande de connexion (à savoir mysql_pconnect(....)) ? Au quel cas, je retombe sur mon problème de nom d'utilisateur / mot de passe. Si ce n'est pas le cas, quelqu'un aurait il un exemple de code ?
    Bonjour dnode57,


    pour ce qui est de la problematique sur les connexion non persistante et les login.

    Une des facon de faire, et je pense la plus utilisée et de verfier une fois la conformite du couple login/mot de passe (avec ta requette).

    A partir de la, tu peux setter une variable de session (sorte de variable globale limitee dans le temps uniquement, et non pas sur une page)

    Pour un niveau de securite plus eleve et pour eviter le vol de session, il ya plusieurs techniques mais c'est un autre probleme.

    Donc en bref, tu ne fais ta requette, qu'au moment du login, une fois loggé c'est la session qui prend le relai.

    Les connexion persistante, je ne les utilise que rarement, mais jamais pour juste un login, les sessions sont la pour ca.



    Finalement pour la syntaxe de tes requetes, c'est enervant, la facon de debugger mes requetes et d'afficher la requete avant le mysql_query().
    c'est plus simple pour corriger les erreurs de syntaxe.



    Sur ce, bon courage dans tes debuts de PHP

  4. #4
    Membre expérimenté Avatar de chtipitou
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 175
    Par défaut
    Citation Envoyé par nimbus_77 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $qrinfosclient="SELECT * FROM clients WHERE IdClient = '$idclient' ";
    $resultinfosclient=mysql_query($qrinfosclient) or die ( requette invalaide) ;
     
    etc ...
    Initule à mon sens de préciser la table quand la requete ne porte que sur une seule table .

    le SELECT recherche les données,
    la seconde instruction permet de les charger,
    même la section ' or die... ' n'est pas indispensable.

    nimbus
    utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    or die('Erreur : '.mysql_error());

  5. #5
    Membre confirmé Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut oui en débogage ...
    d'accord en phase de débogage, par contre je n'aime pas rendre publique les erreurs de mon serveur.

    Je libelle mon message d'erreur pour me permettre de situer rapidemment le problème, très utile en cas de fonctions imbriquées...

    J'ai tjrs un accès direct sur ma console et mysql en direct me répond clairement ...

    Merci bien sur de cette précision.

    nimbus

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 70
    Par défaut Merci pour les réponses....
    Re bonjour,

    Tout d'abord merci pour toutes ces réponses, notamment concernant les sessions, je me doutais un peu qu'il fallait les utiliser, cependant il va falloir que je creuse cette histoire de "vol de session", les variables globales pour stocker des login humm............, je n'ai jamais procédé ainsi.

    Sinon concernant les query SQL, ce n'est pas tant l'explication d'un query ou d'une fonction qui m'intéresse, mais la syntaxe à utiliser pour passer des paramètres à une requête SQL à l'aide de PHP.

    La concaténation de chaines de caractère dans le cas de requête plus complexe est pénible à faire, qui plus est,l'accumulation de symbole d'échappement et de guillemets rend très vite le code illisible, et je ne parle pas du débogage ! Si quelqu'un a une autre solution que la concaténation je suis preneur.

    Concernant la fonction die, elle n'était là que pour m'afficher la requête en théorie envoyée à MySQL.

    Merci à tous et à bientôt.

    Sined.

  7. #7
    Membre confirmé Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut A propos des sessions
    Pour pallier aux problèmes de confidentialité j'enregistre au moment du login (et entre autre ) l' IP de l'authentification, chaque page contrôle au moment de son accès :

    1) l'existence même de la session
    2) l'identité de l'IP actuelle et de celle de l'enregistrement
    3) la validité de la durée de session
    ( 3 mn chez moi réinitialisée à chaque ouverture de page )
    4) les droits du visiteur à afficher cette page.

    Il s'agit d'une fonction que j'appelle à chaque page.
    C'est un peu lourd peut être, mais j'ai pour ma part besoin de confidentialité.

    Voici mon script, s'il peut te donner un aperçu, il est surement imparfait, cependant il fonctionne parfaitement depuis plusieurs mois .

    N"hésitez pas à critiquer non plus

    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
    50
    51
     
    function controle($droit,$id_session,$page)
    {
    connexion();
    // vérification de l'existence de la session//
    	$reQ_session="SELECT login,qualite,PF_user,ip,date_passage FROM dls_sess_log where id_session='$id_session'";
    	$result_reQ=mysql_query($reQ_session) or die ('reQ_session invalide');
    if(mysql_num_rows($result_reQ)==0)
    		{
    		header('Location:http://.........................../protec/erreur.php');exit;
    		}
    	elseif(mysql_num_rows($result_reQ) > 0) 
    		{
    		$qualite=mysql_result($result_reQ,$i,'qualite');
    		$PF_user=mysql_result($result_reQ,$i,'PF_user');
    		$ip=mysql_result($result_reQ,$i,'ip');
    		$date_passage=mysql_result($result_reQ,$i,'date_passage');
    		$login=mysql_result($result_reQ,$i,'login');
    		}
    // vérification de l'adresse IP //
    if($ip != $_SERVER ['REMOTE_ADDR'])
    		{
    		header('Location:http://............................../protec/erreur.php');exit;
    		}
    	elseif($ip == $_SERVER ['REMOTE_ADDR'])
    		{}
    // vérification de la duree de la sessino //
    $entree = substr($date_passage,-2) + '12';
    $moment = (Date ('i'));
    if( $entree < $moment  )
    	{
    	header('Location:http://................................protec/hors_temps.php');exit; 
    	}
    	elseif($entree > $moment)
    		{
    // update de la duree de session //
    		$trace = Date ('j.m.Y.H.i');
    		$update_entree ="UPDATE dls_sess_log SET date_passage='$trace' WHERE id_session='$id_session'";
    		$result_reQ=mysql_query($update_entree) or die ('update_entree invalide');
    		}
    // vérification d'ouverture des droits sur la pae //			
    if($qualite < $droit)
    		{
    		$reQ_qualite = "INSERT INTO dls_error_droit ( login,PF_user,qualite,requis,page ) VALUES ('$login', '$PF_user', '$qualite',$droit, '$page' )";
           		$result_reQ_qualite = mysql_query ($reQ_qualite) or die ('NON log erreur qualite');
    		header('Location:.........................../protec/non_droit.php');exit;
    		}
    	elseif($qualite > '$droit')
    		{}	
    }
    ?>
    nimbus

  8. #8
    Membre expérimenté Avatar de chtipitou
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 175
    Par défaut
    Citation Envoyé par nimbus_77 Voir le message
    Pour pallier aux problèmes de confidentialité j'enregistre au moment du login (et entre autre ) l' IP de l'authentification, chaque page contrôle au moment de son accès :

    1) l'existence même de la session
    2) l'identité de l'IP actuelle et de celle de l'enregistrement
    3) la validité de la durée de session
    ( 3 mn chez moi réinitialisée à chaque ouverture de page )
    4) les droits du visiteur à afficher cette page.

    Il s'agit d'une fonction que j'appelle à chaque page.
    C'est un peu lourd peut être, mais j'ai pour ma part besoin de confidentialité.

    Voici mon script, s'il peut te donner un aperçu, il est surement imparfait, cependant il fonctionne parfaitement depuis plusieurs mois .

    N"hésitez pas à critiquer non plus

    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
    50
    51
     
    function controle($droit,$id_session,$page)
    {
    connexion();
    // vérification de l'existence de la session//
    	$reQ_session="SELECT login,qualite,PF_user,ip,date_passage FROM dls_sess_log where id_session='$id_session'";
    	$result_reQ=mysql_query($reQ_session) or die ('reQ_session invalide');
    if(mysql_num_rows($result_reQ)==0)
    		{
    		header('Location:http://.........................../protec/erreur.php');exit;
    		}
    	elseif(mysql_num_rows($result_reQ) > 0) 
    		{
    		$qualite=mysql_result($result_reQ,$i,'qualite');
    		$PF_user=mysql_result($result_reQ,$i,'PF_user');
    		$ip=mysql_result($result_reQ,$i,'ip');
    		$date_passage=mysql_result($result_reQ,$i,'date_passage');
    		$login=mysql_result($result_reQ,$i,'login');
    		}
    // vérification de l'adresse IP //
    if($ip != $_SERVER ['REMOTE_ADDR'])
    		{
    		header('Location:http://............................../protec/erreur.php');exit;
    		}
    	elseif($ip == $_SERVER ['REMOTE_ADDR'])
    		{}
    // vérification de la duree de la sessino //
    $entree = substr($date_passage,-2) + '12';
    $moment = (Date ('i'));
    if( $entree < $moment  )
    	{
    	header('Location:http://................................protec/hors_temps.php');exit; 
    	}
    	elseif($entree > $moment)
    		{
    // update de la duree de session //
    		$trace = Date ('j.m.Y.H.i');
    		$update_entree ="UPDATE dls_sess_log SET date_passage='$trace' WHERE id_session='$id_session'";
    		$result_reQ=mysql_query($update_entree) or die ('update_entree invalide');
    		}
    // vérification d'ouverture des droits sur la pae //			
    if($qualite < $droit)
    		{
    		$reQ_qualite = "INSERT INTO dls_error_droit ( login,PF_user,qualite,requis,page ) VALUES ('$login', '$PF_user', '$qualite',$droit, '$page' )";
           		$result_reQ_qualite = mysql_query ($reQ_qualite) or die ('NON log erreur qualite');
    		header('Location:.........................../protec/non_droit.php');exit;
    		}
    	elseif($qualite > '$droit')
    		{}	
    }
    ?>
    nimbus
    Ta solution me semble sufisante niveau securite, on ne protege pas non ples bijoux de la reine


    juste un peu de perfectionnisme
    j'avoue j'ai ete voir la doc php pour
    je ne conaissait pas, et premiere chose que je vois
    When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than mysql_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.
    vu que les id de session sont senssé entre unique pourquoi pas un sur le select et un seul fetch_array avant d'acceder aux valeurs du tableau

    a peu pres comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    elseif($therow = mysql_fetch_array($result_reQ)) 
    		{
     
    		$qualite=$therow['qualite'];
    		$PF_user=$therow['PF_user'];
    		$ip=$therow['ip'];
    		$date_passage=$therow['date_passage'];
    		$login=$therow['login'];
    		}
    ca evite de reparcourir le flux de la reponse sql a chaque appel de variable

  9. #9
    Membre confirmé Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut oups
    même pas relu ce passage ... c'est un de mes premiers codes ...

    je vais réviser cela, c'est effectivement pas propre.

    merci de tes precisions

Discussions similaires

  1. [XL-2013] Passage de paramètre sur connexion SQL
    Par PrinceCorwin dans le forum Excel
    Réponses: 0
    Dernier message: 11/06/2014, 10h15
  2. Réponses: 1
    Dernier message: 14/04/2007, 15h17
  3. Réponses: 1
    Dernier message: 30/05/2006, 17h22
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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