Problème accès utilisateur.

Répondre
niconicochan
le 23/04/2014 à 14:23
niconicochan
Bonjour,

J'ai des difficultés à manipuler des bases de données sur un serveur local.
J'arrive à le faire avec un serveur distant mais pour moi le serveur local averc l'interface
phpmyadmin en local c'est encore une bête noire.

Voilà ce que m'envoit le navigateur quand j'essaye d'envoyer des informations de formulaire
dans une base de données sur mon serveur local.

Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES) in C:\xampp\htdocs\monsite\mapage.php on line 19
Connexion au serveur impossible.

Mes lignes de code sont toutes bonnes je pense, car elles marchent sur un serveur distant,
sauf donc peut-être les quatre variables:

$utilisateur=" ";
$serveur=" ";
$motdepasse=" ";
$basedonnees=" ";

A nom d'utilisateur, je ne sais pas s'il faut écrire localhost ou 127.0.0.1
D'une part, on voit ses pages dans le navigateur en commençant par écrire
http://localhost/... ce qui me ferait plutôt pencher par localhost, et d'autre
par sur phpmyadmin en local je trouve écrit en haut à gauche Serveur: 127.0.0.1
ce qui me ferait plutôt pencher pour 127.0.0.1
Ca c'est le premier point qui me pose un vrai soucis de compréhension.

Pour le mot de passe ça va, sur phpmyadmin en local j'arrive à mettre, à choisir et à enlever un
mot de passe. Cette variable est liée au nom d'utilisateur donc si pour le premier point
ci-dessus je peux avoir une réponse alors je sais ce que je dois écrire pour cette variable.

Le nom que j'ai donné à ma base de données, lui, apparaît sur mon interface phpmyadmin en local
dont ça ça va aussi.

Enfin pour la variable utilisateur je ne comprend presque rien.
Sur mon interface de phpmyadmin en local, dans l'onglet utilisateur je vois la liste de tous
les utilisateurs.
Je ne me souviens pourtant pas en avoir créé un seul et j'ai pourtant déjà une liste.
Je crois que root est crée par défaut. C'est le serveur (Client) 127.0.0.1
Il a un mot de passe que je lui ai donné et il a tous les privilèges (ALL PRIVILEGES)
mais j'ai aussi un autre utilisateur qui s'appelle root lui-aussi qui est le serveur (Client) localhost.
Lui, il n'a pas de mot de passe car je ne lui en ai pas donné et il a aussi tous les privilèges
(ALL PRIVILEGES), alors pourquoi le navigateur retourne access denied?
Il y a vraiment quelque chose que je ne comprends pas.
J'ai même un utilisateur qui s'appelle N'importe lequel ???

De manière plus générale, je ne comprends pas cette histoire d'utilisateurs.
Tous ces utilisateurs inscrits, existants ou non mais en tous cas inscrits, ont accès à l'interface de phpmyadmin en local depuis mon poste, donc depuis mon ordinateur et depuis
mon ordinateur seulement.
Et moi, je peux depuis mon ordinateur, simplement en rentrant dans phpmyadmin en local,
gérer tous les privilèges et tous les paramètres de tous les utilisateurs.
Donc eux ils le peuvent aussi. Je ne vois donc pas l'intérêt du truc.
Bien sûr, j'imagine que tout a été très bien conçu et que c'est moi qui ne comprends pas.

C'est d'ailleurs justement pour ça que je demande votre aide.
J'ai vraiment besoin de comprendre.

Dernier point, si vous acceptez de bien vouloir m'aider jusqu'au bout
(ce qui me permettra aussi de rendre l'ascenseur à d'autres plus tard),
dans l'onglet utilisateur je ne comprends pas la colonne Client.
Pour le cas d'un serveur distant (je pars de ce que je comprends),
j'ai un navigateur, le client, qui envoit des requêtes à un serveur distant,
qui lui-même renvoit des pages demandées au navigateur qui lui va alors les afficher.
Pour ce qui est des lignes de php, elles seront envoyées à l'interpréteur de php
depuis le serveur distant qui renverra le html sous instruction echo au navigateur ou bien qui enverra
les scripts php à une SGBD qui elle-même repassera par l'interpéteur
de php (si je ne me trompe pas) pour ensuite permettre le retour au navigateur.
Lorsque je travaille en local où se trouve l'interpéteur php du serveur local?
En local ou à distance?
Si sur phpmyadmin je suis sur mon serveur local, donc il s'agit bien du client,
le navigateur est-il le logiciel utilisé par ce client?
Est-ce que le navigateur est un logiciel qui fait partie du client?
LupusMic
le 23/04/2014 à 17:07
LupusMic
Tout d'abord, malheureusement, 'localhost' a une signification pour la librairie cliente de MySQL. Utiliser 'localhost' plutôt qu'une IP, c'est indiquer au client qu'on veut passer par le socket UNIX. Ce peut être un premier problème.

Je suppose que la règle "N'importe lequel" se réfère aux règles s'appliquant par défaut à tous les utilisateurs configurés. Mais n'utilisant pas PMA, je ne pourrais pas t'aider.

Dans MySQL, un utilisateur est défini par trois éléments :
- le nom d'utilisateur
- l'origine de connection (IP, nom d'hôte)
- le mot de passe

'root'@'%' est l'utilisateur root depuis n'importe où.
'root'@'localhost': root depuis un socket UNIX
'root'@'127.0.0.1' root depuis la boucle IP locale.

Si tu n'as pas donné de mot de passe à ton utilisateur root pour MySQL, il faut que tu fournisse un mot de passe vide (une chaîne vide) à MySQLi.

Le navigateur est un client HTTP.
Le concept de base, c'est le couple client-serveur :

