Rediriger vers la page X ou Y en fonction de la base de données

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 mai 2016, 17:58

Bonjour, si les utilisateurs sont redirigés de la même manière, c'est que le résultat contenu dans $usercontribution n'est pas bon ou du moins pas celui que tu attends.

En l'occurrence, le résultat de query() est un objet PDOStatement. Cette méthode ne retourne FALSE qu'en cas d'erreur technique : pas de connexion à la base, la table demandée n'existe pas, erreur dans le nom de colonne etc. Si aucun enregistrement n'est trouvé, la méthode retourne un objet PDOStatement vide. Mais puisqu'elle retourne toujours un objet, ta condition " if ($usercontribution) " est toujours vraie.

Au lieu d'un "SELECT * FROM contributions ..." qui va te retourner tous les enregistrements de l'utilisateur dont tu n'as que faire, fais plutôt un " SELECT COUNT(*) FROM contributions ... " pour connaitre le nombre d'enregistrements présents en base pour cet utilisateur. Récupère le résultat de la requête et modifier ton test : si le résultat > 0 alors l'utilisateur a déjà contribué :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

04 mai 2016, 15:28

Merci encore pour ces informations, mais je ne m'en sors toujours pas.

Dans la table "members" je n'ai que 3 membres :
1. Pierre
2. Paul
3. Jacques

Dans la table "contributions" :
• Pierre et Paul ont déjà fait leur contribution, ils doivent être redirigés vers la page 2.
• Jacques étant le seul à ne pas avoir contribué, il doit être redirigé vers la page 1.

Mon souci est que Jacques est aussi redirigé vers la page 2 avec ce code :

Code : Tout sélectionner

$usercontribution = $bdd->query("SELECT COUNT(*) FROM contributions WHERE username = \"{$_SESSION['username']}\" ");
Pourtant il est bien redirigé vers la page 1 en essayant ce code :

Code : Tout sélectionner

$usercontribution = $bdd->query("SELECT COUNT(*) FROM contributions WHERE username = 'Jacques' ");
Mon problème semble donc se situer dans $_SESSION['username'] ? N'est-ce pas la bonne méthode pour identifier l'utilisateur d'une session ? dans une requête ?

Je récapitule mon code dans son ensemble :

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('mysql:host=127.0.0.1;dbname=*****;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); if(isset($_POST['formconnection'])) { if(!empty($_POST['codeconnect'])) { $userconnect = $bdd->prepare("SELECT * FROM members WHERE password = ?"); $userconnect->execute(array($_POST['passwordconnect'])); $userexist = $userconnect->rowCount(); if($userexist == 1) { $userinfo = $userconnect->fetch(); $_SESSION['id'] = $userinfo['id']; $_SESSION['username'] = $userinfo['username']; //MON PROBLÈME SEMBLE SE SITUER DANS LES 2 LIGNES SUIVANTES $usercontribution = $bdd->query("SELECT COUNT(*) FROM contributions WHERE username = \"{$_SESSION['username']}\" "); if($usercontribution > 0)) { header("Location:contribute.php?id=".$_SESSION['id']."&username=".$_SESSION['username']); exit; } else{ header("Location:contributions.php?id=".$_SESSION['id']."&username=".$_SESSION['username']); exit; } } else { $erreur = "<br />Mot de passe erroné !"; } } else { $erreur = "Tapez votre mot de passe !"; } } ?>

Mammouth du PHP | 1967 Messages

04 mai 2016, 15:40

affiche ta requète
echo "SELECT COUNT(*) FROM contributions
WHERE username = \"{$_SESSION['username']}\" ";
pour voir si elle est correct ou non
si elle ne l'est pas c'est que $_SESSION['username'] ne l'est pas donc $userinfo['username'] ne l'est pas non plus donc ta première requète ne retourne pas le bon username
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 15:47

Le 'username' s'affiche bien en faisant un echo "SELECT COUNT(*) FROM contributions
WHERE username = \"{$_SESSION['username']}\" ";

Resultat : SELECT COUNT(*) FROM contributions WHERE username = "Jacques"

Mammouth du PHP | 1967 Messages

04 mai 2016, 15:51

et avec des simple quote ' à la place des double " ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 15:56

J'obtiens cette erreur :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\'Jacques\'' at line 1' in /Applications/XAMPP/xamppfiles/htdocs/series/Svm/svm_home.php:26 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/series/Svm/svm_home.php(26): PDO->query('SELECT COUNT(*)...') #1 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/series/Svm/svm_home.php on line 26

Mammouth du PHP | 1967 Messages

04 mai 2016, 16:04

mais sans caractère d'échappement alors bien sur ;-)
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 16:07

Hélas c'est pareil, Jacques est encore redirigé vers la page 2.

Mammouth du PHP | 1967 Messages

04 mai 2016, 16:28

essaye un var_dump($usercontribution); juste avant le if
et vois le résultat à mon avis tu ne teste pas la bonne valeur
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 16:38

De la sorte ?

Code : Tout sélectionner

$usercontribution = $bdd->query("SELECT COUNT(*) FROM contributions WHERE username = '{$_SESSION['username']}' "); var_dump($usercontribution); if($usercontribution > 0)
L'utilisateur 'Jacques' est encore redirigé vers la mauvaise page.
Modifié en dernier par Greg Dubo le 04 mai 2016, 16:40, modifié 1 fois.

Mammouth du PHP | 1967 Messages

04 mai 2016, 16:40

ce n'est pas l'utilité du var_dump, c'est plutot pour voir le résultat de ta requète, ajoute un exit; juste aprés pour voir le retour de var_dump
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 16:43

Code : Tout sélectionner

$usercontribution = $bdd->query("SELECT COUNT(*) FROM contributions WHERE username = '{$_SESSION['username']}' "); var_dump($usercontribution); exit;
J'obtiens ceci :

object(PDOStatement)#3 (1) { ["queryString"]=> string(65) "SELECT COUNT(*) FROM contributions WHERE username = 'Jacques' " }

Mammouth du PHP | 1967 Messages

04 mai 2016, 16:46

Code : Tout sélectionner

$usercontribution = $bdd->query("SELECT COUNT(*) AS count FROM contributions WHERE username = '{$_SESSION['username']}' "); var_dump($usercontribution); exit;
et avec ceci ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

04 mai 2016, 16:48

Ceci résulte :

object(PDOStatement)#3 (1) { ["queryString"]=> string(74) "SELECT COUNT(*) AS count FROM contributions WHERE username = 'Jacques' " }

Mammouth du PHP | 1967 Messages

04 mai 2016, 16:54

Je pense que tu devrai utiliser
$userconnect = $bdd->prepare("SELECT ...");
$userconnect->execute(array(...));
plutot que query car il ne semble pas t'apporter le résultat de la requète
tu pourra ainsi fair un fetch pour en récupèrer le résultat.

Ne remet en place ta redirection que lorsque tu aura une valeur correct à mettre dans ta condition tu y verra plus clair
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube