[Résolu] Session, mysql, class, PEAR

Session, mysql, class, PEAR [Résolu] - PHP - Programmation

Marsh Posté le 29-04-2005 à 14:31:58    

Bonjour à tous,  
 
 
J'ai acheté le livre "PHP en action"(php cook) et il y figure une recette permettant de stocker les sessions dans une table à la place de les stocker dans /tmp. Le problème est que cette recete n'a pas d'explication quand à sont utilisation. J'ai beau avoir avoir éssayé de multiples combinaisons pour l'utiliser, mais en vain... :fou:  
 
Je me suis alors tourné vers google qui ma retourné 5 résultat dont un script qui utilise cette recette(En réalité, le script inclut juste la classe mais ne se sert pas des sessions...).  
 
Bref, je suis paumé et je m'en remets à vous  :cry:  
 
Le class.pcdbsession.php :

Code :
  1. <?php
  2. require_once 'PEAR.php';
  3. require_once 'DB.php';
  4. class pc_DB_Session extends PEAR {
  5.    var $_gc_maxlifetime;
  6.    var $_table = "php_session";
  7.    var $_dbh;
  8.    var $_prh_read;
  9.    var $_connected = false;
  10.    var $error = null;
  11.    /**
  12.     * Constructor
  13.     */
  14.    function pc_DB_Session($dsn = null) {
  15.       if ( is_null( $dsn ) ) {
  16.          $this->error = PEAR::raiseError('No DSN specified');
  17.          return;
  18.       }
  19.       $this->_gc_maxlifetime = ini_get('session.gc_maxlifetime');
  20.       // Sessions last for a day unless otherwise specified.
  21.       if (! $this->_gc_maxlifetime) {
  22.          $this->_gc_maxlifetime = 86400;
  23.       }
  24.       // Mise ne commentaire de la ligne ci-dessous car sinon session.save_path = /var/lib/php4
  25.       //$this->_table = ini_get('session.save_path');
  26.       $this->_table = "php_session";
  27.       if ((! $this->_table) || ('/tmp' == $this->_table)) {
  28.          $this->_table = 'php_session';
  29.       }
  30.       $this->_dbh = DB::connect($dsn);
  31.       if ( DB::isError( $this->_dbh ) ) {
  32.          $this->error = $this->_dbh;
  33.          return;
  34.       }
  35.       $this->_prh_read = $this->_dbh->prepare(
  36.          "SELECT data FROM $this->_table WHERE id LIKE ? AND last_access >= ?" );
  37.       if (DB::isError($this->_prh_read)) {
  38.          $this->error = $this->_prh_read;
  39.          return;
  40.       }
  41.       if (! session_set_save_handler(array( &$this,'_open'),
  42.                                      array( &$this,'_close'),
  43.                                      array( &$this,'_read'),
  44.                                      array( &$this,'_write'),
  45.                                      array( &$this,'_destroy'),
  46.                                      array( &$this,'_gc')))
  47.       {
  48.          $this->error = PEAR::raiseError('session_set_save_handler() failed');
  49.          return;
  50.       }
  51.       return $this->_connected = true;
  52.    }
  53.    function _open() {
  54.       return $this->_connected;
  55.    }
  56.    function _close() {
  57.       return $this->_connected;
  58.    }
  59.    function _read($id) {
  60.       if (! $this->_connected) { return false; }
  61.       $sth =
  62.          $this->_dbh->execute($this->_prh_read,
  63.                               array( $id, time() - $this->_gc_maxlifetime ));
  64.       if (DB::isError($sth)) {
  65.          $this->error = $sth;
  66.          return '';
  67.       } else {
  68.          if (($sth->numRows() == 1) &&
  69.              ($ar = $sth->fetchRow(DB_FETCHMODE_ORDERED)))
  70.          {
  71.             return $ar[0];
  72.          } else {
  73.             return '';
  74.          }
  75.       }
  76.    }
  77.    function _write( $id, $data ) {
  78.       $sth = $this->_dbh->query(
  79.          "REPLACE INTO $this->_table (id,data,last_access) VALUES (?,?,?)",
  80.          array( $id, $data, time() ));
  81.       if (DB::isError($sth)) {
  82.          $this->error = $sth;
  83.          return false;
  84.       } else {
  85.          return true;
  86.       }
  87.    }
  88.    function _destroy($id) {
  89.       $sth = $this->_dbh->query(
  90.          "DELETE FROM $this->_table WHERE id LIKE ?",
  91.          array($id));
  92.       if (DB::isError($sth)) {
  93.          $this->error = $sth;
  94.          return false;
  95.       } else {
  96.          return true;
  97.       }
  98.    }
  99.    function _gc($maxlifetime) {
  100.       $sth = $this->_dbh->query(
  101.          "DELETE FROM $this->_table WHERE last_access < ?",
  102.          array(time() - $maxlifetime));
  103.       if (DB::isError($sth)) {
  104.          $this->error = $sth;
  105.          return false;
  106.       } else {
  107.          return true;
  108.       }
  109.    }
  110. }
  111. ?>


 
