erreur de connexion bdd après session_set_save_handler

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J’ai besoin de sauvegarder mes sessions dans ma bdd. J’ai appliqué ce tuto : http://sdz.tdct.org/sdz/stocker-les-sessions-dans-votre-base-de-donnees.html

Après corrections de deux variables (une mal indiquée et une non définie) ça fonctionne.

Pour l’instant je fais juste des va-et-vient sur trois pages tests pour voir comment ça se passe.

Je voudrais maintenant lister les sessions qui s’enregistrent dans ma bdd (peu importe ce que je veux voir en fait, je veux juste voir les données dans une table) mais d’un côté l’enregistrement des sessions dans la bdd est en POO et je vois des requêtes avec mysql, et de l’autre moi je code en procédural et je travaille avec mysqli.

J’ai tenté d’ajouter une connexion classique à ma bdd avec :

$mysqli = new mysqli($serveur, $user, $pass, $base);
if ($mysqli->connect_error) {
    die('Erreur de connexion ('.$mysqli->connect_errno.')'. $mysqli->connect_error);
}

Puis j’appelle mes données :

$sql = mysqli_query($mysqli,"SELECT * FROM session");
while($data = mysqli_fetch_array($sql))
{
    echo '...';
}

Procédure classique que j’utilise 100 fois par jour. Mais ça ne veut pas.

Est-ce que j’ai le moyen de faire cohabiter les deux simplement ? Avant de me lancer dans un cours sur la POO, je veux bien apprendre, mais je ne veux non plus réinventer la roue.

Est-ce que c’est l’ordre de mes instructions qui pêchent ? Dans le tuto, il indique qu’il met un "1" en quatrième de mysql_connect pour permettre plusieurs connexions. J’ai tenté

$mysqli = new mysqli($serveur, $user, $pass, $base,1);

Mais j’obtiens toujours l’erreur "Erreur de connexion (2002)No such file or directory".

J’ai cherché cette erreur et j’ai lu que "ce message apparait quand PHP et MySQL n’utilisent pas le meme fichier de socket de connexion." Hors ce n’est pas mon problème, puisque c’est une fonction que j’utilise sur mon site et qui fonctionne très bien.

C’est très clairement la cohabitation avec la connexion nécessaire à session_set_save_handler et à la classe utilisée.

Help s’il vous plait, plus je fouille, plus ça devient du chinois et en attendant mon site continue à perdre des sessions aléatoirement et moi des ventes :(

Édité par NatC

+0 -0
  1. les informations données pour mysql_connect ne sont pas valables pour mysqli_connect (le 1 que tu rajoutes, vérifie toujours leur documentation respective)
  2. tu peux parfaitement indifféremment utiliser mysqli de manière OO et procédurale, même sur un même objet mysqli(_stmt|_result). De toute façon, même en procédural, les fonctions utilisent et renvoient des objets pour tout ce qui correspond aux connexions, résultats, statements et les méthodes mysqli_* sont implémentées comme des alias des fonctions (= tu finis au même endroit et exécutes strictement le même code C derrière)
  3. il faudrait le code complet
  4. que toutes les erreurs soient activées, mysqli comprises, à l’aide d’un mysqli_report

Édité par vibrice

+1 -0
Auteur du sujet

Merci Vibrice pour tes réponses.

  1. ok, j’enlève le 1. Pour les docs, je vais très souvent la consulter, mais parfois (souvent) je ne comprends pas toutes les subtilités des paramètres possibles.

  2. euh… pas tout compris ce que tu me réponds, hormis que j’ai bien compris que POO et procédure pouvaient cohabiter, sauf que je n’y arrive pas.

  3. Voici le code:

<?php
ini_set('session.save_handler', 'user');//on définit l'utilisation des sessions en personnel
require_once 'includes/class_session.php';

$sql_host = '...';
$sql_user ='...';
$sql_password ='...';
$sql_db = '...';

$session = new Session($sql_host, $sql_user, $sql_password, $sql_db);//on déclare la classe

session_set_save_handler(array($session, 'open'),
                         array($session, 'close'),
                         array($session, 'read'),
                         array($session, 'write'),
                         array($session, 'destroy'),
                         array($session, 'gc'));//on précise les méthodes à employer pour les sessions

session_start();//on démarre la session

$_SESSION['login'] = 1;
$_SESSION['test'] = 'qfdjg1qjgjqkgj1gjjlk';

$mysqli = new mysqli($serveur, $user, $pass, $base,1); // habituellement je place cette partie dans un autre fichier en include et je l'appelle quasiment au début
if ($mysqli->connect_error) {
    die('Erreur de connexion ('.$mysqli->connect_errno.')'. $mysqli->connect_error);
}

$sql = mysqli_query($mysqli,"SELECT * FROM session");
while($data = mysqli_fetch_array($sql))
{
    echo '<p>'.$_data['sess_id'].' - '.$_data['sess_datas'].' - '.$_data['sess_expire'].' - '.$_data['ip'];
}


?>

<a href="test2.php">page suivante</a>

Est-ce qu’il faut que je donne le code de la classe ? C’est ce qui est là : http://sdz.tdct.org/sdz/stocker-les-sessions-dans-votre-base-de-donnees.html

Je pense que je n’ai pas bien ordonné les instructions ? J’obtiens l’erreur : Erreur de connexion (2002)No such file or directory

  1. J’ai essayé d’ajouter en première ligne
mysqli_report(MYSQLI_REPORT_ALL);

Mais j’obtiens alors une page blanche

J’ai remplacé par

ini_set('display_errors',1);

Et j’obtiens : Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/monsite/www/includes/class_session.php on line 21

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/monsite/www/includes/class_session.php:21) in /home/monsite/www/test1.php on line 20

Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in /home/monsite/www/test1.php on line 25 Erreur de connexion (2002)No such file or directory

Je n’arrête pas de parcourir les docs et les tutos, mais je ne trouve que des bouts. Je trouve plein d’exemple de sessionset_save_handler mais ils sont tous avec mysql, est-ce que c’est normal en POO ? Je ne trouve pas d’exemple où j’ai à la fois l’enregistrement des sessions en bdd et une connexion en procédure pour le reste de la page. Comme les cours sont soit orienté procédural, soit orienté objet, je n’ai pas encore vu d’informations sur l’ordre des choses pour que tout s’imbrique bien sans conflit.

Édité par NatC

+0 -0
Auteur du sujet

J’ai trouvé ! J’ai déplacé les instructions de sessions dans le fichier classe, je ne sais pas si c’est correct de le faire, mais ça fonctionne.

J’ai mon fichier test ainsi :

<?php
ini_set('session.save_handler', 'user');//on définit l'utilisation des sessions en personnel
require_once ('includes/class_session.php');
include("includes/connect.php");

$_SESSION['login'] = 1;
$_SESSION['test'] = 'blablabla';

echo 'login :'. $_SESSION['login'];
echo '<br />';
echo 'test :'. $_SESSION['test'];
echo '<br />';

$sql = mysqli_query($mysqli,"SELECT * FROM session");
while($data = mysqli_fetch_array($sql))
{
    echo '<p>'.$data['sess_id'].' - '.$data['sess_datas'].' - '.$data['sess_expire'].' - '.$data['ip'];
}

?>

<br /><a href="test2.php">page suivante</a>
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte