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 qui refuse de passer [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut Requête qui refuse de passer
    Bonsoir,
    je conçois une petite application. Je n'ai pas voulu m'embêter pour la gestion des utilisateurs et j'ai décidé simplement pour chaque utilisateur, de le créer dans mysql en lui donnant les droits qu'il faut sur la base de données. Mais voici ce que ma fonction génère une erreur et je suis bloquée:
    Fonction:
    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
    function creation_user($profiluser, $log, $pas) {
    	$requete = "GRANT SELECT , INSERT , UPDATE , DELETE ON 'bd_getir'.* TO '$log'@'%' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0";
    	$result = mysql_query($requete);
    	if (!$result) {
    	$message = 'Erreur SQL : ' . mysql_error() . "<br>\n";
    	$message .= 'SQL string : ' . $requete . "<br>\n";
    	$message .= 'SQL string : ' . $_SESSION['profuser'] . "<br>\n";
    	$message .= 'SQL string : ' . $_SESSION['matruser'] . "<br>\n";
    	$message .= 'SQL string : ' . $_SESSION['passuser'] . "<br>\n";
    	$message .= "Merci d'envoyer ce message au webmaster";
    	die($message);
    	}
    
    	$requete = 'SET PASSWORD FOR '.$log.'@'%' = PASSWORD('.$pas.');';
    	$result = mysql_query($requete);
    	if (!$result) {
    	$message = 'Erreur SQL : ' . mysql_error() . "<br>\n";
    	die($message);
    	}
    
    	switch ($profiluser) {
    		case 'public':
    			$requete = 'GRANT SELECT ON `bd_getir` . * TO '.$log.'@'%';';
    			break;
    
    		case 'gestionnaire':
    			$requete = 'GRANT SELECT , INSERT , UPDATE ON `bd_getir` . * TO '.$log.'@'%';';
    			break;
    
    		case 'super utilisateur': //ce profil a le menu qui lui permet de gérer des utilisateurs
    			$requete = 'GRANT SELECT , INSERT , UPDATE, DELETE ON `bd_getir` . * TO '.$log.'@'%';';
    			break;
    	}
    	$result = mysql_query($requete);
    	if (!$result) {
    	$message = 'Erreur SQL : ' . mysql_error() . "<br>\n";
    	die($message);
    	}
    }
    Voici l'erreur:
    Warning: mysql_query(): Access denied for user 'ODBC'@'localhost' (using password: NO) in c:\program files\easyphp1-8\www\getir\mes_fonctions.php on line 136

    Warning: mysql_query(): A link to the server could not be established in c:\program files\easyphp1-8\www\getir\mes_fonctions.php on line 136
    Erreur SQL : Access denied for user 'ODBC'@'localhost' (using password: NO)
    SQL string : GRANT SELECT , INSERT , UPDATE , DELETE ON 'bd_getir'.* TO 'test'@'%' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0
    SQL string : public
    SQL string : test
    SQL string : test
    Merci d'envoyer ce message au webmaster
    NB: la ligne 136 ou l'erreur est signalée est marquée en rouge et en gras dans la fonction. Bien sûr, c'est la requête avant qui génère l'erreur. Je l'ai pourtant remplacée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	$requete = 'GRANT SELECT , INSERT , UPDATE , DELETE ON *.* TO `'.$log.'`@`%` WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0';
    L'erreur demeure toujours. La même et à la même ligne.

    Comme on peut bien le constater, les variables de session fonctionne correctement et retourne l'utilisateur TEST et son mot de passe TEST ainsi que son profil PUBLIC.

    Tout ce que je veux faire, c'est de le créer dans la base avec la fonction plus hat mais ça ne passe pas.

    Merci pour votre aide qui me sera hautement précieuse (pour me spremier pas dans la programmation Web).

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 584
    Par défaut
    je crois que le problème arrive car tu n'est pas connecté à la bdd avant de faire la requète, ou que tu n'a pas signifié de mot de passe de connection.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Je ne comprends pas.

    Je me connecte bien à la base de données avec la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function connexion_DB($serveur, $utilisateur, $password, $base) {
    // Déclaration des paramètres de connexion
    $host = $serveur;
    $user = $utilisateur;
    $bdd = $base;
    $passwd = $password;
    // Connexion au serveur
    mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
    mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
    }
    ENsuite à l'aide du code suivant, je crée les variables de session:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // On n'effectue les traitement qu'à la condition que 
    // les informations aient été effectivement postées
    if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) ) {
    	extract($_POST);  // je vous renvoie à la doc de cette fonction
    	$_SESSION['login'] = $login;
    	$_SESSION['password'] = $password;
    	$_SESSION['profil']=requete_profils();
     
     
    	header('location:accueil.php');
    	exit();	
    }
    ?>
    Attends, pendant que j'écris, je me pose une question:

    Est ce que l'erreur ne provient pas de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	header('location:accueil.php');
    	exit();	
    }
    qui me déconnecte effectivement de la base de données?

    En effet, dans mon index.php, l'utilisateur se connecte et j'envoie les infos à la page accueil.php.

    Seulement, comme je ne savais pas comment faire celà, j'ai cherché et trouvé le code HEADER suivi du EXIT sans vraiment cherché à savoir ce que ça implique.

    Si mon erreur vient bien de là, commet si j'ai vérifié que l'utilisateur est le bon, je peux afficher la page accueil.php?

    Dois je garder en l'état mon code et supprimer le EXIT?

    Bon, je test déjà cette idée.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Bon, ce n'est pas ça le problème puisque le mal persiste.

    Mais est ce bien la commande pour dire à php d'ouvrir une autre page? Si oui tant mieux.

    Mais d'où vient le problème?

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Le message d'erreur est explicite

    'ODBC'@'localhost n'a accès à la base de données !

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Oui, explicite pour qui s'y connaît vraiment.
    Mais pour le commun des mortels ou ceux qui débutent dans la programmation web comme moi, c'est "explixite" mais quelle action doit on mener?

    Je me connecte correctement à la base de données. J'essaie ensuite de créer un utilisateur et j'ai ce problème. Qu'est ce à dire? Comment puis je résoudre ce problème?

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Ok,

    d'après le message vous ne vous connectez pas correctement à la base de données.

    Votre utilisateur nommé ODBC, na pas le droit de faire quoi que ce soit sur cette DB.

    Assurez vous pour commencer de pouvoir faire un select et de l'afficher.

    Ceci fait nous pourrons décortiquer les problèmes suivant

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Merci.

    Je n'ai pas d'utilisateur ODBC justement. J me connecte avec le login getir et ça passe bien. Puisque j'arrive à faire un sélecte à déterminer le profil de l'utilisateur. Une fois que c'est fait, l'utilisateur getir, ayant l'habilitation de créer un utilisateur dans mon application (il a les mêmes droits que root dans mysql également), je souhaite créer un utilisateur test avec pour mot de passe test et profil public. J'essaie seulement de créer cet utilisateur dans mysql et j'ai cette erreur qui n'a pas vraiment de sens puisque qu'on voit bien dans la requête que j'affiche lorsqu'il y a erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL string : GRANT SELECT , INSERT , UPDATE , DELETE ON *.* TO 'test'@'%' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0
    que la requête est correcte. Je l'ai testé depuis phpadmin avant de la mettre dans ma fonction et de l'exécuter.

    Maintenant, il faut savoir que j'utilise la version de php fournie avec Easyphp 1.8. Je ne sais pas si ça peut éclairer.

    Néanmoins j'essaie les actions demandées et je vous fait un retour.

  9. #9
    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
    Par défaut
    Si PHP tente de lancer la requete avec l'utilisateur ODBC c'est qu'il n'a pas de connexion en cours.

    Par rapport a ton premier message, lorsque tu fais une redirection, tu perds toutes tes variables, y compris les connexions aux bases.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 584
    Par défaut
    comme le dit sabotage, il faut se connecter à la bdd à sur CHAQUE pages

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Effectivement, la connexion n'est pas conservée. La j'ai essayé un insert sur la page ou il y a le problème et ça ne passe pas.

    Initialement, je n'ai pas voulu faire une redirection. Je veux juste ouvrir une autre page.
    Comment mon appli fonctionne:
    1. L'utilisateur se connecte et j'envoie les données via un formulaire vers la page verification.php
    2. Sur la page verification.php, je récupère les infos et je me connecte avec les informations que l'utilisateur a fourni.
    3. Tout se déroule sans problème, j'affiche la page d'accueil.

    Apparemment ma redirection pose le problème. Comment donc l'annuler et simplement afficher la page d'accueil (accueil.php) en conservant la connexion à la base de données?

  12. #12
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 584
    Par défaut
    ce n'est pas possible, les connections sont obligatoirement fermé (dans la plupart des cas) à la fin du script php.

    Réouvre une connection, tu t'embetera moins, surtout que c'est le fonctionnement logique d'une page d'identification.

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Si je comprends bien alors, à chaque fois que je voudrais enregistrer des données, il faudra que je me connecte encore puis que j'ouvre. C'est bien ça?
    Mais il doit bien avoir une possibilité de garder la connexion active?

  14. #14
    Membre émérite
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 811
    Par défaut
    Bonjour,
    Tu as très bien compris.
    Pour ma part, je commence toujours mes fonctions qui traitent la BDD par un appel à la fonction de connexion. Dans ton cas, connexion_DB.

    Juste un plus, dans ton code, tu as du superflu.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function connexion_DB($serveur, $utilisateur, $password, $base) {
    // Déclaration des paramètres de connexion
    #$host = $serveur;       INUTILE
    #$user = $utilisateur;    INUTILE
    #$bdd = $base;            INUTILE
    #$passwd = $password; INUTILE
    // Connexion au serveur
    mysql_connect($serveur, $utilisateur,$password) or die("erreur de connexion au serveur");
    mysql_select_db($base) or die("erreur de connexion a la base de donnees");
    }

    Pourquoi tu déclares de nouvelle variables? C'est vrai que la modif est minim mais sur un script complet. Il y aura beaucoup de gain (mémoire, taille du fichier php et vitesse de traitement) à la fin. Il vaut mieux utiliser les variables d'appel de la fonction que d'en déclarer des nouvelles qui ne sont que des copies à moins bien sûr qu'il n'y ait besoin de modification.

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 170
    Par défaut
    Merci. Je suis rassuré d'avoir bien compris.
    Tu as bien raison car c'est vraiment du superflue. J'ai copier-coller ce code quelque part et je l'avais modifier et enlever ces variables que je n'utilise nulle part. Seulement quand j'ai eu ce soucis, je me suis dit qu'à un certains niveau ces variables me seraient utiles. Je les ai donc laissé au cas ou.
    Mais je les enlève de ce pas.

    Merci, je marquerais le sujet résolu dans quelques minutes s'il n'y a pas d'autres remarques, interventions sur le sujet.

    Merci

  16. #16
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    584
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 584
    Par défaut
    Ce qui peu être fait, c'est vérifier qu'une connection sql est ouverte, si ce n'est pas le cas en ouvrir une, comme ca il n'y à pas de problème de se demandé si il y a deja uns connection ou pas.

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

Discussions similaires

  1. [ADO.NET Oracle] Requête paramétrée en C# qui refuse de s'exécuter
    Par NeraOne dans le forum Accès aux données
    Réponses: 9
    Dernier message: 11/05/2007, 17h50
  2. Requête DELETE qui refuse de fonctionner chez Free
    Par fafafa dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/06/2006, 15h00
  3. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 10h12
  4. [...] doit utiliser une requête qui peut être mise à jour
    Par requiemforadream dans le forum ASP
    Réponses: 4
    Dernier message: 26/04/2005, 09h12
  5. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07

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