Le fichier de test :  

Code :
  1. <?php
  2. require_once 'include/class.pcdbsession.php';
  3. $s = new pc_DB_Session('mysql://manif:monpass@localhost/manif');
  4. session_name( 'visite' );
  5. ini_get('session.auto_start') or session_start();
  6. ?>


Un print_r($s); me retourne :  

Code :
  1. pc_db_session Object
  2. (
  3.     [_gc_maxlifetime] => 1440
  4.     [_table] => php_session
  5.     [_dbh] => db_mysql Object
  6.         (
  7.             [phptype] => mysql
  8.             [dbsyntax] => mysql
  9.             [features] => Array
  10.                 (
  11.                     [limit] => alter
  12.                     [new_link] => 4.2.0
  13.                     [numrows] => 1
  14.                     [pconnect] => 1
  15.                     [prepare] =>
  16.                     [ssl] =>
  17.                     [transactions] => 1
  18.                 )
  19.             [errorcode_map] => Array
  20.                 (
  21.                     [1004] => -15
  22.                     [1005] => -15
  23.                     [1006] => -15
  24.                     [1007] => -5
  25.                     [1008] => -17
  26.                     [1022] => -5
  27.                     [1044] => -26
  28.                     [1046] => -14
  29.                     [1048] => -3
  30.                     [1049] => -27
  31.                     [1050] => -5
  32.                     [1051] => -18
  33.                     [1054] => -19
  34.                     [1061] => -5
  35.                     [1062] => -5
  36.                     [1064] => -2
  37.                     [1091] => -4
  38.                     [1100] => -21
  39.                     [1136] => -22
  40.                     [1142] => -26
  41.                     [1146] => -18
  42.                     [1216] => -3
  43.                     [1217] => -3
  44.                 )
  45.             [connection] => Resource id #9
  46.             [dsn] => Array
  47.                 (
  48.                     [phptype] => mysql
  49.                     [dbsyntax] => mysql
  50.                     [username] => manif
  51.                     [password] => monpass
  52.                     [protocol] => tcp
  53.                     [hostspec] => localhost
  54.                     [port] =>
  55.                     [socket] =>
  56.                     [database] => manif
  57.                 )
  58.             [autocommit] => 1
  59.             [transaction_opcount] => 0
  60.             [_db] => manif
  61.             [_debug] =>
  62.             [_default_error_mode] =>
  63.             [_default_error_options] =>
  64.             [_default_error_handler] =>
  65.             [_error_class] => DB_Error
  66.             [_expected_errors] => Array
  67.                 (
  68.                 )
  69.             [fetchmode] => 1
  70.             [fetchmode_object_class] => stdClass
  71.             [was_connected] =>
  72.             [last_query] => SELECT data FROM php_session WHERE id LIKE '5d600e064ceb97c8427aa03713ceeac9' AND last_access >= 1114776113
  73.             [options] => Array
  74.                 (
  75.                     [result_buffering] => 500
  76.                     [persistent] =>
  77.                     [ssl] =>
  78.                     [debug] => 0
  79.                     [seqname_format] => %s_seq
  80.                     [autofree] =>
  81.                     [portability] => 0
  82.                     [optimize] => performance
  83.                 )
  84.             [last_parameters] => Array
  85.                 (
  86.                     [0] => 5d600e064ceb97c8427aa03713ceeac9
  87.                     [1] => 1114776113
  88.                 )
  89.             [prepare_tokens] => Array
  90.                 (
  91.                     [0] => Array
  92.                         (
  93.                             [0] => SELECT data FROM php_session WHERE id LIKE
  94.                             [1] =>  AND last_access >=
  95.                             [2] =>
  96.                         )
  97.                 )
  98.             [prepare_types] => Array
  99.                 (
  100.                     [0] => Array
  101.                         (
  102.                             [0] => 1
  103.                             [1] => 1
  104.                         )
  105.                 )
  106.             [prepared_queries] => Array
  107.                 (
  108.                     [0] => SELECT data FROM php_session WHERE id LIKE   AND last_access >= 
  109.                 )
  110.         )
  111.     [_prh_read] => 0
  112.     [_connected] => 1
  113.     [error] =>
  114.     [_debug] =>
  115.     [_default_error_mode] =>
  116.     [_default_error_options] =>
  117.     [_default_error_handler] =>
  118.     [_error_class] => PEAR_Error
  119.     [_expected_errors] => Array
  120.         (
  121.         )
  122. )


 
