Compte Invalide ?

Répondre
jackbocar
le 15/07/2007 à 11:42
jackbocar
J'ai une erreur que je ne vois pas !

Merci de votre aide

Jack Bocar

<?php
$dbhote = 'localhost';
$dbuser = 'jackbocar';
$dbpass = 'XXXXXXXXXX';
$dbbase = 'Base_test';

$dsn = "mysql:dbname=$dbbase;host=$dbhote";
$dbh = new PDO($dsn, $dbuser, $dbpass);
?>

<?php
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

$sql = ('SELECT count(*) FROM user as nbres WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.md5(mysql_escape_string($_POST['pass'])).'"');
$result = $dbh->query($sql);
$data = $result->fetch();

$dbh = null;

if ($data['nbres'] == 1) {
session_start();
$_SESSION['login'] = $_POST['login'];
header('Location: membre.php');
exit();
}

elseif ($nbres == 0) {
$message = 'Compte invalide.';
}

else {
$message = 'La base de donn&eacute;e est down.';
}
}
else {
$message = 'Un des champs requis est vide.';
}
}
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Verification identification</title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="robots" content="index,follow" />
<meta name="category" content="histoire" />
<meta name="revisit-after" content="1 days" />
<meta name="author" lang="fr" content="Jack Bocar" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="stylesheet" type="text/css" media="screen" href="./css/main.css" />
</head>
<body>
<?php echo $message ?>
<br /><br />

<form action="verif.php" method="post">
Login : <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo stripslashes(htmlentities(trim($_POST['login']))); ?>"><br />
Mot de passe : <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo stripslashes(htmlentities(trim($_POST['pass']))); ?>"><br />
<input type="submit" name="connexion" value="Connexion">
</form>
</body>
</html>
jackbocar
le 15/07/2007 à 16:33
jackbocar
Bonjour,

Je ne comprends pas pourquoi j'ai cette erreur :


Fatal error: Call to a member function fetch() on a non-object in function_connexion.php on line 17

LIGNE 17 :
$data = $result->fetch();


Formulaite d'Identification :

<html><head><title>Identification</title></head><body>

<form action="verif.php" method="post">
Votre Login : &nbsp; <input type="text" name="login"><br />
Mot de passe : <input type="password" name="pass"><br /><br />
<input type="submit" name="connexion" value="Connexion">
</form>

</body></html>


La vérification :


<?php
session_start();

include ('function_connexion.php');

if (isset($_POST['login']) && isset($_POST['pass']) ) {

$login = $_POST['login'];
$pass = $_POST['pass_md5'];

if (verification($login, $pass_md5) ) {
session_regenerate_id();

$_SESSION['login'] = $login;
$message = "Vous &ecirc;tes correctement identifi&eacute;";
}else{
$message = "Erreur de mot de passe";
$message .= '<a href="auth.php" />Retour</a>';
}
}else{
$message = "Un des champs est vide";
$message .= '<a href="auth.php" />Retour</a>';
}
?>
<html><head><title>V&eacute;rification identification</title></head><body>

<?php echo $message ?>

<br /><br /></body></html>


La Fonction connexion :

<?php
function verification($login,$pass_md5) {
$dbhote = 'localhost';
$dbuser = 'jackbocar';
$dbpass = 'XXXXXXXXX';
$dbbase = 'base_test';

$dsn = "mysql:dbname=$dbbase;host=$dbhote";
$dbh = new PDO($dsn, $dbuser, $dbpass);

$nom_sql = $dbh->quote($login);
$pass_sql = $dbh->quote($pass_md5);


$sql = "SELECT count(*) as nbres FROM user WHERE login==nom_sql AND pass=$pass_sql ";
$result = $dbh->query($sql);
$data = $result->fetch();

$result = null;
if ($data['nbres'] == 1) {
return TRUE;
}else {
return FALSE;
}
}
$sth = null;
?>
LA GLOBULE
le 15/07/2007 à 17:34
LA GLOBULE
A mon avis, ce qui pose problème c'est ton $sql qui ne doit pas avoir une bonne tête : typiquement, il manque des quotes ' autour de nom_sql et de $pass_sql. Il manque aussi un mysql_escape_string.
Et donc $dbh->query($sql), ca doit générer une erreur.
Et donc $result n'est pas un résultat SQL, par conséquent, la méthode fetch() ne peux pas s'exécuter dessus.

