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 :

Comportement double pour requête en mysqli


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut Comportement double pour requête en mysqli
    Bonjour à tous.
    je n'arrive pas à savoir pourquoi la requête fonctionne pour un query simple et non pour un query complex.
    voici le code:
    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
     
     $login = isset($_POST['login']) ? $_POST['login'] : '';
        $password = isset($_POST['password']) ? $_POST['password'] : '';
     
        $var = (int)$login;
    // on se connecte à MySQL et on sélectionne la base
        $conn = mysqli_connect('localhost', 'root', '', 'optique');
     
        // On créé la requête
        //$req="SELECT login, password FROM jeux_video WHERE login =.'.$var.'. AND password LIKE .'.$password.'";  *** cela ne marche pas  ***
        *** message qui s'affiche Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given    ***
     
        $req = "SELECT login, password FROM jeux_video";    *** cela marche  ***
     
        // on envoie la requête
        $res = $conn->query($req);
     
        // on va scanner tous les tuples un par un
        echo "<table>";
        while ($data = mysqli_fetch_array($res)) {
            // on affiche les résultats
            echo "<tr><td>".$data['login']."</td><td>".$data['password']."</td></tr>";
        }
        echo "</table>";
     
        // on ferme la connexion
        mysqli_close($conn);
    Comment faire fonctionner la requête qui ne marche pas ?

    Merci à tous.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu devrais remplacer
    // On créé la requête
    par
    // On créé une faille de sécurité
    Non mais où t'as vu qu'on pouvait se rapprocher du mot de passe pour se connecter ?
    Essaie encore, ah ben non pas besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req="SELECT login, password FROM jeux_video WHERE login =.'.$var.'. AND password LIKE .'.$password.'";
    un LIKE dans un test de mot de passe !!
    Heureusement que la requête ne fonctionne pas !! OUF

  3. #3
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Merci pour la réponse dégueulasse alors que je reprenais le php après des années..Redescends de ton trône dieu. En plus ta requête ne fonctionne même pas.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    enfin !!! merci pour la comparaison flatteuse mais sur ce coup je préfère passer mon tour.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Points : 104
    Points
    104
    Par défaut
    je rencontré ce genre d'erreur. Et j'ai constaté que lorsqu'on utilise une boucle WHILE pour afficher un résultat il faut se rassurer que la requête va renvoyer au moins un résultat. Donc assure toi que les valeurs de $var et $password que tu récupère appartiennent à une ligne de ta table jeux_video. A ta place je vais faire des echo pour afficher les valeurs de $var et $password pour se rassurer.

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 844
    Points
    4 844
    Par défaut
    Salut,

    Je me permets d'intervenir, @rawsrc voulait te dire que la requête n'est plus sécurisée parce que tu ouvres une faille de sécurité en comparant le mot de passe avec un like.

    Puis cette ligne est fausse :
    parce que tu convertis la valeur de la variable $login en entier, ce qui n'est pas juste !

    La requête doit être comme ça :
    • (style procédural) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req="SELECT login, password FROM jeux_video WHERE login =".mysqli_real_escape_string($conn,$var)." AND password = ".$password;
    mysqli_query($conn,$req);
    ...
    • (style orienté objet) en préparant la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      $req="SELECT login, password FROM jeux_video WHERE login =? AND password = ?";
      $res=$conn->prepare($req);
      $res->bind_param("ss",$var,$password);
      $res->execute();
      $data=$res->get_result();
      while($dt=$data->fetch_assoc()){//affichage des données.
    	echo "login :".$dt["login"].", password :".$dt["password"];
      }
      ...
    Comme il est important aussi de crypter le mot de passe avec un password_hash puis le vérifier avec password_verify.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    ...la requête doit être comme ça :...
    Euhh, là, Toufik83, tu aurais dû t'abstenir...

  8. #8
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 407
    Points : 4 844
    Points
    4 844
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Euhh, là, Toufik83, tu aurais dû t'abstenir...
    quel est le problème avec la requête jreaux62 ? l'absence de mysqli_real_escape_string ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Oui, entre autre... (petit coquin ! Tu as supprimé htmlspecialchars de ton précédent message !)
    AU MINIMUM utiliser mysqli_real_escape_string(), OU MIEUX : une requête préparée.


    Mot de passe, en PHP :

    1- INSCRIPTION - Lorsqu'on CRÉE un nouvel utilisateur :
    • on utilise password_hash() avant de l'enregistrer en BDD.
      On obtient un mot de passe hashé, car on N'enregistre JAMAIS le mot de passe "en clair" !!

    2- CONNEXION - Quand l'utilisateur se connecte :
    • il entre son login et mot de passe (en clair)
    • on requête en BDD pour trouver le login ("SELECT mdp WHERE login = ...")
    • on compare le mot de passe (en clair) avec celui en BDD (hashé) grâce à password_verify()

Discussions similaires

  1. [AC-2007] Requête - Compter valeurs à double pour même identifiant
    Par skippy86 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/10/2012, 17h30
  2. Réponses: 11
    Dernier message: 11/09/2008, 19h14
  3. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27
  4. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39
  5. Aide pour Requête
    Par Guiche dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/11/2003, 20h18

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