Pour en venir aux questions suivantes :  
- Comment utiliser correctement cette classe ?  
- Comment récupérer le SID ? En ajoutant un constructeur qui me récupère l'id ?  
- Comment insérer des valeurs dans $_SESSION en utilisant cette classe ?
- Comment récupérer des valeurs dans $_SESSION en utilisant cette classe ?
- Avez vous un liens vers de la doc à propos de cette classe ?
- Niveau sécurité, est-ce mieux que de simples sessions dans /tmp ?  
- Est-ce que ça "consomme" beaucoup ?  
 
En vous remerciant par avance.. :jap:


Message édité par yoyo354 le 05-05-2005 à 11:44:23

---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 29-04-2005 à 14:31:58   

Reply

Marsh Posté le 29-04-2005 à 21:49:49    

Allé, un éffort ! Je suis sur que cette class pourra resservir à quelqu'uns...
 
J'oublie de préciser qu'en fesant  

Code :
  1. $s->_open();


j'obtient une insertion dans la table qui contient l'id de séssion.
Voici d'ailleur la table en question :  

Code :
  1. DROP TABLE IF EXISTS php_session;
  2. CREATE TABLE php_session (
  3.   id            varchar(32) NOT NULL default '',
  4.   data          mediumblob,
  5.   last_access   int(10) unsigned NOT NULL default '0',
  6.   PRIMARY KEY (id)
  7. ) TYPE=MyISAM;


Message édité par yoyo354 le 29-04-2005 à 21:50:18

---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 30-04-2005 à 13:06:02    

[:atog]
 
[:atreyu]


---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 30-04-2005 à 21:32:26    

Mon dieu ! Mais que ce passe-t-il ? bientôt 36h écoulées et toujours pas de réponse ! Même pas une petite insulte :p


---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 30-04-2005 à 23:31:59    

Ben disons que l'on fait rarement le "SAV". Ceci inclus egalement les codes obscures que l'on peut trouver dans les bouquins.
 
C'est d'ailleurs ce que je reproche a certains bouquins. Des fois ils donnent trops d'explication sur le code, et des fois aucune explication...
 
Personellement j'ai deja une classe qui s'occupe de metre mes sessions dans une table. Faudrait que je prenne le temps un jour de la netoyer et refaire un peu...
 
Pour en revenir a ta classe, perso je l'aime pas trop. PEAR sont des extensions pour php, et il me semble que tous les hebergeurs ne les ont pas forcement, c'est pour cela que je prefere ne pas les utiliser. Comme ca cela m'evite de mauvaises surprises ...
 
Sinon, le fait que tu n'ai pas beacoup de succes, et je pense, egalement la faute de PEAR. En effet, pour "debugger" ta classe, il faudrait voir les fichiers PEAR.php ainsi que DB.php. Tout le monde n'as pas forcement envie de passer du temps rien que pour trouver ces fichiers, etudier le code puis faire des tests ...
 
