Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Administration
Administration Forum d'entraide sur l'administration de MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/10/2006, 18h00   #1
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Par défaut mysql_fetch_objet => erreur

Bonjour,

Je suis en train de developper (enfin, "essayer de développer") une petite application pour le boulot.
Je débute en PHP et je suis déjà bloqué au contrôle du Login.

Lorsque j'exécute le code suivant :
Code :
1
2
3
4
5
6
7
$request=mysql_query("SELECT login, pass FROM users WHERE login LIKE '$login' AND pass LIKE '$pass';");
  $result=mysql_fetch_object($request);
  IF ($pass==$result->pass)
  {
    echo ("Connexion autorisée");
    //header("location: ");
  }
Je reçois l'erreur :
Citation:
Notice: Trying to get property of non-object in c:\program files\easyphp1-8\www\planningchargement\connexion.php on line 19
Cette ligne 19 correspond à mon "if".

Je ne comprends pas où se situe le problème.

Pour info, je travaille avec EasyPHP 1.8 sur lequel j'ai appliqué PHP5.

Merci d'avance pour votre aide
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2006, 18h06   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Que vaut $pass ?

EDIT: en fait c'est juste par curiosité, ca ne va pas résoudre forcément ton pb
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2006, 18h12   #3
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Il faudrait vérifier que ta requète renvoie un résultat.

Tu peux ajouter un test supplémentaire

Code :
1
2
3
4
5
6
7
8
9
10
 
$request=mysql_query("SELECT login, pass FROM users WHERE login LIKE '$login' AND pass LIKE '$pass';");
IF ( mysql_num_rows($request)>0){
while($result=mysql_fetch_object($request)){
IF ($pass==$result->pass){
echo ("Connexion autorisée");
//header("location: ");
}
}
}
Avec ceci tu vérifies que la requet a renvoyé des lignes.
Ensuite la boucle while te permet de parcourir toutes les lignes renvoyées ( on ne sait jamais

Sinon, pour tester qu'une personne a donné les bons identifiants évite les like. Remplace les par des =.
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2006, 18h41   #4
Candidat au titre de Membre du Club
 
Étudiant
Inscription : juin 2005
Messages : 12
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2005
Messages : 12
Points : 13
Points : 13
...et attention aux injections SQL avec ce code
MS-DOS_1991 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 10h32   #5
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Le "While" ne change rien, j'ai toujours le même problème.
J'ai essayé de remplacer les "LIKE" par "=" et c'est toujours pareil.

Une autre idée ?

Citation:
...et attention aux injections SQL avec ce code
Qu'est-ce que tu entends par là ?
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 11h03   #6
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
Par défaut injections SQL

C'est la fameuse faille hyper connue que le peut injecter avec ' OR 1='1'

est-ce que tu as fait un mysql_select_db pour pouvoir utiliser mysql_query au lieu de mysql-db_query?
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 11h10   #7
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
En fait , j'ai une fonction de connexion
Citation:
function connexion()
{
$connexion=mysql_pconnect('localhost','root',NULL);
mysql_select_db('planning', $connexion);
}
qui est appelée avant juste avant le mysql_query.

Comment puis-je être certain que cette connexion a belle et bien fonctionné ?
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 11h19   #8
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
Par défaut ajoute or die

Code :
1
2
3
4
FUNCTION connexion(){
    $connexion=mysql_pconnect('localhost','root','') OR die("erreur connexion: ". mysql_error());
    mysql_select_db('planning', $connexion);
}
J'ai remplacé le NULL par '' pour éviter sur le warning que soit affiché USING_PASSWORD=NO.
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 11h27   #9
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Citation:
Envoyé par Zolex
Comment puis-je être certain que cette connexion a belle et bien fonctionné ?
En lisant la doc, on voit :
Citation:
Valeur de retour
Retourne un identifiant de lien persistant MySQL en cas de succès, ou FALSE si une erreur survient.
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 11h59   #10
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Citation:
Envoyé par zyongh
Code :
1
2
3
4
FUNCTION connexion(){
    $connexion=mysql_pconnect('localhost','root','') OR die("erreur connexion: ". mysql_error());
    mysql_select_db('planning', $connexion);
}
J'ai remplacé le NULL par '' pour éviter sur le warning que soit affiché USING_PASSWORD=NO.
Merci pour ton aide, mais ça ne change rien, il semble que la connexion passe sans souci étant donné que je n'ai pas le résultat du "die".

Je ne comprends vraiment pas où se situe le problème.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 12h05   #11
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Tu peux egalement rajouter un or die sur le mysql_query pour vérifier la bonne execution de la requete.

Moi je me demande si le problème ne provient pas du fait que tu te connecte au mysql via une fonction
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 12h23   #12
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Qu'est ce que ça donne ça ?
Code :
1
2
3
 
$request=mysql_query("SELECT login, pass FROM users WHERE login LIKE '$login' AND pass LIKE '$pass';") OR die(mysql_error());
var_dump('<pre>', $request, mysql_fetch_object($request), '</pre>');
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 13h53   #13
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Voici ce que donne ton exemple :
Citation:
string(5) "

"
resource(3) of type (mysql result)
bool(false)
string(6) "

"
Notice: Trying to get property of non-object in c:\program files\easyphp1-8\www\planningchargement\connexion.php on line 18
Connexion autorisée
J'ai essayé de ne plus passer par une fonction de connexion et ça ne change rien.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h00   #14
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
mysql_fetch_object retourne un objet avec les propriétés qui correspondent à la ligne récupérée, ou FALSE s'il n'y a plus de lignes. (CF doc)
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h07   #15
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
Par défaut je reprends un détail

En fait quand j'ai repris ton code pour modifier le null. Je voulais surtout transformer le mysql_pconnect en mysql_connect. Cela ne résoudra pas ton problème et c'est une bonne habitude à prendre de ne pas utiliser mysql_pconnect sauf dans des cas très précis auxquels je n'ai encore jamais eu à faire face.
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h17   #16
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Je suis d'accord avec toi, mais pourquoi celà ne fonctionne-t-il pas ?

Petite précision : ce problème n'apparaît que lorsque que j'introduis un mauvais login et/ou mot de passe, dans le cas contraire, ça fonctionne.
Ceci prouve bien que la connexion à la DB se passe sans problème.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h25   #17
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Citation:
Envoyé par zyongh
En fait quand j'ai repris ton code pour modifier le null. Je voulais surtout transformer le mysql_pconnect en mysql_connect. Cela ne résoudra pas ton problème et c'est une bonne habitude à prendre de ne pas utiliser mysql_pconnect sauf dans des cas très précis auxquels je n'ai encore jamais eu à faire face.
Il y a 2 écoles qui s'opposent à ce sujet.
Lors de ma (courte) formation PHP, l'utilisation du mysql_pconnect était conseillée. D'un autre côté, pas mal de personne recommande plutôt le mysql_connect.

Peux-tu expliquer ton point de vue ?
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h39   #18
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Pour ma part, je n'utilise pas de connexion persistante car dans mes applications mes pages sont généralement indépendantes les unes des autres.

Même entre l'affichage d'infos et une eventuelle nouvelle requete, il peut s'écouler un laps de temps non négligeable pendant laquelle la connexion reste ouverte si celle-ci a été ouverte en mode persistant.

D'ailleurs dans la doc, ils avertissent bien que l'tulilistaion de connexions persistantes requiert un paramétrage fin d'apache et de mysql pour éviter la saturation.
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h43   #19
Invité régulier
 
Inscription : avril 2004
Messages : 102
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2004
Messages : 102
Points : 9
Points : 9
Merci pour cette précision.

En ce qui concerne mon problème, je progresse un peu.
Avec le code complet suivant :
Citation:
<?php

// Fonction de connexion à la DB
function connexion()
{
$connexion=mysql_connect('localhost','root','')or die("erreur connexion: ". mysql_error());
mysql_select_db('planning', $connexion);
}

// Contrôle du login et du pass
if (isset($_POST["login"]) && isset($_POST["pass"]))
{
$login=strtolower($_POST["login"]);
$pass=$_POST["pass"];
connexion();
$request=mysql_query("SELECT login, pass FROM users WHERE login LIKE '$login' AND pass LIKE '$pass';") or die(mysql_error());
$result=mysql_fetch_object($request);
if (($login==$result->login) && ($pass==$result->pass))
{
echo ("Connexion autorisée");
//header("location: ");
}
else
{
echo ("Login ou Password invalide");
}
}
?>
Tout fonctionne correctement excepté le fait que, lors d'un login et/ou mot de passe incorrects, j'ai le message suivant :
Citation:
Notice: Trying to get property of non-object in c:\program files\easyphp1-8\www\planningchargement\connexion.php on line 18
Login ou Password invalide
Donc, c'est un simple "warning", mais j'aimerais bien le faire disparaitre.

Une idée ???

Merci d'avance.
Zolex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2006, 14h48   #20
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Oui car tu n'utilise pas la méthode que je t'ai donné à savoir toujours testé le nombre de lignes retournées par une requete de type select

Car si aucune ligne n'est renvoyée, alors le mysql_object renvoie rien.

Code :
1
2
 
IF (mysql_num_row($req) > 0) //alors traitement
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h53.


 
 
 
 
Partenaires

Hébergement Web