Page 1 sur 1

Section membre, je crois qu'il me manque un petit détail...

Posté : 12 oct. 2012, 02:12
par rickphp
Bonjour tout le monde!

Il s'agit de mon premier post sur ce forum, alors si vous acceptez de m'aider, ce serais vraiment apprécié. :) Je crois qu'il me manque quelques petites choses de logiques à comprendre au PHP...

Donc, voici mon problème. J'essai de créer une section accessible seulement aux membres d'un site web, et je vais vérifier si le pseudo et le password est présent dans la base de donnée.

Je fais différents test, si je met, exemple : if($_POST['pseudo'] == "admin").. Tout fonctionne bien. C'est lorsque j'essai d'aller chercher les données dans la BDD que ça plante.

Lorsque j'ouvre ma page "index.php" tout s'affiche bien. J'ai les champs identifiant, password et envoyer.

Lorsque j'envoie, j'ai mis une petite variable qui m'affiche OK si les champs posté on bien été stocker dans les variables. Jusque la tout va bien. Mais j'ai une erreur qui s'affiche :
Warning: mysql_fetch_array() expects parameter 1 to be resource, string given in C:\wamp\www\Projet1\index.php on line 26

Alors la, je place ce code : or die(mysql_error())

Lorsque j'envoie le formulaire, ça me dit : No databases selected

Alors là, j'inclue la connexion a la BDD directement après l'envoie du formulaire, et ça me retourne la même erreur :
Warning: mysql_fetch_array() expects parameter 1 to be resource, string given in C:\wamp\www\Projet1\index.php on line 26

Voici mon code PHP:
<?php
require('config/connect.php');
require('config/fonctions.php');

// Si il y a une donnée envoyé par le champs PSEUDO et PASSWORD, on exécute la condition
if(isset($_POST['nom']) && ($_POST['password']))
	{
		// Ici, on stock les données envoyé dans des variables
		$nom = (isset($_POST['nom']) && trim($_POST['nom']) != '') ? Verif_magicquotes($_POST['nom']) : null;
		$password = (isset($_POST['password']) && trim($_POST['password']) != '') ? Verif_magicquotes($_POST['password']) : null;
		
		
		// On vérifie si les variables contiennent des données
		if($nom && $password != '')
			{
				// en change les données de variables et les sécurisent avant la requête SQL
				$pseudo = mysql_real_escape_string($nom);
				$pass = mysql_real_escape_string($password);
				
				// on recherche dans la tables MEMBRES toutes (*) la ligne qui contient le PSEUDO et le PASSWORD envoyé
				$requete = ("SELECT * FROM membres WHERE pseudo='".$pseudo."' AND pass='".$pass."'");
				
				$req_exec = mysql_query($requete) or die(mysql_error());
				
				// Création du tableau assosiatif du résultat
				$resultat = mysql_fetch_array($requete);
				
				$erreurConnexion = "OK";
				
				// Si la base de donnée retourne des valeurs
				if(isset($resultat['pseudo'],$resultat['pass']))
					{
						$erreurConnexion = "Connexion OK";
					}
			}
		
		else
			{
				$erreurConnexion = "<span style='color:red; font-weight:bold;'>Vos identifiants sont invalides</span><br />";
			}
		
	}

?>
Voici mon formulaire :
<div id="form-connexion">
		<h1>Connexion</h1>

			<form method="post" action="index.php">
				<input type="text" placeholder="Identifiant" name="nom" class="connexion-fields" value="<?php if(isset($_POST['nom'])) echo $_POST['nom'] ?>" /><br /><br />
				<input type="password" placeholder="Mot de passe" name="password" class="connexion-fields" value="<?php if(isset($_POST['password'])) echo $_POST['password'] ?>"/><br /><br />
				<?php if(isset($erreurConnexion)) echo $erreurConnexion; ?>
				<input type="submit" value="Se connecter" class="connexion-button" />
			</form>
			<p><a href="new.php">Créer un compte</a></p>
			<p><a href="#">Mot de passe oublié?</a></p>
		
	</div>