Alors voila, je vais voir si je trouve la motive pour me plonger dans PEAR et dans cette classe, mais c'est pas gagne ...
 
[edit]
Bon j'ai regarde un peu ta classe. C'est quoi le probleme en fait ? Car ta classe, si aucune erreur se produit, s'enregistre comme "session handler". Ce qui veut dire que php va deleguer la gestion des sessions a la classe.
Pour l'utiliser il suffit donc de simplement, inclure la classe et l'instancier. Ensuite tu peux utiliser les sessions comme tu fais d'habitude.
Pour le SID, pkoi veux-tu le recup ? Tu peux essayer session_id().
Pour eregistrer des variables dans la session, suffit de les mettre dans le tableau $_SESSION. Meme chose pour les recup.
Niveau secu, les sessions dans un tableau c'est mieux je trouve. Au moins tu n'as pas de probleme au niveau du hijacking des sessions par tes "voisins".
Sinon niveau perf, je pense pas que cela impacte beacoup.


Message édité par cerel le 01-05-2005 à 00:05:16
Reply

Marsh Posté le 01-05-2005 à 10:36:26    

cerel a écrit :

Ben disons que l'on fait rarement le "SAV"(1). Ceci inclus egalement les codes obscures(2) que l'on peut trouver dans les bouquins.
 
 
 
C'est d'ailleurs ce que je reproche a certains bouquins. Des fois ils donnent trops d'explication sur le code, et des fois aucune explication...(3)
 
Personellement j'ai deja une classe qui s'occupe de metre mes sessions dans une table. Faudrait que je prenne le temps un jour de la netoyer et refaire un peu...(4)
 
Pour en revenir a ta classe, perso je l'aime pas trop. PEAR sont des extensions pour php, et il me semble que tous les hebergeurs ne les ont pas forcement
(5), c'est pour cela que je prefere ne pas les utiliser. Comme ca cela m'evite de mauvaises surprises ...
 
Sinon, le fait que tu n'ai pas beacoup de succes, et je pense, egalement la faute de PEAR(5). En effet, pour "debugger" ta classe, il faudrait voir les fichiers PEAR.php ainsi que DB.php. Tout le monde n'as pas forcement envie de passer du temps rien que pour trouver ces fichiers, etudier le code puis faire des tests ...
 
Alors voila, je vais voir si je trouve la motive pour me plonger dans PEAR et dans cette classe, mais c'est pas gagne ...(6)
 
[edit]
Bon j'ai regarde un peu ta classe. C'est quoi le probleme en fait ? Car ta classe, si aucune erreur se produit, s'enregistre comme "session handler". Ce qui veut dire que php va deleguer la gestion des sessions a la classe.
Pour l'utiliser il suffit donc de simplement, inclure la classe et l'instancier. Ensuite tu peux utiliser les sessions comme tu fais d'habitude.
Pour le SID, pkoi veux-tu le recup ? Tu peux essayer session_id().(7)
Pour eregistrer des variables dans la session, suffit de les mettre dans le tableau $_SESSION. Meme chose pour les recup.
Niveau secu, les sessions dans un tableau c'est mieux je trouve. Au moins tu n'as pas de probleme au niveau du hijacking des sessions par tes "voisins".
Sinon niveau perf, je pense pas que cela impacte beacoup.


(1) A vrai dire, je n'ose pas trop envoyer de mail aux éditions O`Reilly :heink:  
 
(2)Mais qu'a-t-il d'obscure  :D  
 
(3)D'accord avec toi : Cette class est une des seules à ne pas être expliqué dans le bouquin. Et evidement, elle m'interesse... :fou:  
 
(4)A mon avi, ça en arrangerait plus d'un :ange:  
 
(5)Pour le moment je test le site du mon server perso sur mon réseau local : donc pas de problème pour mettre PEAR. Mais à long terme, c'est sur un "vrai" serveur dedié que sera hebergé mon site qui appartient à un ami et que me laissera l'accès ROOT. Donc là non plus pas de problème pour ma part. Mais en effet, pour des hébergement mutualisés, on peut éffectivement s'attendre à quelques mauvaises surprises... :sweat:  
 