- le client HTTP (navigateur) contacte le serveur HTTP (Apache)
- le serveur HTTP interprète la requête HTTP et décide quoi en faire
- le serveur HTTP renvoie une réponse HTTP

Si le serveur HTTP détermine qu'il doit invoquer PHP (genre, en découvrant .php dans la Request URI):

- Apache charge le module PHP
- le module PHP interprète la requête HTTP telle qu'Apache lui a fourni
- le module PHP indique à Apache quels en-têtes HTTP mettre à jour, et quel est le contenu du corps de la réponse HTTP (ce que le programmeur contrôle avec les fonctions header et echo, par exemple).
- Apache effectue des traitements additionnels et renvoie la réponse au client HTTP

Maintenant, dans ton script PHP, tu peux très bien appeler des fonction qui vont utiliser elle-même le modèle client-serveur. C'est le cas de cURL et de MySQL.

cURL est, grossièrement, un client HTTP. Ceci te permet, depuis le serveur HTTP, de contacter un autre serveur HTTP.

En ce qui concerne l'extension MySQL, de base, va tenter de se connecter au serveur MySQL selon les données que tu lui fournit. Cette connexion peut se faire via IP ou des sockets Unix (il me semble qu'on peut aussi utiliser les named pipes de MS Windows, mais je n'y connais pas grand chose en MS Windows).

L'utilisation de MySQL n'est pas obligatoire, c'est juste que traditionnellement, c'est la manière de permettre la persistance des données dans une application web.

PHPMyAdmin (PMA) est une application Web, un client MySQL. Elle utilise le client HTTP (ton navigateur) pour se connecter au serveur HTTP qui invoque PHP pour aller manipuler le serveur MySQL et agir sur les données stockées.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
niconicochan
le 23/04/2014 à 17:44
niconicochan
Merci pour toutes ces explications. Ca ne règle pas mon soucis mais je vais essayer de trouver une autre solution.
LupusMic
le 24/04/2014 à 11:05
LupusMic
Vérifie que tu n'inverse pas le mot de passe et le nom d'utilisateur dans ton invocation de MySQL.

<?php

$db = new mysqli;
var_dump($db);

$db = new mysqli('127.0.0.1', 'root', '', 'mon_blog');


Bon, en relisant ton message pour retrouver les données, je me rends compte que tu confonds peut-être le nom d'hôte (la machine) et le nom d'utilisateur (le compte utilisateur) ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
niconicochan
le 24/04/2014 à 16:12
niconicochan
Je te propose, si tu es d'accord, de lire mon code pour voir où se trouve la source du problème.
Je l'ai énormément simplifié afin d'en améliorer la visibilité.

Point de détail sur l'exemple ci-dessous:
Tu verras que j'ai mis le nom de famille comme clef primaire, ce qui n'est pas un bon choix en pratique
puisque effectivement ça impliquerait qu'il n'y a pas deux utilisateurs avec un même nom de famille.

1) Page de formulaire:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Nom et prénom</title>
</head>

<body>
<br/>
<br/>
<br/>
<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tapez votre nom et prénom.<br/>
<br/>
<form method="POST" action="traitementnomprenom.php">
<ul style="list-style-type: none;">

<br/>
<br/>
<li>Nom:&nbsp;&nbsp;<input type="text" name="nomfamille" value="<?php echo htmlentities(@$_POST['nomfamille']) ?>" size="30" maxlength="25"/></li>
<br/>
<br/>
<li>Prénom:&nbsp;&nbsp;<input type="text" name="prenom" value="<?php echo htmlentities(@$_POST['prenom']) ?>" size="30" maxlength="25"/></li>
<br/>
<br/>
<input type="submit" name="validation" value="valider"/>
<input type="reset" name="reset" value="recommencer"/></li>
</ul>
</form>
<br/>
<br/>
<br/>
</body>
</html>


2)Page de traitement de formulaire:

<?php

$hote="localhost";
$utilisateur="root";
$motPasse="";
$nombase="mabase";

$nomfamille=$_POST['nomfamille'];
$prenom=$_POST['prenom'];

$connexion=mysqli_connect($hote,$utilisateur,$motPasse) or die ("Connexion au serveur impossible.");
$nombase=mysqli_select_db($connexion,$nombase) or die ("Sélection de la base impossible.");

$req="INSERT INTO mabase (nomfamille, prenom)
VALUES('".$nomfamille."','".$prenom."')";

$query=mysqli_query($connexion,$req) or die ("Exécution de la requête impossible.");

echo "<h4>Les données que vous avez saisies ont bien été enregistrées.</h4>";
mysqli_close();
?>


3)La table que j'ai créé sur phpmyadmin en local:

CREATE TABLE nometprenom (
nomfamille varchar(25) NOT NULL,
prenom varchar(25) NOT NULL,
PRIMARY KEY (nomfamille)
)

Echec, le navigateur me retourne:

Exécution de la requête impossible.
LupusMic
le 24/04/2014 à 16:24
LupusMic
La connexion s'effectue correctement en ligne 11, donc tu regardais au mauvais endroit. Regardes plutôt du côté de ta requête en ligne 14, le nom de la table dans laquelle tu insères me parait étrange.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
niconicochan
le 24/04/2014 à 17:11
niconicochan
Résolu, mais j'ai honte, en tout premier lieu pour le dérangement.

J'ai mis le nom de ma base de données après INSERT INTO au lieu du nom de ma table!
J'ai pourtant fait à chaque fois plusieurs relectures mais je n'ai jamais rien vu malgré toute
mon attention.
Ca parassait pourtant évident!
Toutes mes excuses pour le dérangement et surtout merci beaucoup!!
LupusMic
le 24/04/2014 à 18:57
LupusMic
Attends, tu n'as jamais passé deux jours à chercher le semicolon à la mauvaise place, alors ça va pour l'instant :p
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours