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

Eléphanteau du PHP | 16 Messages

03 mai 2016, 14:37

Bonjour à toutes et à tous,

1. Ça fait plus de 3 semaines que j'essaie d'exécuter la tâche suivante :
"Si le membre qui se connecte a déjà fait une contribution dans la base de données, le rediriger vers la page X. Sinon, le rediriger vers la page Y."

2. Pour cela j'ai deux tables dans ma base de données :
• Members (id, username, password)
• Contributions (id, username, post)


3. Le membre parvient à se connecter sans problème et obtient une session :
• $_SESSION['id']

4. Le problème est que je n'arrive toujours pas à le rediriger vers la page souhaitée. Merci d'avance pour votre aide.

Voici mon code :

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']; //MON PROBLÈME SE SITUE DANS LES 2 LIGNES SUIVANTES $usercontribution = $bdd->query("SELECT * FROM contributions WHERE username = {$_SESSION['id']}"); if(isset($usercontribution)) { header("Location:contribute.php?id=".$_SESSION['id']); } else{ header("Location:contributions.php?id=".$_SESSION['id']); } } else { $erreur = "<br />Mot de passe erroné !"; } } else { $erreur = "Tapez votre mot de passe !"; } } ?>
Modifié en dernier par Greg Dubo le 03 mai 2016, 14:49, modifié 1 fois.

Mammouth du PHP | 1967 Messages

03 mai 2016, 14:48

Tes requète retourne un objet PDOStatement (voir le manuel sur php.net) il faut que tu traite cet objet en tant que tel.

Je pense que tu aurrais plutot intèret à utiliser une jointure et ainsi récupèrer le nombre de contribution de l'utilisateur, si il est supérieur à 0 redirection A sinon B

Autre remarque, Si 2 utilisateurs ont le même mot de passe, il me semble qu'ucun des deux ne pourra se connecter. De plus il est fortement déconseillé de stocker les mot de passe en clair dans une BDD renseigne toi sur les algorythme de hashage (c'est assez simple)
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 337 Messages

03 mai 2016, 14:50

Qu'est-ce qui se passe exactement ? As-tu une redirection, ou rien du tout ?

(et sinon, n'oublie pas de rajouter un "exit;" après ta redirection)

Eléphanteau du PHP | 16 Messages

03 mai 2016, 15:00

Je pense que tu aurrais plutot intèret à utiliser une jointure et ainsi récupèrer le nombre de contribution de l'utilisateur, si il est supérieur à 0 redirection A sinon B

Autre remarque, Si 2 utilisateurs ont le même mot de passe, il me semble qu'ucun des deux ne pourra se connecter.
En fait les membres ne pourraient faire qu'une contribution lors d'un événement spécifique, c'est pourquoi je souhaite rediriger soit vers la page "Faites votre contribution" si n'est pas encore faite... soit vers la page "Découvrir les contributions" si déjà faite.

Sinon le service ne devrait comporter qu'une dizaine de membres, dont c'est moi qui leur confierait leur mot de passe en privé pour simplifier le processus.
Modifié en dernier par Greg Dubo le 03 mai 2016, 15:22, modifié 5 fois.

Eléphanteau du PHP | 16 Messages

03 mai 2016, 15:06

Qu'est-ce qui se passe exactement ? As-tu une redirection, ou rien du tout ?
Il y a bien une redirection. Le problème c'est que soit les membres sont tous redirigés vers la page X, soit ils sont tous redirigés vers la page Y, en essayant toutes sortes de formules.

Pourtant ce que je veux c'est rediriger les membres qui n'ont pas encore contribué vers la page X, et ceux qui ont déjà contribué vers la page Y. I'm lost! :(

Eléphant du PHP | 337 Messages

03 mai 2016, 15:28

Pas trop sûre de moi, mais je dirais que la ligne suivante pose problème :

Code : Tout sélectionner

if(isset($usercontribution))
La requête query d'interrogation de la base de données renvoie la valeur FALSE si rien n'est trouvé, donc $usercontribution est bien définie, mais si c'est false. Essaye avec :

Code : Tout sélectionner

$usercontribution = $bdd -> query("SELECT * FROM contributions WHERE username = {$_SESSION['id']}"); if($usercontribution) // Renvoie TRUE { header("Location:contribute.php?id=".$_SESSION['id']); exit; } else // Renvoie FALSE { header("Location:contributions.php?id=".$_SESSION['id']); exit; }

Eléphanteau du PHP | 16 Messages

03 mai 2016, 15:34

Hélas j'obtiens encore le même résultat : les contributeurs comme les non-contributeurs sont redirigés sur la même (seconde) page.

Eléphant du PHP | 337 Messages

03 mai 2016, 15:49

...et avec ça ?

Code : Tout sélectionner

query("SELECT * FROM contributions WHERE username=\"".$_SESSION['id']."\"");
Si ça marche pas, c'est que ta requête est mauvaise puisqu'elle renvoie systématiquement false.
$_SESSION['id'] est-il bien défini ? N'y a-t-il pas une faute (du genre contribution au lieu de contributions) ?

Mammouth du PHP | 1967 Messages

03 mai 2016, 15:57

Il semble y avoir également confusion entre username et id
Qu'enregistre tu dans ta table contribution ? le username ou l'id de ta table user ?
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

03 mai 2016, 16:31

...et avec ça ?
Si ça marche pas, c'est que ta requête est mauvaise puisqu'elle renvoie systématiquement false.
$_SESSION['id'] est-il bien défini ? N'y a-t-il pas une faute (du genre contribution au lieu de contributions) ?
Toujours pareil hélas. Oui, $_SESSION['id'] est bien défini. Et fonctionne sans problème dans d'autres sections du site. Pas de typo non plus, 'contributions' au pluriel.

Eléphanteau du PHP | 16 Messages

03 mai 2016, 16:33

Il semble y avoir également confusion entre username et id
Qu'enregistre tu dans ta table contribution ? le username ou l'id de ta table user ?
Dans la table contributions, j'enregistre le username, de la table membre.

Code : Tout sélectionner

$requser = $bdd->prepare('INSERT INTO contributions(username, post) VALUES(?, ?)'); $requser->execute(array($userinfo['username'], $_POST['message']));
Modifié en dernier par Greg Dubo le 03 mai 2016, 16:40, modifié 1 fois.

Mammouth du PHP | 1967 Messages

03 mai 2016, 16:40

Dans ce cas, tu devrai utiliser le username et non pas l'id dans ta requète
$userinfo = $userconnect->fetch();
            $_SESSION['id'] = $userinfo['id'];
            $_SESSION['username'] = $userinfo['username'];

            //MON PROBLÈME SE SITUE DANS LES 2 LIGNES SUIVANTES
            $usercontribution = $bdd->query("SELECT * FROM contributions WHERE username = {$_SESSION['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

03 mai 2016, 16:50

Spols, j'avais essayé cela en effet. Mais quand l'utilisateur se connecte il reçoit un message d'erreur dont je peine à comprendre :

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 'James' at line 1' in /Applications/XAMPP/xamppfiles/htdocs/series/Svm/home.php:24 Stack trace: #0 /Applications/XAMPP/xamppfiles/htdocs/series/Svmmvm/svm_home.php(24): PDO->query('SELECT * FROM c...') #1 {main} thrown in /Applications/XAMPP/xamppfiles/htdocs/series/Svm/home.php on line 24

Je suppose que cela fait référence à ce que tu m'expliquais dans ton premier message : "Tes requète retourne un objet PDOStatement (voir le manuel sur php.net) il faut que tu traite cet objet en tant que tel." Correct ?

Je consulte le manuel.

Mammouth du PHP | 1967 Messages

03 mai 2016, 16:53

$userinfo = $userconnect->fetch();
            $_SESSION['id'] = $userinfo['id'];
            $_SESSION['username'] = $userinfo['username'];

            //MON PROBLÈME SE SITUE DANS LES 2 LIGNES SUIVANTES
            $usercontribution = $bdd->query("SELECT * FROM contributions WHERE username = \"{$_SESSION['username']}\"");
Et en ajoutant des " échappé par un \ ?
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

03 mai 2016, 17:18

Plus de fatal error, merci pour cette astuce. Malheureusement j'ai encore le même problème qu'au départ – les membres qui ont déjà contribué, comme ceux qui n'ont pas encore contribué, sont redirigés vers la même page.

Au moins maintenant que je parviens à échapper le "fatal error", peut-être que je trouverai la solution à mon problème en essayant différentes formules. Je vous tiens au courant.