(6)A vrai dire, en repensant à ce que tu viens de dire à propos de PEAR, je me pose de sérieuses questions quand à l'utilisation de PEAR dans mon site... :ouch:  
 
(7)Je vien de me rendre compte en cherchant dans google et en regardant dans mes cookies que la valeur du sessionid était contenu dans mes cookies... :heink:  
Je vais donc modifié mon php.ini avec :

Code :
  1. session.use_trans_sid = 1
  2. session.use_cookies = 0
  3. session.auto_start =1


Je verrais ce que ça donne quand j'en aurais le temps... :ouch: Là, je vais aller commencer mes devoirs... :cry:  
 
Merci encor pour l'attention portée à ce post  :)
 
EDIT : Après modifications du php.ini, j'obtien bien : http://xxx.homelinux.net/page.php? [...] 1f0af18df4
 
Une chose qui me ferais vraiment plaisir  :ange:  :
Un lien vers une explication sur les sessions enregistrés dans une db mysql... Avec des exemples, etc... Que je comprenne au moins. Car j'ai beau cherché dans google, je tombe sur des forums où l'on parle de sécurité avec les sessions, mysql, etc... Mais je n'ai pas trouvé d'exemple concret avec des explications...
 
EDIT 2 : Sinon, les sessions fonctionnent bien mais elles ne sont pas enregistrées dans la bd mysql :o


Message édité par yoyo354 le 01-05-2005 à 11:04:59

---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 03-05-2005 à 17:51:46    

[:atog]
 
[:atreyu]
 


---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 03-05-2005 à 20:37:54    

Tu peux essayer ADODB, qui est un "layer". En gros c'est une classe qui  fait un peu pres la meme chose que le DB.php de pear.
 
Adodb contient deja une classe qui s'occupe de stocker les sessions dans une table. Moi c'est ca que j'utilise.  
 
Bon en fait j'ai une classe session qui s'occupe de creer la session qui s'occupe d'inclure la classe d'adodb concernant les sessions dans une table, puis je cree un session.
Enfin j'initialise quelques variables de session.

Reply

Marsh Posté le 03-05-2005 à 21:48:41    

Merci pour la réponse,
 
Je suppose que tu parles de http://adodb.sourceforge.net/. Je ne le connaissais pas encor mais avec le long week-end qui s'annonce, je vais tester un peux ça.  
 
Merci encor pour la réponse


---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Marsh Posté le 05-05-2005 à 10:58:22    

J'ai fouillé un peu sur le site et j'ai trouvé la doccorrespondant aux sessions avec adodb.  
Mais bon, il faut que je sois réaliste, le site en question n'a pas vraiment besoin d'une sécurité acrue. En effet, aucuns  numéros de cartes bancaires ne circuleront... Et surtout, je serais sur un server dédié, donc pas trop de problèmes pour les vols de sessions dans /tmp
 
EDIT :  :jap: Je vien de comprendre la classe en lisant ceci, c'est à peu près la même chose mais dans un fichier. :sol:
 
EDIT2 : Un exemple quand même :  
index.php

Code :
  1. <?php
  2. require_once 'include/class.pcdbsession.php';
  3. $s = new pc_DB_Session('mysql://manif:&aqwézsx@localhost/manif');
  4. session_start();
  5. session_register("compteur" );
  6. $_SESSION['compteur'] = "bla";
  7. ?>
  8. <a href=page.php>page</a>


page.php

Code :
  1. <?php
  2. require_once 'include/class.pcdbsession.php';
  3. $s = new pc_DB_Session('mysql://manif:&aqwézsx@localhost/manif');
  4. session_start();
  5. print_r($_SESSION);
  6. ?>


 :sarcastic:  
 
Un inconvénient tout de même, lorsque que les cookies sont bloqués, cela ne fonctionne plus... :(  
 
Merci encor pour l'aide que vous m'avez apporté. :hello:


Message édité par yoyo354 le 05-05-2005 à 11:43:40

---------------
http://yoyo.eurotchat.net -> Wednesday 14 September a 02:00:01 up 43 days, 11:47,  2 users,  load average: 0.07, 0.03, 0.00
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed