[RESOLU] Connexion à un espace membre en PDO

Eléphant du PHP | 386 Messages

20 mars 2013, 03:00

Bonjour,

Je recrée tous mes codes mysql classique en PDO (qui est plus rapide) et j'ai un problème avec le formulaire de connexion à l'espace membre :

- J'ai ce message d'erreur au submit :

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /public_html/ajax/login.php on line 16

- Voici la ligne 16 : $req->execute();

J'aimerais aussi rendre cette requête sécurisée, mais ce n'est pas la même méthode en PDO.
session_start();
require('../include/functions.inc.php');

if (isset($_SESSION['pseudo'])) :
	header('Location: ../index.php');
	exit();
endif;

$pseudo = $_POST['pseudo'];
$pass = $_POST['password'];

if (isset($_POST['submit'])) :
	if (!empty($pseudo) && !empty($pass)) :
		$req = $sql->prepare('SELECT id FROM wa_communaute WHERE pseudo = :pseudo AND pass = :password');
		$req->execute();
		$result = $req->rowCount($sql);
		if($result == 1) :
			$_SESSION['id'] = $result['id'];
			$_SESSION['pseudo'] = $_POST['pseudo'];
			$id = mysql_insert_id();
			setcookie("pseudo", $_POST["pseudo"], time() + 90 * 24 * 60 * 60, "/");
			header('Location: ../index.php');
		elseif ($result == 0) :
			$error = '<div class="error">Vos identifiants sont incorrects !</div>';
		endif;
		$req ->closeCursor () ;
		$req = null;
	else:
		$erreur = '<div class="error">Veuillez remplir tous les champs !</div>';
	endif;
endif;
Pour information, mon formulaire classique fonctionne comme ça :
session_start();
require('../include/functions.inc.php');

if (isset($_SESSION['pseudo'])) {
	header('Location: ../index.php');
	exit();
}

$pseudo = $_POST['pseudo'];
$pass = $_POST['password'];

if (isset($_POST['submit'])) {

	if (!empty($pseudo) && !empty($pass)) {
		$sql = connect_sql();
		$sql = 'SELECT id FROM wa_communaute WHERE pseudo="'.mysql_real_escape_string($_POST['pseudo']).'" AND pass="'.mysql_real_escape_string(md5($_POST['password'])).'"';
		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
		$nb = mysql_num_rows($req);
			if ($nb == 1) {
				$data = mysql_fetch_array($req);
				$_SESSION['pseudo'] = $_POST['pseudo'];
				$_SESSION['id'] = $data['id'];
				$id = mysql_insert_id();
				setcookie("pseudo", $_POST["pseudo"], time() + 90 * 24 * 60 * 60, "/");
				header('Location: ../index.php');
			}
			elseif ($nb == 0) {
				$erreur = '<div class="erreur-form">Vos identifiants sont incorrects !</div>';
			}
		mysql_free_result($req);
		mysql_close();
	}
	else {
		$erreur = '<div class="erreur-form">Veuillez remplir tous les champs !</div>';
	}
}
Merci d'avance pour votre aide

Eléphanteau du PHP | 46 Messages

20 mars 2013, 19:05

Tu doit appeler execute avec un tableau associatif :
 $req = $sql->prepare('SELECT id FROM wa_communaute WHERE pseudo = :pseudo AND pass = :password');
Il te faut quelque chose du style :
$array = array(":pseudo" => "Kal", ":pass" => "passpass") ;
$req->execute($array);
"Prepare" et "execute" te permettent de te protéger des injections SQL par exemple. Mais il faut bien préciser les variables quelque part.

Regardes ces exemples :
<?php
/* Exécute une requête préparée en liant des variables PHP */
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < :calories AND couleur = :couleur');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12);
$sth->execute();
?>
<?php
/* Exécute une requête préparée en passant un tableau de valeurs */
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < :calories AND couleur = :couleur');
$sth->execute(array(':calories' => $calories, ':couleur' => $couleur));
?>
<?php
/* Exécute une requête préparée en passant un tableau de valeurs */
$calories = 150;
$colour = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories < ? AND couleur = ?');
$sth->execute(array($calories, $couleur));
?>
J'espère t'avoir guidé,

Bonne continuation
Kal747
---
Envie de faire des rencontres gratuites ? Essayez mon site de rencontre
A la recherche d'une maison ou d'un appartement ? Trouvez le meilleur prix sur annonces immobilières

Eléphant du PHP | 386 Messages

20 mars 2013, 19:20

Merci pour ton message

Maintenant le problème c'est la ligne avec $_SESSION['id'] = $result['id'];

L'erreur est : Fatal error: Cannot use object of type PDOStatement as array in ...

Voici le code modifié :
if (isset($_POST['submit'])) :
	if (!empty($pseudo) && !empty($pass)) :
		$result = $connect->prepare('SELECT id FROM wa_communaute WHERE pseudo = :pseudo AND pass = :password');
		$array = array(":pseudo" => "$pseudo", ":password" => "$password");
		$result->execute($array);
		if($result == 1) :
			$_SESSION['id'] = $result['id'];
			$_SESSION['pseudo'] = $_POST['pseudo'];
			PDO::lastInsertId;
			setcookie("pseudo", $_POST["pseudo"], time() + 90 * 24 * 60 * 60, "/");
			header('Location: ../index.php');
		elseif ($result == 0) :
			$error = '<div class="error">Vos identifiants sont incorrects !</div>';
		endif;
		$sql ->closeCursor () ;
		$sql = null;
	else:
		$erreur = '<div class="error">Veuillez remplir tous les champs !</div>';
	endif;
endif;
J'ai besoin de récupérer le pseudo et le mot de passe du membre a connecter.
J'ai mis $pseudo, et $password, je ne sais pas si c'est ça :/

ViPHP
AB
ViPHP | 5818 Messages

20 mars 2013, 19:48

Tu fais une vérification avec !empty($pass) et dans ton tableau tu indique d'utiliser la variable $password... ?
Modifié en dernier par AB le 20 mars 2013, 19:49, modifié 1 fois.

Eléphanteau du PHP | 46 Messages

20 mars 2013, 19:49

Tu ne sais pas utiliser les PDO apparement, il faut que tu te renseigne : http://php.net/manual/fr/book.pdo.php

Pour compter le nombre de ligne de retour; ce n'est pas :
if($result == 1) :
Mais :
$result->rowCount() == 1
Pour le traitement :
$result->execute($array);
while($ligne = $result->fetch()) {
	// Traitement ;
        $_SESSION['id'] = $ligne['id'];
        ...
}
$result->closeCursor();
J'espère t'avoir guidé, bonne continuation.
Kal747
---
Envie de faire des rencontres gratuites ? Essayez mon site de rencontre
A la recherche d'une maison ou d'un appartement ? Trouvez le meilleur prix sur annonces immobilières

ViPHP
AB
ViPHP | 5818 Messages

20 mars 2013, 21:47

Une autre possibilité serait d'utiliser fetchAll pour récupérer tous tes résultats en une seule fois, ce qui te permettrais d'utiliser simplement un count sur le tableau des résultats :
    $sql = 'SELECT id FROM wa_communaute WHERE pseudo = :pseudo AND pass = :password';            
    $query = $connect->prepare($sql);
    
    // création du tableau des valeurs associées
    $bind['pseudo'] = $_POST['pseudo'];
    $bind['password'] = $_POST['pass'];

    $query->execute($bind);

    // On récupère tous les résultats en une seule fois sous forme de tableau  avec fetchAll
    $result = $query->fetchAll();

    if(count($result) == 1)
    {
         // si aucune session n'est démarrée on en démarre une
         if (!session_id()) session_start();

         $_SESSION['id'] = $result['id'];
         $_SESSION['pseudo'] = $_POST['pseudo'];
    }
    else
   {
     echo "problème dans l'authentification";
   }
A part cela je rejoins l'avis de Kal747, tu devrais faire plus d'exercices sur pdo avant de faire tes mises à jour de mysql vers pdo.