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 :

requête php sur base champ booléen MySQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut requête php sur base champ booléen MySQL
    Bonjour,
    Désolée, je me suis trompée de forum, j'ai posé dans mysql. Donc je reposte ici...
    Voilà mon soucis:
    J'ai une base de données en mySQL gérée par phpmyadmin.
    Je code en php le traitement du site.
    Dans ma base j'ai une table tGroupeutilisateur qui fournit des indications sur les droits des utilisateurs. Dans cette table, j'ai les droits qui sont sont forme de booléens. Au départ jamais mis des tinyint(1). Mais quand je faisais une requête directement dans phpmyadmin
    je recevais la valeur 'admin' comme réponse. Voici la requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'admin' FROM 'tGroupeutilisateur' WHERE id =1
    Depuis que j'ai changé le type de champs en bit, cette même requête me renvoie à présent la bonne valeur, à savoir 1.
    Par contre avec mon code php, la valeur renvoyée et toujours le nom du champs et pas sa valeur. Voici mon 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
     
    // récupère de la clé du groupe utilisateur
     $req_cle = $bdd_pdo->query("SELECT tGroupeutilisateur_id AS idgroupe FROM tUtilisateur WHERE identifiant ='" .$identifiant. "' AND motdepasse ='" .$motdepasse."'") or die(print_r($bdd_pdo->errorInfo()));
    $data =$req_cle->fetch();
    $req_cle->closeCursor();
     
    // récupère de les droits dans la table groupe utilisateur
     if($data['idgroupe'])
    {
    	$idgroupe=$data['idgroupe'];
    	$req_droit=$bdd_pdo->query("SELECT '" .$droit. "' AS valdroit FROM tGroupeutilisateur WHERE id ='" .$idgroupe. "'") or die(print_r($bdd_pdo->errorInfo()));
    	$val_droit =$req_droit->fetch();
    	$req_droit->closeCursor();
    	// si le droit est ok retourne vrai
    	echo $val_droit['valdroit'];
    	return $val_droit['valdroit'];
    }
    Dans ce code, la valeur de idgroupe est bien 1 et la valeur de la variable $droit est bien 'admin'. Par contre, le echo m'affiche 'admin' et pas 1.
    Et du coup le return est toujours ok, même quand la valeur de 'admin' est à 0.
    Je pense à un problème de type de variable passée dans la requête (idGroupe qui est un entier et que je passe en chaine de caractère par exemple). Mais je ne sais pas comment gérer et je ne suis pas sure que le problème vienne bien de là.
    Quelqu'un aurait-il une idée, s'il vous plait?

    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il ne faut pas de guillemets.
    C'est
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `admin` FROM `tGroupeutilisateur` WHERE id =1
    ou
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT admin FROM tGroupeutilisateur WHERE id =1
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    En fait c'est une mauvaise recopie, je n'avais pas mis de guillemet et cette requête fonctionne maintenant sous phpmyadmin. Par contre sous php dans mon code, c'est là que ça me renvoie encore le nom du champ à la place de sa valeur.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu as pensé à retirer aussi les guillemets de la requête dans PHP ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req_droit=$bdd_pdo->query("SELECT '" .$droit. "' AS valdroit FROM tGroupeutilisateur WHERE id ='" .$idgroupe. "'") or die(print_r($bdd_pdo->errorInfo()));
    $val_droit =$req_droit->fetch();
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Alors j'ai fait plusieurs tests, mais aucun ne fonctionne. Je suis parti du principe que les variables de type char (identifiant, mot de passe et droit) n'avaient pas besoin de quote dans ma requête, à savoir le code suivant:
    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
     
    // récupère de la clé du groupe utilisateur
    $req_cle = $bdd_pdo->query("SELECT tGroupeutilisateur_id AS idgroupe FROM tUtilisateur WHERE identifiant =" .$identifiant. " AND motdepasse =" .$motdepasse) or die(print_r($bdd_pdo->errorInfo()));
    $data =$req_cle->fetch();
    $req_cle->closeCursor();
     
    // récupère de les droits dans la table groupe utilisateur
    if($data['idgroupe'])
    {
    	$idgroupe=$data['idgroupe'];
    	$req_droit=$bdd_pdo->query("SELECT " .$droit. " AS valdroit FROM tGroupeutilisateur WHERE id =" .$idgroupe) or die(print_r($bdd_pdo->errorInfo()));
    	$val_droit =$req_droit->fetch();
    	$req_droit->closeCursor();
     }
    là il me marque l'erreur suivante:
    Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'maud' in 'where clause' )
    sachant que maud est bien un identifiant existant dans ma table tUtilisateur...

    J'ai aussi testé ceci: (rajout des guillemets seulement pour les valeurs du where)
    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
     
    // récupère de la clé du groupe utilisateur
    $req_cle = $bdd_pdo->query("SELECT tGroupeutilisateur_id AS idgroupe FROM tUtilisateur WHERE identifiant ='" .$identifiant. "' AND motdepasse ='" .$motdepasse."'") or die(print_r($bdd_pdo->errorInfo()));
    $data =$req_cle->fetch();
    $req_cle->closeCursor();
     
    // récupère de les droits dans la table groupe utilisateur
    if($data['idgroupe'])
    {
    	$idgroupe=$data['idgroupe'];
    	$req_droit=$bdd_pdo->query("SELECT " .$droit. " AS valdroit FROM tGroupeutilisateur WHERE id =" .$idgroupe) or die(print_r($bdd_pdo->errorInfo()));
    	$val_droit =$req_droit->fetch();
    	$req_droit->closeCursor();
     }
    et là il m'indique que la valeur du champ est nulle alors qu'elle est à 1.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    e suis parti du principe que les variables de type char (identifiant, mot de passe et droit) n'avaient pas besoin de quote dans ma requête
    comme en PHP, en SQL les chaines sont encadrées.

    et là il m'indique que la valeur du champ est nulle alors qu'elle est à 1.
    Comment fais-tu ce contrôle ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Je fais un affichage un return traité par la fonction appelante.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $val_droit['valdroit'];
    return $val_droit['valdroit'];

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le echo te donne "NULL" ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Non, le echo me renvoie une chaine vide.
    Et le return est traité par un if qui le considère comme faux.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Chaine vide, FALSE, NULL ... fait un var_dump pour en avoir le coeur net.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Le var_dump me renvoie ceci:
    array(2) { ["valdroit"]=> string(1) "" [0]=> string(1) "" }
    La valeur du champ de type bit dans la base est normalement de 1.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut faire un peu de debugage de base : affiche tes deux chaines de requete pour voir ce que tu executes exactement.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Alors pour y voir plus clair j'ai modifié ma double requête en jointure.
    Le résultat obtenu est toujours le même (0), alors que la même requête dans phpmyadmin donne le bon résultat (1).
    Voici mon nouveau code:
    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
     
    function a_droit($droit, $identifiant)
    {
    	// récupération des informations de la bdd 
    	$Bddhost='localhost';
    	$Bddnom='dbBecheAMelle';
    	$Bddlogin='root';
    	$Bddmotdepasse='admin';
     
    	try
    	{
    		// ouvre la base de donnée en créant un objet type PDO
    		$bdd_pdo = new PDO('mysql:host='.$Bddhost.';dbname='.$Bddnom, $Bddlogin, $Bddmotdepasse);
    	}
    	catch (Exception $e)
    	{
    		die('Erreur : ' . $e->getMessage());
    	}
     
    	$req_droit=$bdd_pdo->query("SELECT admin FROM tGroupeutilisateur G
    								INNER JOIN tUtilisateur U ON G.id = U.tGroupeutilisateur_id
    								WHERE U.identifiant ='maud'") or die(print_r($bdd_pdo->errorInfo()));
    	$val_droit =$req_droit->fetch();
    	$bin_char = base_convert($val_droit['valdroit'], 16,2);
    	var_dump($bin_char);
    	$req_droit->closeCursor();
    	return $bin_char;	
    }
    J'ai même poussé jusqu'à faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	$req_droit=$bdd_pdo->query("SELECT `admin`
    FROM `tGroupeutilisateur`
    INNER JOIN `tUtilisateur` ON `tGroupeutilisateur`.`id` = `tUtilisateur`.`tGroupeutilisateur_id`
    WHERE `tUtilisateur`.`identifiant` = 'maud'
    ") or die(print_r($bdd_pdo->errorInfo()));
    	$val_droit =$req_droit->fetch();
    	$bin_char = base_convert($val_droit['valdroit'], 16,2);
    	var_dump($bin_char);
    	$req_droit->closeCursor();
    le résultat du var_dump ne varie pas du tout lui:
    string(1) "0"

    la requête suivante (identique puisqu'il s'agit d'un copier/coller) dans phpmyadmin:
    Code mysql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT `admin`
    FROM `tGroupeutilisateur`
    INNER JOIN `tUtilisateur` ON `tGroupeutilisateur`.`id` = `tUtilisateur`.`tGroupeutilisateur_id`
    WHERE `tUtilisateur`.`identifiant` = 'maud'

    me donne le résultat suivant:
    admin
    1

    Je n'y comprends rien...

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    on a posté en même temps...
    Par contre je ne comprends pas trop ce que tu me demandes de faire...

    Afficher les résultats des requêtes ou seulement la chaîne de caractère envoyée comme requête?

    J'ai déjà affiché le résultat de la première requête tout était bon.
    Et maintenant avec la jointure, vu que c'est du copier/coller d'une requête qui fonctionne sous phpmyadmin, je ne vois pas trop ce que je peux tester de plus...

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    valdroit n'est pas ton SELECT dans ton test.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $val_droit =$req_droit->fetch();
    $bin_char = base_convert($val_droit['admin'], 16,2);
    var_dump($val_droit);
    $req_droit->closeCursor();
    return $bin_char;
    J'ai modifié mon code pour avoir le bon champs.
    Et le var_dump m'affiche toujours:
    array(2) { ["admin"]=> string(1) "" [0]=> string(1) "" }

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi tu ne regardes pas directement ce que veut $val_droit ?
    Quand on debug il faut regarder le début.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 47
    Points
    47
    Par défaut
    alors ça y est, j'ai trouvé.
    Je suis retournée farfouiller dans la bdd, et j'ai remis les champs en tinyint.
    Et là, direct, ça me renvoie le bon résultat.

    Merci pour votre aide en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requête linq sur base se données MySql
    Par fripon76 dans le forum Linq
    Réponses: 1
    Dernier message: 02/09/2010, 09h43
  2. [MySQL] Requête pour vérifier base de donné Mysql en php
    Par srab2pac dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/06/2008, 09h48
  3. requêtes SQL sur base MySQL
    Par khaled_dev dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/01/2008, 21h27
  4. requête condition sur plusieurs champs
    Par grinder59 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/02/2007, 13h52
  5. requête max sur plusieurs champs
    Par logica dans le forum Access
    Réponses: 3
    Dernier message: 28/03/2006, 16h31

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