Salutation à tous
Après avoir commencer l’internationalisation de mon site, j'ai remarquer que les cookies de connexion ne fonctionnaient pas.
De ce fait j'ai créer une table contenant le SiD d'un utilisateur, afin de l'envoyer en paramètre de valeur pour le cookie.
Voici ce que j'ai fait (en local cela fonctionne excellemment bien, mais pas en production)
Pour la connexion
$expire = time() + 365*24*3600;
/* **** */
$query_id=$cnx->prepare('SELECT user_sid
FROM t_user_sid
WHERE users_id = :users_id');
$query_id->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_id->execute() or die ('Erreur SQL');
// Si il n'y a pas de donnée
if ($query_id->rowCount()==0){
if (!isset($_COOKIE'user_SiD'])){
setcookie('user_SiD', $SiD, $expire, '/');
}
$query_sid=$cnx->prepare('INSERT INTO t_user_sid
(users_id, user_sid)
VALUES (:users_id, :user_sid)');
$query_sid->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_sid->bindValue(':user_sid',$SiD, PDO::PARAM_STR);
$query_sid->execute() or die ('Erreur SQL!');
$query_sid->CloseCursor();
}
// Si il y a des données
if ($query_id->rowCount()!=0){
$data_id = $query_id->fetch();
$SiD = $data_id'user_sid'];
if (!isset($_COOKIE'user_SiD'])){
setcookie('user_SiD', $SiD, $expire, '/');
}
}
$query_id->CloseCursor();
Pour la déconnexion
if (isset($_COOKIE'lang'])){
setcookie ("lang", '', time() - 3600, '/');
}
if (isset($_COOKIE'user_SiD'])){
setcookie ("user_SiD", '', time() - 3600, '/');
}
Le hic, c'est que la création du cookie "user_SiD" ne fonctionne pas en production (celui des langues fonction très bien), et lors de la déconnexion, je ne détruit pas les cookies (y compris celui de la langue), alors qu'en test local, tout fonctionne, et que la version de php du site de prod, est supérieur à celle du développement.
Auriez vous une idée du pourquoi du comment?
Merci beaucoup pour votre aide
Cordialement
Pour supprimer un cookie j'utilise simplement
setcookie('user_SiD');
De plus dans ton code il y a des espaces entre setcookie et la parenthèse qui suit (le problème vient peut être de là)
Pour la création du cookie je ne vois pas le problème, peut être qu'il existe déjà mais qu'il est resté vide à cause d'une suppression raté.
N'hésite pas à supprimer manuellement tes cookies pour vérifier que tout fonction bien depuis le début.
Peux-tu aussi mettre la ligne qui créer ton cookie "lang" pour comparer ;)
Merci bien, mais ... (et oui il y a toujours un mais ^^)
En local ça fonctionne super bien, il n'y a qu'en prod que ça plante.
Le schéma de création des cookies est le même pour la langue ou le SiD.
Et je ne peux pas détruire non plus le cookie "lang"
J'ai beau chercher partout je comprend pas pourquoi avec le choix de langue on créer bien le cookie, et pourquoi qu'en on se connecte ou se déconnecte on n'y arrive plus.
Une idée ...?
Merci pour votre aide
Cordialement
je viens de permettre l'affichage des erreurs sur le site distant, voici le résulta
Pour connexion:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d438409960/htdocs/index.php:47) in /homepages/23/d438409960/htdocs/includes/deconnexion.php on line 10
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d438409960/htdocs/index.php:47) in /homepages/23/d438409960/htdocs/includes/deconnexion.php on line 11
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d438409960/htdocs/index.php:47) in /homepages/23/d438409960/htdocs/includes/deconnexion.php on line 12
Pour deconnexion:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d438409960/htdocs/index.php:47) in /homepages/23/d438409960/htdocs/includes/connexion.php on line 68
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d438409960/htdocs/index.php:47) in /homepages/23/d438409960/htdocs/includes/connexion.php on line 69
Ce qui me parait bizarre, c'est comment ce fait il qu'en local je n'est aucune erreur?
Pour vous aider, voici le script complet de connexion.php et deconnexion.php
pour connexion.php
<?php
if (USERS_ID!=0) erreur(ERR_IS_CO);
else{
if (isset($_GET'action']) && $_GET'action'] == "try") //On est dans la page de formulaire
{
?>
<form method="post" action="./connexion" enctype="multipart/form-data">
<div class="control-group">
<label class="control-label" for="prependedInput"></label>
<div class="controls">
<div class="input-prepend">
<span class="add-on"><i class="icon-white icon-user"></i></span>
<input class="input-large" name="login" size="16" type="text">
</div>
<div class="input-prepend">
<span class="add-on"><i class="icon-white icon-asterisk"></i></span>
<input class="input-large" name="password" size="16" type="password">
<div class="help-block login-remember">
<label class="checkbox">
<input name="souvenir" value="1" type="checkbox"><?php echo $lang_maintien_connexion; ?>
</label>
<input name="connexion" class="btn" value="<?php echo $lang_connecter; ?>" type="submit">
</div>
</div>
<a href="oublie"><?php echo $lang_pass_oublie; ?></a>
</div>
</div>
</form>
<?php
}
if (isset($_POST'connexion']))
{
extract($_POST);
if (empty($login) || empty($password)){ //Oublie d'un champ
alerte_connex($lang_erreur_connexion_message1);
}
else { //On check le mot de passe
$query=$cnx->prepare('SELECT users_id, rank_id, users_name, users_pass, users_verif
FROM t_users
WHERE users_name = :login');
$query->bindValue(':login',$login, PDO::PARAM_STR);
$query->execute() or die ('Erreur SQL');
$data=$query->fetch();
$users_id=$data'users_id'];
$users_pass=$data'users_pass'];
if ($users_pass == encrypt($password)) // Acces OK !
{
//on verrifie que le membre ne soit pas bannis
if ($data'rank_id'] == 1) //Le membre est banni
{
erreur(ERREUR_BAN);
}
if ($data'rank_id'] == 2) //Le membre est banni
{
erreur(ERREUR_ANNONYME);
}
elseif ($data'users_verif'] == 0) //Le membre n'est pas actif
{
erreur(ERREUR_NOT_ACTIF);
}
else //Sinon c'est ok, on se connecte
{
// si on a déja une langue défini, on créer un cookie avec une séssion plus longue
if (!empty($lang) && isset($_COOKIE'lang'])){
$langue_actuelle = $_COOKIE'lang'];
$expire_negatif = time() - 60;
$expire = time() + 365*24*3600;
setcookie('lang', '', $expire_negatif);
setcookie('lang', $langue_actuelle, $expire);
}
$mess_sucess = $lang_succes_connexion_message1.$data'users_name'].$lang_succes_connexion_message2;
sucess($mess_sucess);
/* ** */
$id = 0;
$_SESSION'users_name'] = $data'users_name'];
$_SESSION'rank_id'] = $data'rank_id'];
$_SESSION'users_id'] = $users_id;
if (isset($_POST'souvenir']))
{
$Uid = $users_id;
$key = "xxx";
$SiD=sha1($Uid.$key);
$expire = time() + 365*24*3600;
setcookie('uSiD', $SiD, $expire);
error_reporting(-1);
/* **** */
$query_id=$cnx->prepare('SELECT user_sid
FROM t_user_sid
WHERE users_id = :users_id');
$query_id->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_id->execute() or die ('Erreur SQL');
// Si il n'y a pas de donnée
if ($query_id->rowCount()==0){
$query_sid=$cnx->prepare('INSERT INTO t_user_sid
(users_id, user_sid)
VALUES (:users_id, :user_sid)');
$query_sid->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_sid->bindValue(':user_sid',$SiD, PDO::PARAM_STR);
$query_sid->execute() or die ('Erreur SQL!');
$query_sid->CloseCursor();
}
$query_id->CloseCursor();
}
echo '<script type="text/javascript">setTimeout(function() {window.location.href="./";},2000);</script>';
}
}
else // Acces pas OK !
{
alerte_connex($lang_erreur_connexion_message2);
}
$query->CloseCursor();
}
}
}
?>
pour deconnexion.php
<?php
$query=$cnx->prepare('DELETE FROM t_online WHERE online_id=:id');
$query->bindValue(':id',USERS_ID,PDO::PARAM_INT);
$query->execute();
$query->CloseCursor();
$langue_actuelle = $_COOKIE'lang'];
$expire_negatif = time() - 60;
$expire_nule = '0';
setcookie('lang', '', $expire_negatif);
setcookie('lang', $langue_actuelle, $expire_nule);
setcookie ('uSiD', '', $expire_negatif);
session_destroy();
sucess($lang_succes_deconnexion_message);
echo '<script type="text/javascript">setTimeout(function() { window.location.href="./"; },2000);</script>';
?>
Vous auriez une idée de ce qu'il faut que je regarde dans les configurations de php.ini afin de réparer ceci?
Merci beaucoup pour votre aide.
Cordialement
Salutation
Après plusieurs tentatives en vain, j'ai bien réfléchit à ce que me proposé PHP, et j'ai trouver une solution.
Dans la page connexion, je défini si on à cliquer sur "Se souvenir de moi", et je fait mes opérations tel que créer le code SiD, l'insérer dans la Bdd si il n’existe pas etc... Et je défini une variable de session SiD, me permettant de la passer sur toutes les pages (ou du moins celles dont j'ai besoin de cette valeur.
Ensuite, j'ai créer une page que j'inclus avant même l'entête du site (soit la balise "<!DOCTYPE html>"), et dans cette page je vérifie si on à une variable de session définit et non vide.
Si tel est le cas, alors je créer mon cookie.
Voici ce que ça donne
connexion.php
if (isset($_POST'souvenir']))
{
$Uid = $users_id;
$key = "xxx";
$SiD=sha1($Uid.$key);
$query_id=$cnx->prepare('SELECT user_sid
FROM t_user_sid
WHERE users_id = :users_id');
$query_id->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_id->execute() or die ('Erreur SQL');
// Si il n'y a pas de donnée
if ($query_id->rowCount()==0){
$query_sid=$cnx->prepare('INSERT INTO t_user_sid
(users_id, user_sid)
VALUES (:users_id, :user_sid)');
$query_sid->bindValue(':users_id',$users_id, PDO::PARAM_INT);
$query_sid->bindValue(':user_sid',$SiD, PDO::PARAM_STR);
$query_sid->execute() or die ('Erreur SQL!');
$query_sid->CloseCursor();
}
// Si il y a des données, on update le SiD si il est différent de celui qu'on a créer à l'instant ( $SiD )
// if ($query_id->rowCount()==0){
// }
$query_id->CloseCursor();
$_SESSION'user_sid'] = $SiD;
}
define_cookie.php
<?php
$expire = time() + 365*24*3600;
$expire_negatif = time() - 60;
$expire_nule = '0';
// on vérifie que la page est celle de connexion
if (isset($_SESSION'user_sid']) && !empty($_SESSION'user_sid'])){
setcookie('uSiD', $_SESSION'user_sid'], $expire);
$_SESSION'user_sid'] = null;
}
// on vérifie que la page est celle de deconnexion
if (isset($_GET"p"]) && $_GET"p"]=='deconnexion'){
if (isset($_COOKIE'lang']) && !empty($_COOKIE'lang'])){
$langue_actuelle = $_COOKIE'lang'];
setcookie('lang', '', $expire_negatif);
setcookie('lang', $langue_actuelle, $expire_nule);
}
if (isset($_COOKIE'uSiD']) && !empty($_COOKIE'uSiD'])){
setcookie ('uSiD', '', $expire_negatif);
}
}
?>
Normalement je pense que c'est la bonne méthode à adopté dans mon cas, sachant que ça fonctionne à merveille.
Mais n'ayant pas un niveau php super élevé, je vous saurais gré, en cas d’erreur, de me le signifier afin que je corrige cela.
Merci beaucoup pour votre aide.
Cordialement