Page avec login 2ème partie (Can't connect to MySQL server...)

Eléphanteau du PHP | 20 Messages

12 mai 2008, 23:39

Voici où j'en suis avec ma section membres commencée dans le sujet 'page avec login'.

Je crois avoir isolé le problème dans le haut du code ci-dessous (en 'quote'). Peut-être la concaténation dans la ligne SELECT FROM ? Si quelqu'un pouvait jeter un coup d'oeil serviable en tenant compte des données suivantes:

- la base de donnée a pour nom dannykweb
- la table a pour nom membres (avec un 's')
- les champs se nomment usrname et psword

Rappel: j'essaie de faire une page avec login/mot de passe qui mène à membre.php
// on teste si le visiteur a soumis le formulaire de connexion  
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') { 
   if ((isset($_POST['usrname']) && !empty($_POST['usrname'])) && (isset($_POST['psword']) && !empty($_POST['psword']))) { 
 
      $base = mysql_connect ('localhost', 'dannykweb', '******'); 
      mysql_select_db ('dannykweb', $base); 
      
      // on teste si une entrée de la base contient ce couple login / pass 
      $sql = 'SELECT count(*) FROM membres WHERE usrname="'.mysql_escape_string($_POST['usrname']).'" AND psword="'(mysql_escape_string($_POST['psword']).'"'; 
      $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
      $data = mysql_fetch_array($req); 
      
      mysql_free_result($req); 
      mysql_close(); 
// si on obtient une réponse, alors l'utilisateur est un membre


(voir code complet de la page dans message plus récent ci-dessous)
Merci !
Modifié en dernier par Danny le 13 mai 2008, 13:26, modifié 1 fois.

Mammouth du PHP | 19672 Messages

13 mai 2008, 05:42

La seule affaire que je relève pour l'instant, c'est l'utilisation inappropriée de mysql_fetch_array() pour récupérer le retour de l'identification.

Si tu as monté ta base correctement, la colonne usrname devrait être indexée UNIQUE, ce qui interdit les doublons sur les pseudos de tes visiteurs. Partant de là, ta requête devrait retourner 1 ou 0. Il serait donc plus logique d'utiliser mysql_num_rows().

Pour le reste, j'ai le sentiment qu'il manque une question dans ton sujet :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 13:20

La seule affaire que je relève pour l'instant, c'est l'utilisation inappropriée de mysql_fetch_array() pour récupérer le retour de l'identification.

Si tu as monté ta base correctement, la colonne usrname devrait être indexée UNIQUE, ce qui interdit les doublons sur les pseudos de tes visiteurs. Partant de là, ta requête devrait retourner 1 ou 0. Il serait donc plus logique d'utiliser mysql_num_rows().

Pour le reste, j'ai le sentiment qu'il manque une question dans ton sujet :-k
Merci. Suivant tes conseils j'ai marqué 'unique' la colonne 'usrname' de ma database, remplacé mysql_fetch_array() par mysql_num_rows().

J'obtiens encore ce message d'erreur:

Erreur SQL !
SELECT count(*) FROM membres WHERE usrname="airneuf" AND psword="*****"
Can't connect to MySQL server on 'localhost' (10061)


Ci-dessous le code de ma page index.php (password masqué):
<?php

// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
if ((isset($_POST['usrname']) && !empty($_POST['usrname'])) && (isset($_POST['psword']) && !empty($_POST['psword']))) {

$base = mysql_connect ('p41mysql137.secureserver.net', 'dannykweb', '*****');
mysql_select_db ('dannykweb', $base);

// on teste si une entrée de la base contient ce couple login / pass
$sql = 'SELECT count(*) FROM membres WHERE usrname="'.mysql_escape_string($_POST['usrname']).'" AND psword="'.mysql_escape_string($_POST['psword']).'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_num_rows($req);

mysql_free_result($req);
mysql_close();

// si on obtient une réponse, alors l'utilisateur est un membre
if ($data[0] == 1) {
session_start();
$_SESSION['usrname'] = $_POST['usrname'];
header('Location: membre.php');
exit();
}
// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
elseif ($data[0] == 0) {
$erreur = 'Compte non reconnu.';
}
// sinon, alors la, il y a un gros problème :)
else {
$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
}
}
else {
$erreur = 'Au moins un des champs est vide.';
}
}
?>

<html>
<head>
<title>Accueil</title>
</head>

<body>
Connexion à l'espace membre :<br />
<form action="index.php" method="post">
Login : <input type="text" name="usrname" value="<?php if (isset($_POST['usrname'])) echo htmlentities(trim($_POST['usrname'])); ?>"><br />
Mot de passe : <input type="password" name="psword" value="<?php if (isset($_POST['psword'])) echo htmlentities(trim($_POST['psword'])); ?>"><br />
<input type="submit" name="connexion" value="Connexion">
</form>
<a href="inscription.php">Vous inscrire</a>
<?php

if (isset($erreur)) echo '<br /><br />',$erreur;
?>

</body>
</html>

Eléphant du PHP | 422 Messages

13 mai 2008, 13:40

Si ton message d'erreur est "Can't connect", il faut se concentrer sur la connexion à la base de données. Si tu fais ce code, ça donne quoi ?
<?php

$link = mysql_connect('p41mysql137.secureserver.net', 'dannykweb', '*****');
if (!$link) {
   die('Impossible de se connecter : ' . mysql_error());
}

// Rendre la base de données foo, la base courante
$db_selected = mysql_select_db('dannykweb', $link);
if (!$db_selected) {
   die ('Impossible de sélectionner la base de données : ' . mysql_error());
}

echo "connexion réussie";
?>

Modifié en dernier par caroube le 13 mai 2008, 13:41, modifié 1 fois.

Mammouth du PHP | 19672 Messages

13 mai 2008, 13:41

Le message est pourtant assez clair et ce n'est pas au niveau de l'exécution de la requête mais en amont lors de la tentative de connexion.
Ajoute une gestion d'erreur :
<?php
// .....
        $cnx = mysql_connect ('p41mysql137.secureserver.net', 'dannykweb', '*****') or die("Erreur lors de la connexion;<br />\nErreur : ". mysql_error());
        mysql_select_db ('dannykweb', $cnx) or die("Erreur lors de la sélection de la base ". $base .";<br />\nErreur : ". mysql_error());
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 13:48

Si ton message d'erreur est "Can't connect", il faut se concentrer sur la connexion à la base de données. Si tu fais ce code, ça donne quoi ?
<?php

$link = mysql_connect('p41mysql137.secureserver.net', 'dannykweb', '*****');
if (!$link) {
   die('Impossible de se connecter : ' . mysql_error());
}

// Rendre la base de données foo, la base courante
$db_selected = mysql_select_db('dannykweb', $link);
if (!$db_selected) {
   die ('Impossible de sélectionner la base de données : ' . mysql_error());
}

echo "connexion réussie";
?>

J'ai placé ce code, uploadé la page et obtenu le message suivant dès le chargement de la page (avant d'avoir rempli les champs):

Impossible de se connecter : Client does not support authentication protocol requested by server; consider upgrading MySQL client

Même chose avec le code de Cyrano :

Erreur lors de la connexion;
Erreur : Client does not support authentication protocol requested by server; consider upgrading MySQL client

Mammouth du PHP | 19672 Messages

13 mai 2008, 14:27

Ben au moins on avance. Et le truc dans ce cas là, c'est de copier le message renvoyé par MySQL et de coler ça dans Google et là, c'est magique, on trouve ça en première position
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 14:45

Ben au moins on avance. Et le truc dans ce cas là, c'est de copier le message renvoyé par MySQL et de coler ça dans Google et là, c'est magique, on trouve ça en première position
Alors ça viendrait du 'hachage' du mot de passe (fonction MD5) que je ne voulais pas et que je croyais avoir enlevé en supprimant .MD5


Ligne originale:

$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"';


Ligne avec fonction MD5 (que je croyais) supprimée :

$sql = 'SELECT count(*) FROM membres WHERE usrname="'.mysql_escape_string($_POST['usrname']).'" AND psword="'.mysql_escape_string($_POST['psword']).'"';

Qu'est-ce qui reste dans le code de cette foutue fonction MD5 dont je ne veux pas ?

Merci de votre aide, je suis vraiment newbie en php... :?

Rappel: je crée un espace membre à partir de ce tuto : http://www.lephpfacile.com/howto/10-un-espace-membre

Mammouth du PHP | 19672 Messages

13 mai 2008, 14:51

Non, ça vient du mot de passe utilisé pour la connexion : avec la version 4.1, MySQL a changé l'algorithme de hachage des mots de passe des utilisateurs. Si ta base d'origine est antérieure à cette version mais que tu as conservé le même mot de passe, il faut explorer "OLD_PASSWORD" dans la doc de MySQL, tu vas trouver des choses intéressantes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 15:04

Non, ça vient du mot de passe utilisé pour la connexion : avec la version 4.1, MySQL a changé l'algorithme de hachage des mots de passe des utilisateurs. Si ta base d'origine est antérieure à cette version mais que tu as conservé le même mot de passe, il faut explorer "OLD_PASSWORD" dans la doc de MySQL, tu vas trouver des choses intéressantes.
Bizarre parce que j'ai crée cette base tout récemment et en version 4.1 il me semble bien. Je retourner fouiller...

Mammouth du PHP | 19672 Messages

13 mai 2008, 15:40

Hé, si tu as une installation neuve, utilise donc MySQL 5 : c'est la dernière version stable et tu y gagneras en performances autant qu'en confort avec des améliorations notables par rapport à la 4.1.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 16:01

Hé, si tu as une installation neuve, utilise donc MySQL 5 : c'est la dernière version stable et tu y gagneras en performances autant qu'en confort avec des améliorations notables par rapport à la 4.1.
C'est fait.

Maintenant quand on me dit ''consider upgrading MySQL client'', le 'client' c'est Dreamweaver, j'ai bon ? :roll:

Mammouth du PHP | 19672 Messages

13 mai 2008, 16:41

Tout à fait possible.

Dans ce cas, dans un client MySQL normal (MySQL Query Browser, PHPMyAdmin ou mieux encore en ligne de comande, crée un user genre "DW" en lui assignant un mot de passe mais avec l'option OLD_PASSWORD et ça devrait fonctionner.

Ou encore mieux : change d'éditeur et prends-en un vrai (tout Troll mis-à-part), un Notepad++ sera un bien meilleur outil d'apprentissage que ce truc coûteux et pas spécialisé du tout dans le code optimal. ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 20 Messages

13 mai 2008, 17:34

Tout à fait possible.

Dans ce cas, dans un client MySQL normal (MySQL Query Browser, PHPMyAdmin ou mieux encore en ligne de comande, crée un user genre "DW" en lui assignant un mot de passe mais avec l'option OLD_PASSWORD et ça devrait fonctionner.

Ou encore mieux : change d'éditeur et prends-en un vrai (tout Troll mis-à-part), un Notepad++ sera un bien meilleur outil d'apprentissage que ce truc coûteux et pas spécialisé du tout dans le code optimal. ;)
Question quiz: lorsqu'on insère des données dans la base et qu'on nous propose de choisir une fonction pour chaque colonne (USER, LOWERCASE, OLD_PASSWORD, etc.), est-ce que cela a une incidence sur le code ? Pour 'id' doit-on attribuer une fonction ? (je ne savais pas quoi mettre alors j'ai laissé vide)

Mammouth du PHP | 19672 Messages

13 mai 2008, 18:58

Je flaire la confusion : comment as-tu donc créé l'utilisateur ? T'es-tu servi un peu de la doc de MySQL pour voir comment gérer les comptes utilisateurs de MySQL ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: