erreur Notice

Répondre
gilbert
le 16/07/2010 à 00:51
gilbert
Bonjour,
En passant de EasyPhp1.8 (track_errors OFF) à EasyPhp5.3.2 (track_errors ON) j'ai eu le message suivant dans un script d'authentification :
Notice: Trying to get property of non-object in C:\servloc\EasyPHP-5.3.2i\www\adher\programmes_systeme\verif.php on line 47
En mettant @ devant les variables concernées l'erreur n'est pas affichée, mais cela ne me satisfait pas et j'aimerais savoir comment bien programmer cela.
L'erreur n'apparait que si on entre de mauvais identifiants.

Voici le code :
<?php
$requete1 = "SELECT * FROM pass WHERE pass_nom = '$nom_saisi'";
if($resultat1 = mysql_query($requete1,$connexion))
{
$ligne1 = mysql_fetch_object($resultat1);
$priv_fichier = @$ligne1->pass_privilege;
$password_fichier = @$ligne1->pass_pwd;
if($password_fichier == $paswd_saisi)
{
$_SESSION['pseudo'] = $nom_saisi;
?>


merci de donner votre avis
gilbert
gilbert
LA GLOBULE
le 16/07/2010 à 09:00
LA GLOBULE
2 choses à dire :

1) Il faut que tu escapes les données que tu colles dans ta requete SQL. Pour cela, il faut utiliser mysql_real_escape_string sur $nom_saisi

2) Avant de faire un mysql_fetch_object, tu dois t'assurer que mysql_query n'a pas retourné false (ca retourne false quand mysql genere une erreur, ce qui est ton cas actuellement, et mysql génère une erreur justement parce que tu n'escapes pas tes données).
gilbert
le 17/07/2010 à 10:52
gilbert
Merci LA GLOBULE pour ces indications que j'ai suivies.
J'ai échappé les variables mais cela n'a rien changé, en effet les pseudo de connexion utilisés ne comportaient pas de caractères spéciaux.
En continuant les essais j'ai constaté que si le SELECT n'aboutit pas, parce que le nom d'utilisateur est inconnu dans la table, MySql renvoie quand même TRUE avec une tableau vide. C'est surprenant. Cela apparaît avec le code ci-dessous qui détecte seulement l'erreur sur un test d'extraction de ligne :
if(!$ligne1 = mysql_fetch_object($resultat1))
Voici le code :

if ( (!empty( $_POST['nom'])) AND (!empty( $_POST['password'])))
{
include(get_include_path() . 'connexion.php');
$nom_saisi = $_POST['nom'];
$password_saisi = $_POST['password'];
$paswd_saisi = crypt($password_saisi,'ig');

$requete1 = sprintf("SELECT * FROM pass WHERE pass_nom='%s'",
mysql_real_escape_string($nom_saisi));
$resultat1 = mysql_query($requete1,$connexion);

if(!$resultat1 ){
$message = 'Requete1 invalide : ' . mysql_error() ;
die($message);
}

if(!$ligne1 = mysql_fetch_object($resultat1)) {
$message = 'Erreur de connexion, reconnectez vous';
die($message);
}

$priv_fichier = $ligne1->pass_privilege;
$password_fichier = $ligne1->pass_pwd;
if($password_fichier == $paswd_saisi)
{
$_SESSION['pseudo'] = $nom_saisi;


Finalement il me semble qu'utiliser l'opérateur @ pour ne pas afficher les erreurs, évite bien des complications.
Que penses-tu de tout cela ?

Gilbert
gilbert
dark_nemo
le 17/07/2010 à 18:46
dark_nemo
L'utilisation de @ est un cache misère.
Il faut traiter les erreurs. Même les notices.
D'ailleurs pour bien programmer, il faut bannir le @ devant les fonctions. C'est laid, c'est même très très laid.

Pour mysql_query, une résultat vide est un résultat comme un autre donc normal qu'elle retourne true. L'absence de résultat n'est pas une erreur en soit.
Répondre

Ecrire un message

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