Bonjour ou Bonsoir ,
Voila je rencontre un petit problème avec mon code.
J'ai coder en php une redirection de page vers mon formulaire de connection pour être admin jusque là tout va bien.
En codant le php du formulaire tous fonctionner très bien mais des que j'ai rajouter ceci !empty($_POST). Le code 'plante' en gros mon code php ne fonctionne plus.
Voici le Code php en question :
<?php session_start() ?>
<?php
require ('../includes/database.php');
if (isset($_POST) AND !empty($_POST)) {
if (!empty(htmlspecialchars($_POST['username'])) AND !empty(sha1($_POST['password']))) {
$req = $db->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$req->execute([
'username' => $_POST['username'],
'password' => $_POST['password']
]);
$user = $req->fetch();
if ($user) {
$_SESSION['admin'] = $_POST['username'];
header('location:index.php');
}
else {
$error = 'Indentifiant incorrect';
}
}
else {
$error = 'Veuillez remplir tous les champ !';
}
}
?>
N'ayant pas trouver le problème surement a cause de la fatigue je me tourne vers vous pour m'aider a le réssoudre.
Bonsoir.
Pour information, isset
et empty
ont quasiment la même fonctionnalité :
empty
Détermine si une variable est considérée comme vide.
Une variable est considérée comme vide si elle n'existe pas, ou si sa valeur équivaut à FALSE.
Sinon, à la place d'utiliser AND, tu devrais plutôt utiliser &&, voir Les opérateurs logiques, tu verras qu'il y a une différence entre les deux opérateurs.
Par contre, je ne vois pas l'intérêt d'utiliser des fonctions dans les fonctions alors que tu es dans des conditions, par exemple :
if (!empty(htmlspecialchars($_POST['username'])))
Au cas où tu ne le sache pas, ça ne modifies pas la valeur de $_POST['username']
.
Il vaut mieux à la rigueur que tu fasses :
if (!empty($_POST['username']) AND !empty($_POST['password'])) {
$req = $db->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$req->execute([
'username' => htmlspecialchars($_POST['username']),
'password' => sha1($_POST['password'])
]);
// etc ...
}
Bonjour Lartak, ayant tester les modifications que tu ma apporté cela n'a pas résolue mon problème.
Mon problème est que mon system de connection : 1 - ne me connecte pas.
2 - n'affiche pas les erreurs.
Pour faciliter la résolution du problème je met a disposition les 3 codes qui sont concerné :
Database.php check elle fonctionne :)
<?php
$db = new PDO('mysql:host=localhost;dbname=admin', 'root', 'root');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
Index.php
<?php session_start() ?>
<?php
require '../includes/database.php';
if (!$_SESSION['admin']) {
header('location:login.php');
}
$req = $db->query('SELECT * FROM users');
$user = $req->fetch();
?>
<!DOCTYPE html>
<html>
<head>
<!-- BASIC -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Log'n'Game</title>
<meta name="keywords" content="" />
<meta name="description" content="">
<meta name="author" content="YeQiu">
<!-- TOOLS CSS -->
<link href="../assets/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!-- CSS -->
<link href="../assets/css/style.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/global.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/responsive.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="background" class="container-fuild"></div>
<header class="container">
<div class="logo">
<h1>
<a href="#"><h2>Log'n'Game</h2>Communauté Minecraft</a>
</h1>
</div>
<nav class="navbar navbar-expand-lg navbar-light my-navbar">
<a class="navbar-brand" href="index.php">Navigation</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<a class="nav-item nav-link active" href="../index.php">Accueil <span class="sr-only">(current)</span></a>
<a class="nav-item nav-link" href="../news.php">News</a>
<a class="nav-item nav-link" href="#">Boutique</a>
<a class="nav-item nav-link disabled" href="">A venir</a>
</div>
</div>
</nav>
</header>
<div class="container admin">
<h3>Bienvenue <?= $_SESSION['admin'] ?></h3>
</div>
<!-- ========= script ========== -->
<!-- Vendor -->
<script type="text/javascript" src="../assets/vendor/jquery.min.js"></script>
<script type="text/javascript" src="../assets/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
Login .php
<?php session_start() ?>
<?php
require '../includes/database.php';
if (isset($_POST) && !empty($_POST)) {
if (!empty($_POST['username']) AND !empty($_POST['password'])) {
$req = $db->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$req->execute([
'username' => htmlspecialchars($_POST['username']),
'password' => sha1($_POST['password'])
]);
$user = $req->fetch();
if ($user) {
$_SESSION['admin'] = $_POST['username'];
header('location:index.php');
}
else {
$error = 'Indentifiant incorrect';
}
}
else {
$error = 'Veuillez remplir tous les champ !';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<!-- BASIC -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Log'n'Game</title>
<meta name="keywords" content="" />
<meta name="description" content="">
<meta name="author" content="YeQiu">
<!-- TOOLS CSS -->
<link href="../assets/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!-- CSS -->
<link href="../assets/css/style.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/global.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/responsive.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="background" class="container-fuild"></div>
<header class="container">
<div class="logo">
<h1>
<a href="#"><h2>Log'n'Game</h2>Communauté Minecraft</a>
</h1>
</div>
<nav class="navbar navbar-expand-lg navbar-light my-navbar">
<a class="navbar-brand" href="index.php">Navigation</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<a class="nav-item nav-link active" href="../index.php">Accueil <span class="sr-only">(current)</span></a>
<a class="nav-item nav-link" href="../news.php">News</a>
<a class="nav-item nav-link" href="#">Boutique</a>
<a class="nav-item nav-link disabled" href="">A venir</a>
</div>
</div>
</nav>
</header>
<div class="container admin">
<?php
if (isset($error)) {
echo '<div class="error">'. $error .'</div>';
}
?>
<form class="container center_div" action="index.php" method="POST">
<div class="form-group">
<label for="formGroupExampleInput">Username</label>
<input name="username" type="text" class="form-control" id="formGroupExampleInput" >
</div>
<div class="form-group">
<label for="formGroupExampleInput2">Password</label>
<input name="password" type="password" class="form-control" id="formGroupExampleInput2" >
</div>
<div class="form-group">
<button class="btn btn-default" type="submit">Se connecter</button>
</div>
</form>
</div>
<!-- ========= script ========== -->
<!-- Vendor -->
<script type="text/javascript" src="../assets/vendor/jquery.min.js"></script>
<script type="text/javascript" src="../assets/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
En fait, ça me parait plutôt logique ton problème, tu diriges ton formulaire vers la page index.php, alors que son traitement s'effectue sur la page courante, soit la page login.php.
Donc si le formulaire ne peut pas être traité, ton système de connexion ne pourra pas fonctionner.
Merci de votre réponse mes erreur s'affiche bien mais la redirection ne fonctionne pas ainsi que la connection.
Voici le code dans son état actuelle :
<?php session_start() ?>
<?php
require '../includes/database.php';
if (isset($_POST) AND !empty($_POST)) {
if (!empty($_POST['username']) && !empty($_POST['password'])) {
$username = htmlentities($_POST['username'], ENT_QUOTES, "ISO-8859-1");
$password = htmlentities($_POST['password'], ENT_QUOTES, "ISO-8859-1");
$req = $db->prepare("SELECT * FROM admin_users WHERE username = '".$username." AND password = ".sha1($password)."'");
$req->execute([
'username' => $username,
'password' => $password
]);
$user = $req->fetch();
if ($user) {
$_SESSION['admin'] = $username;
header('location:index.php');
}
else {
$error = 'Identifiant incorrect !';
}
}
else {
$error = 'Veuillez remplir tous les champs';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<!-- BASIC -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Log'n'Game</title>
<meta name="keywords" content="" />
<meta name="description" content="">
<meta name="author" content="YeQiu">
<!-- TOOLS CSS -->
<link href="../assets/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!-- CSS -->
<link href="../assets/css/style.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/global.css" rel="stylesheet" type="text/css"/>
<link href="../assets/css/responsive.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="background" class="container-fuild"></div>
<header class="container">
<div class="logo">
<h1>
<a href="#"><h2>Log'n'Game</h2>Communauté Minecraft</a>
</h1>
</div>
<nav class="navbar navbar-expand-lg navbar-light my-navbar">
<a class="navbar-brand" href="index.php">Navigation</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<a class="nav-item nav-link active" href="../index.php">Accueil <span class="sr-only">(current)</span></a>
<a class="nav-item nav-link" href="../news.php">News</a>
<a class="nav-item nav-link" href="#">Boutique</a>
<a class="nav-item nav-link disabled" href="">A venir</a>
</div>
</div>
</nav>
</header>
<div class="container admin">
<?php
if (isset($error)) {
echo '<div class="error">'. $error .'</div>';
}
?>
<form class="container center_div" action="login.php" method="POST">
<div class="form-group">
<label for="formGroupExampleInput">Username</label>
<input name="username" type="text" class="form-control" id="formGroupExampleInput" >
</div>
<div class="form-group">
<label for="formGroupExampleInput2">Password</label>
<input name="password" type="password" class="form-control" id="formGroupExampleInput2" >
</div>
<div class="form-group">
<button class="btn btn-default" type="submit" >Se connecter</button>
</div>
</form>
</div>
<!-- ========= script ========== -->
<!-- Vendor -->
<script type="text/javascript" src="../assets/vendor/jquery.min.js"></script>
<script type="text/javascript" src="../assets/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
pour information mon scriptage de mot de passe dans phpmyAdmin est en sha1
Donc il me manque plus que la redirection a faire mais je n'arrive pas trouvers le problème :/
Je vois deux erreurs dans ta requête SQL
tu ne peux pas utiliser 'prepare' sans indiquer les placeholders (:user ...) car tu passes toujours les paramètres
si tu décide d'insérer directement les valeurs, alors mets bien des quotes pour les chaines (pour user et le sha1)
Je te conseille de revenir à la première version, celle avec les placeholders
Comme tu utilises PDO::ERRMODE_EXCEPTION, tu devrais intercepter les erreur SQL en utilisant un try catch
Bonjour Huggy voilà j'ai réussie a me connecter en mettant a la requete *$req = $db->prepare("SELECT FROM admin_users WHERE 1"); **:
if (isset($_POST) AND !empty($_POST)) {
if (!empty($_POST['username']) && !empty($_POST['password'])) {
$username = htmlentities($_POST['username'], ENT_QUOTES, "ISO-8859-1");
$password = sha1($_POST['password']);
$req = $db->prepare("SELECT * FROM admin_users WHERE 1");
$req->execute([
'username' => $username,
'password' => $password
]);
$user = $req->fetch();
if ($user) {
$_SESSION['admin'] = $username;
header('location:index.php');
}
else {
$error = 'Identifiant incorrect !';
}
}
else {
$error = 'Veuillez remplir tous les champs';
}
}
Donc je voudrais savoir si avec ce code il prend en compte mon cryptage en sha1 pour le password ?
Non, là ta requête ne filtre rien, elle retourne tous les utilisateurs mais le fetch prend le premier.
la première version était correcte
$req = $db->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$req->execute([
'username' => $_POST['username'],
'password' => $_POST['password']
]);
fait un echo du sha1 puis tu compares avec celui inscrit dans la base de données
il y a peut être un 'salt' rajouté
En revenant a la premiere version comme tu me la conseiller je revien au même problème je ne peut pas me connecter
voilà le code actuelle :
if (isset($_POST) AND !empty($_POST)) {
if (!empty($_POST['username']) && !empty($_POST['password'])) {
$username = htmlentities($_POST['username'], ENT_QUOTES, "ISO-8859-1");
$password = sha1($_POST['password']);
$req = $db->prepare("SELECT * FROM admin_users WHERE username = :username && password = :password ");
$user = $req->fetch();
echo '|',$password,'|<br />';
var_dump($req);
$req->execute([
'username' => $username,
'password' => $password
]);
if ($user) {
$_SESSION['admin'] = $username;
header('location:index.php');
}
else {
$error = 'Identifiant incorrect !';
}
}
else {
$error = 'Veuillez remplir tous les champs';
}
}
J'affiche un echo pour voir la valeur du password puis je n'obtiens pas pareil que sur la db donc serait t-il possible que tu me montre un exemple concret pour m'aider merci :)
UP j'ai réussie le problème venais de la base elle même donc je les refaite :) !
voilà le code finale qui fonctionne mais je souhaite avnt tous savoir si il prend en compte le sha1 (car le echo affiche bien la clé) :
<?php session_start() ?>
<?php
require '../includes/database.php';
if (isset($_POST) && !empty($_POST['username']) && !empty($_POST['password'])) {
$username = htmlentities($_POST['username'], ENT_QUOTES, "ISO-8859-1");
$password = sha1($_POST['password']);
$req = $db->prepare("SELECT * FROM admin_users WHERE username ='$username' && password ='$password'");
//echo '|',$password,'|<br />';
//var_dump($req);
$req->execute([
'username' => $username,
'password' => $password
]);
$user = $req->fetch();
if ($user) {
$_SESSION['admin'] = $username;
header('location:index.php');
}
else {
$error = 'Identifiant incorrect !';
}
}
else {
$error = 'Veuillez remplir tous les champs';
}
?>
Merci pour ceux qui mon aidez à régler ce problème qui était sans doute facile pour les connaisseur :)