Voici mon fichier fonction :
<?php
function Verif_magicquotes($chaine)
	{
		if(get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
		
		return $chaine;
	}
	
function check_session()
	{
		if(empty($_SESSION['membre']))
			{
				return true;
			}
	}
?>
Et mon fichier de connexion :
<?php
try{
	$bdd = new PDO('mysql:host=localhost;dbname=projet1', 'root', '') or die(print_r($bdd->errorInfo()));
	$bdd->exec('SET NAMES utf8');
	}
	
	catch(Exeption $e){
	die('Erreur:'.$e->getMessage());
	}
?>
Je suis persuadé que je ne suis vraiment pas loin, mais il me manque un petit quelque chose.

Si quelqu'un pourrait me donner un peu d'explication, ce serait vraiment très apprécié!

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 02:43
par rickphp
Ok! je crois que ça avance, voici mon code maintenant :
<?php
require('config/fonctions.php');

// Si il y a une donnée envoyé par le champs PSEUDO et PASSWORD, on exécute la condition

		if(isset($_POST['nom']))
			{
				
				// Ici, on stock les données envoyé dans des variables
				$nom = (isset($_POST['nom']) && trim($_POST['nom']) != '') ? Verif_magicquotes($_POST['nom']) : null;
				$password = (isset($_POST['password']) && trim($_POST['password']) != '') ? Verif_magicquotes($_POST['password']) : null;
				
				
				// On vérifie si les variables contiennent des données
				if(isset($nom,$password))
					{
					
				 $hostname = "localhost";
				 $database = "projet1";
				 $username = "root";
				 $password = "";
			
				 $connection = mysql_connect($hostname, $username, $password) or die(mysql_error());

				 // Connexion à la base
				 mysql_select_db($database, $connection);
			
				 // Indique à mySql de travailler en UTF-8 (par défaut mySql risque de travailler au standard ISO-8859-1)
				 mysql_query("SET NAMES 'utf8'");
						
						// on change les données de variables et les sécurisent avant la requête SQL
						$pseudo = mysql_real_escape_string($nom);
						$pass = mysql_real_escape_string($password);
						
						// on recherche dans la tables MEMBRES toutes (*) la ligne qui contient le PSEUDO et le PASSWORD envoyé
						$requete = "SELECT * FROM membres WHERE pseudo = '".$pseudo."' AND pass = '".$pass."'";  
						
						$req_exec = mysql_query($requete) or die(mysql_error());
						
						// Création du tableau assosiatif du résultat
						// $resultat = mysql_fetch_assoc($req_exec); 
						$resultat=array('pseudo'=>$pseudo,'pass'=>$pass);
						
						//$erreurConnexion = "OK";
						
						// Si la base de donnée retourne des valeurs
						if(isset($resultat['pseudo'],$resultat['pass']))
							{
								$erreurConnexion = "Connexion OK2";
							}
						else	
							{
								$erreurConnexion = "<span style='color:red; font-weight:bold;'>Vos identifiants sont invalides</span><br />";
							}
					}
				
				else
					{
						
					}
				
			}


?>
Le seul problème, c'est que peu important les données rentré dans les champs, je me rend à : $erreurConnexion = "Connexion OK2";

Cela veut dire que le script ne va pas vérifier si les données sont exacte dans la BDD...

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 09:02
par xTG
Tu remplies manuellement la variable de retour BDD. O____o

Tu peux utiliser mysql_num_rows() pour compter le nombre de ligne retournée, dans ton cas soit cela retourne 1 et le membre est correct, soit il y a un souci.
Utilises les fonctions de type mysql_fetch_xxx pour récupérer les données renvoyées par un mysql_query.

Penses à une migration vers le drivers mysqli et ses fonctions qui sont à jour alors que celles du drivers de mysql sont abandonnées depuis plus d'un an.

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 09:04
par Mazarini
(grillé par xTG, mais maintenant que c'est écrit...)

Bonjour,

Il te manque l'utilisation de la fonction mysql_fetch_array() pour récupérer les données ou de la fonction mysql_num_rows() pour savoir combien de ligne te retourne la requête.

Une lecture de la base de données se fait un 2 étapes :
- exécution de la requête (mysql_query())
- boucle de lecture des résultats (mysql_fetch_array() ou d'autres fonctions de "fetch") ; une seule lecture à faire si tu est sur qu'il y a une seule ligne de résultat.

Pour les mise à jour de base de données, mysql_query() est suffisant, même si d'autres fonctions permettent d'en contrôler l'exécution en donnant l'identifiant ou le nombre de ligne affectées par la requête.

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 09:13
par moogli
salut,


si tu relit ton script tu devrais y voir un problème.

par exemple

$pseudo et $pass c'est les valeurs de ton formulaire, en clair le reste ne sert à rien on se connecte avec n'importe quoi !
<?php
$resultat=array('pseudo'=>$pseudo,'pass'=>$pass);

if(isset($resultat['pseudo'],$resultat['pass'])){
	$erreurConnexion = "Connexion OK2";
}
else{
	$erreurConnexion = "<span style='color:red; font-weight:bold;'>Vos identifiants sont invalides</span><br />";
}
pourquoi as tu mis le $resultat = mysql_fetch_assoc($req_exec); en commentaire ?

if(isset($nom,$password))
A cette ligne c'est le troisième isset sur le nom, c'est p'tet un peux trop ;)


tu peux faire un truc dans se style
<?php
require('config/fonctions.php');

// Si il y a une donnée envoyé par le champs PSEUDO et PASSWORD, on exécute la condition

if(!empty($_POST['nom']) && !empty($_POST['password'])){

	$_POST['nom'] = Verif_magicquotes($_POST['nom']);
	$_POST['password'] = Verif_magicquotes($_POST['password']);

	$hostname = "localhost";
	$database = "projet1";
	$username = "root";
	$password = "";

	$connection = mysql_connect($hostname, $username, $password) or die(mysql_error());

	// Connexion à la base
	mysql_select_db($database, $connection);

	// Indique à mySql de travailler en UTF-8 (par défaut mySql risque de travailler au standard ISO-8859-1)
	mysql_query("SET NAMES 'utf8'");

	// on recherche dans la tables MEMBRES toutes (*) la ligne qui contient le PSEUDO et le PASSWORD envoyé
	$requete = "SELECT * FROM membres WHERE pseudo = '".mysql_real_escape_string($_POST['nom'])."'"; // on ne passe pas le mot de passe dans la requete !
	$req_exec = mysql_query($requete) or die(mysql_error());
	if ($req_exec !== false) {
		// Création du tableau assosiatif du résultat
		$resultat = mysql_fetch_assoc($req_exec);
		if( mysql_num_rows($resultat) == 1){
			// vu que je ne connais pas la structure de ta base je fait au mieux :)
			if ($result['motdepasse']==$_POST['password']){
				// connexion ok
				$_SESSION['user'] =  $resultat;
				echo 'Connexion OK';
			}
			else {
				echo '<p class="erreur">MDP ko</p>';
			}
		}
		else {
			echo '<p class="erreur">Pseudo inconnu</p>';
		}
	}
	else {
		// Attention a n'afficher que pour le dev les messages sql ne sont que pour toi
		echo '<p class="erreur">Erreur à la connexion <br />Erreur SQL : '.mysql_error().'<br/> avec la requete '.$requete.'</p>';
	}
}
?>

@+

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 14:06
par rickphp
Merci beaucoup pour ses explications! J'analyse tout ça, je corrige mon code et je vous tiens au courant :)

Re: Section membre, je crois qu'il me manque un petit détail

Posté : 12 oct. 2012, 20:44
par rickphp
Bon, ça fonctionne maintenant très bien avec ce code :)
<?php
require('config/connect.php');
require('config/fonctions.php');

// Premièrement, on vérifie s'il les champs PSEUDO et PASSWORD envoyé contiennent des valeurs

if(!empty($_POST['pseudo']) && !empty($_POST['password']))
	{
		
		$_POST['pseudo'] = Verif_magicquotes($_POST['pseudo']);
		$_POST['password'] = Verif_magicquotes($_POST['password']);
		
		$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
		mysql_set_charset('utf8',$connection);
		if (!$connection) {
			die("Database connection failed: " . mysql_error());
		}
		
		$db_select = mysql_select_db(DB_NAME,$connection);
		if (!$db_select) {
		die("Database selection failed: " . mysql_error());
		}
		// Allons chercher toutes * la ligne contenent le pseudo envoyé dans la table membres
		$requete = "SELECT * FROM membres WHERE pseudo = '".mysql_real_escape_string($_POST['pseudo'])."'";
		$req_exec = mysql_query($requete) or die(mysql_error());
		
		// Si on peu accéder à la base de donnée
		if($req_exec)
			{
				// On créer un tableau associatif contenant le résultat de la demande SQL
				$resultat = mysql_fetch_array($req_exec);
				
				// On vérifier si la ligne contenent le pseudo envoyé de la base de donnée est identique a la valeur posté
				if($resultat['pseudo'] == $_POST['pseudo'])
					{
						
						// Si le pseudo est bien présent dans la base de donnée, nous avons extrait les données dans un tableau, alors vérifions si le mot de passe envoyé correspond au pseudo envoyé
						
						if($resultat['pass'] == $_POST['password'])
							{
								$erreurConnexion = "<span style='color:red; font-weight:bold;'>Connexion réussie</span><br />";
							}
						// Sinon, si le mot de passe est innexacte, on affiche
						else
							{
								$erreurConnexion = "<span style='color:red; font-weight:bold;'>Votre mot de passe est invalide</span><br />";
							}
					}
				// Si la base de donnée ne trouve pas le pseudo, on affiche
				else
					{
						$erreurConnexion = "<span style='color:red; font-weight:bold;'>Identifiants invalides</span><br />";
					}
			}
		// Si on ne peu pas accéder à la base de donnée, on affiche l'erreur
		else
			{
				echo '<p class="erreur">Erreur à la connexion <br />Erreur SQL : '.mysql_error().'<br/> avec la requete '.$requete.'</p>';
			}
	}

?>