En gros, faut que tu check les erreurs quoi.
Koboneil
le 15/07/2007 à 18:52
Koboneil
Dans la fonction connexion, à la ligne 16 sur le wall, t'as mis where == ... il faut juste un =, non ?
Koboneil
jackbocar
le 15/07/2007 à 19:10
jackbocar
Bonjour,

Merci, oui j'ai rectifé les erreurs.

Mais ça ne fonctionne toujours pas.

Et pourtant le deuxième script est sortit de mon livre PHP5 avancé ?

Jack Bocar

LAGLOBULE -> As tu reçu mon message sur ta messagerie ?

Jack Bocar
jackbocar
le 16/07/2007 à 06:37
jackbocar
--
-- Base de données: `application`
--

-- --------------------------------------------------------

--
-- Structure de la table `user`
--

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`pseudo` text NOT NULL,
`motdepasse` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Contenu de la table `user`
--

INSERT INTO `user` (`id`, `pseudo`, `motdepasse`) VALUES
(1, 'jack', 'jackbocar');


J'ai changé PSEUDO PAR NOM DANS LA TABLE, MAIS C'EST LE MÊME RESULTAT


Voici le script complet et réécrit sans erreur, mais ça ne fonctionne toujours pas ?


/---------------------------------------------------------------------------/

<?php
// connection et reqête

function verification($nom,$pass) {

define('USER', 'jackbocar');
define('PASS', 'XXXXXXXXX');

define('DSN', 'mysql:host=localhost;$dbname=application');
try {
$dbh = new PDO(DSN, USER, PASS);
}catch (PDOException $e) {
print "Erreur ! : ". $e->getMessage(). "<br />";
die();
}

//création de la requête

$nom_sql = $dbh->quote($nom) ;
$pass_sql = $dbh->quote($pass) ;

$sql = "SELECT count(*) as nbres FROM user "
. " WHERE login='$nom_sql' AND pass='$pass_sql' ";

//execution de la reqête

$result = $dbh->query($sql);
$row = $result->fetch();
$result = null ;

if($row['nbres'] == 1) {
return TRUE;
}else{
return FALSE;
}
}
?>

/---------------------------------------------------------------------------/

PAGE VERIFICATION

<?php
//initialisation de la session
session_start();

include ('function_verification.php');

// Ici, je ne comprend pas pourquoi ici c'est pseudo
if (isset($_POST['pseudo']) && isset($_POST['motdepasse']) ) {

// ALORS QUE LA C'EST NOM
$nom = $_POST['pseudo'];
$motdepasse = $_POST['motdepasse'];

//verification de la validité du mot de passe ET ENCORE LA NOM
if (verification($nom, $motdepasse) ) {

//si le mot de passe est valide, l'user est identifié
// en suite on change d(identifiant de session
session_regenerate_id();


// on sauveragarde son nom dans la session
$_SESSION['nom'] = $nom;

$message = " Vous &ecirc;tes correctement identifi&eacute;";
}else {
// avertissement
$message = " Erreur de mot de passe &nbsp; ";
$message .= '<a href="auth.php" />Retour</a>';
}
}else {
// avertissement
$message = " Un des champs est vide &nbsp; ";
$message .= '<a href="auth.php" />Retour</a>';
}
?>
<html><head><title>V&eacute;rification identification</title></head><body>

<?php echo $message ?>

<br /><br /></body></html>


/---------------------------------------------------------------------------/

PAGE AUTH


<form action="verif.php" method="post">
Votre Login : &nbsp; <input type="text" name="nom"><br />
Mot de passe : <input type="password" name="motdepasse"><br /><br />
<input type="submit" value="Connexion">
</form>

/---------------------------------------------------------------------------/

PAGE SECURE

<?php
session_start();

// on vérifie si l'user est bien identifié
if (!isset($_SESSION['nom'])) {

// pas identifié ou authentifié, retour au formulaire
header ('Location: auth.php');
exit();
}
?>



/---------------------------------------------------------------------------/

LES TESTS DE HACHAGE POUR SECURISER L'APPLICATION PAR LA SUITE

<strong>Crypt MD5</strong><br />
<?php
$donnee = 'secretXzB';
$md5 = md5($donnee);
echo $md5;
?>
<br /><br />
<strong>Crypt SHA1</strong><br />
<?php
$donnee = 'secretXzB';
$sha1 = sha1($donnee);
echo $sha1;
?>
<br /><br />
LA GLOBULE
le 16/07/2007 à 08:11
LA GLOBULE
Tu n'as pas tout rectifié. Il te manque les mysql_escape_string. Et tu ne testes toujours pas si tu as une erreur ou non.
jackbocar
le 16/07/2007 à 08:47
jackbocar
Bonjour,

J'ai mis des echo $sql; sous chaque ligne, elles revoient biens les requêtes et le couple login et mot de passe est correcte.

La seule erreur qui persiste c'est d'une part :
Ou compte invalide ;
Ou erreur un champ est vide.

Et lorsque je supprime les contrôles formulaires, j'ai toujours cette erreur :

Fatal error: Call to a member function fetch() on a non-object in function_verification.php on line 17

LIGNE 17 : $row = $result->fetch();

D'autre part, as-tu une autre façon de contrôler les lignes ?

Et qu'est-ce que cela change d'avoir des "mysql_escape_string" sur des données de test, qui ne sont pas codées :
Login : jack
Mot-de-passe : jackjack

Dès l'hors que le script s'arrête sur des erreurs avant la fin ?

Mais, je vais tout de même tester avec des "mysql_escape_string", voir si ça change quelque chose.

Jack Bocar
jackbocar
le 16/07/2007 à 09:15
jackbocar
Voila, j'ai fait des tests, rien ne change, toujours cette erreur :

<?php
// connection et reqête

function verification($nom,$pass) {

define('USER', 'jackbocar');
define('PASS', 'u3ZWNszehUTKxH2J');

define('DSN', 'mysql:host=localhost;$dbname=publication');
try {
$dbh = new PDO(DSN, USER, PASS);
}catch (PDOException $e) {
print "Erreur ! : ". $e->getMessage(). "<br />";
die();
}

//création de la requête
$nom_sql = $dbh->quote($nom) ;
$pass_sql = $dbh->quote($pass) ;
$sql = "SELECT count(*) as nbres FROM user "
. " WHERE login='$nom_sql' AND pass='$pass_sql' ";

//$sql = 'SELECT count(*) as nbres FROM user WHERE login="'.mysql_escape_string($nom_sql).'" AND pass="'.mysql_escape_string($pass_sql).'" ';

//$sql = 'SELECT count(*) as nbres FROM user WHERE pseudo="'.mysql_escape_string($pseudo).'" AND motdepasse="'.mysql_escape_string($motdepasse).'" ';

//$sql = 'SELECT count(*) as nbres FROM user WHERE nom_sql="'.mysql_escape_string($pseudo).'" AND pass_sql="'.mysql_escape_string($motdepasse).'" ';

//$sql = 'SELECT count(*) as nbres FROM user WHERE nom="'.mysql_escape_string($nom_sql).'" AND pass="'.mysql_escape_string($pass_sql).'" ';

//$sql = 'SELECT count(*) as nbres FROM user WHERE login="'.mysql_escape_string($_POST['nom_sql']).'" AND pass="'.mysql_escape_string($_POST['pass_sql']).'"';

//$sql = 'SELECT count(*) as nbres FROM user WHERE nom_sql="'.mysql_escape_string($_POST['nom']).'" AND pass_sql="'.mysql_escape_string($_POST['motdepasse']).'"';

//$sql = 'SELECT count(*) as nbres FROM user WHERE nom_sql="'.mysql_escape_string($_POST['login']).'" AND pass_sql="'.mysql_escape_string($_POST['motdepasse']).'"';

//$sql = 'SELECT count(*) as nbres FROM user WHERE nom="'.mysql_escape_string($_POST['pseudo']).'" AND pass="'.mysql_escape_string($_POST['motdepasse']).'"';

//$sql = 'SELECT count(*) as nbres FROM user WHERE pseudo="'.mysql_escape_string($_POST['pseudo']).'" AND motdepasse="'.mysql_escape_string($_POST['motdepasse']).'"';

//execution de la reqête
$result = $dbh->query($sql);
$row = $result->fetch();
$result = null ;
if($row['nbres'] == 1) {
return TRUE;
}else{
return FALSE;
}
}
?>



Fatal error: Call to a member function fetch() on a non-object in function_verification.php on line 43
Répondre
LoadingChargement en cours