Page 1 sur 3

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

Posté : 03 mai 2016, 14:37
par Greg Dubo
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 !"; } } ?>

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

Posté : 03 mai 2016, 14:48
par Spols
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)

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

Posté : 03 mai 2016, 14:50
par finipe
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)

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

Posté : 03 mai 2016, 15:00
par Greg Dubo
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.

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

Posté : 03 mai 2016, 15:06
par Greg Dubo
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! :(

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

Posté : 03 mai 2016, 15:28
par finipe
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; }

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

Posté : 03 mai 2016, 15:34
par Greg Dubo
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.

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

Posté : 03 mai 2016, 15:49
par finipe
...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) ?

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

Posté : 03 mai 2016, 15:57
par Spols
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 ?

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

Posté : 03 mai 2016, 16:31
par Greg Dubo
...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.

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

Posté : 03 mai 2016, 16:33
par Greg Dubo
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']));

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

Posté : 03 mai 2016, 16:40
par Spols
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']}");

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

Posté : 03 mai 2016, 16:50
par Greg Dubo
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.

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

Posté : 03 mai 2016, 16:53
par Spols
$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 \ ?

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

Posté : 03 mai 2016, 17:18
par Greg Dubo
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.