Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sesje] session_save_set_handler
Forum PHP.pl > Forum > PHP
deirathe
najpierw kawałek kodu:
  1. <?php
  2. class session{
  3. private static $sessionId;
  4. //db data
  5. private static $cdb;
  6. private static $host;
  7. private static $user;
  8. private static $pass;
  9. private static $db;
  10.  
  11.  
  12.  
  13. public static function on($useDB=false,$host="",$user="",$pass="",$db="",$type="mysql"){
  14. if(!self::$sessionId){
  15. if($useDB){
  16. $host?self::$host=$host:self::Exception();
  17. $user?self::$user=$user:self::Exception();
  18. $pass?self::$pass=$pass:self::Exception();
  19. $db?self::$db=$db:self::Exception();
  20. session_set_save_handler(self::_open(),self::_close(),self::_read(),self::_write(),self::_destroy(),self::_gc())or self::Exception();
  21. }
  22. self::$sessionId = session_id();
  23. }
  24. else self::Exception();
  25. }//end on
  26.  
  27. private static function Exception($nfo){
  28. require_once(dirname(__FILE__)."/Session/Exception.class.php");
  29. throw new Session_Exception($nfo);
  30. }
  31. public function sessionId(){
  32. return self::$sessionId;
  33. }
  34.  
  35.  
  36. /*-------------------------------------*
  37. |  -- session handlers -- |
  38. *-------------------------------------*/
  39. private static function _open(){
  40. self::$cdb = mysql_connect(self::$host,self::$user,self::$pass);
  41. return "";
  42.  
  43. }//end _open
  44. private static function _close(){
  45.  
  46. }//end _close
  47. private static function _read(){
  48.  
  49. }//end _read
  50. private static function _write(){
  51.  
  52. }//end _write
  53. private static function _destroy(){
  54.  
  55. }//end _destroy
  56. private static function _gc(){
  57.  
  58. }//end _gc
  59. }
  60. ?>


nie rozumiem czemu dostaje komunikat, skoro handlery są poustawiane:
Warning: session_set_save_handler() [function.session-set-save-handler]: Argument 1 is not a valid callback in /home/deirathe/domains/3ther.net/public_html/framework/session.class.php on line 28

czy ktoś może wie jak to naprawić??
dzięki z góry
wrzasq
  1. <?php
  2. session_set_save_handler(self::_open(),self::_close(),self::_read(),self::_write(),self::_destroy(),self::_gc())
  3. ?>

nie przekazujesz tutaj nazw funckji, tylko probujesz je wywolywac. musisz przekazywac je (w tym wypadku) jako tablice (nazwa klasy, metoda):
  1. <?php
  2. session_set_save_handler( array('session', '_open'), array('session', '_close'), ....
  3. ?>


no i metody te nie moga byc prywatne - PHP musi moc je wywolac z zewnatrz
deirathe
dzięki za radę, ale zrobiłem to już troszkę inaczej:
  1. <?php
  2. class session{
  3. private static $sessionId;
  4. //db data
  5. private static $cdb;
  6. private static $host;
  7. private static $user;
  8. private static $pass;
  9. private static $db;
  10. private static $namespace;
  11.  
  12. //pobieranie IP
  13. public static function getIP(){
  14. if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
  15. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  16. } else {
  17. $ip = $_SERVER['REMOTE_ADDR'];
  18. }
  19. return $ip;
  20. }
  21.  
  22. public function __construct($ns="",$useDB=false,$host="",$user="",$pass="",$db="",$type="mysql"){
  23. self::$namespace = $ns;
  24. if(!self::$sessionId){
  25. if($useDB){
  26. $host?self::$host=$host:self::Exception("DB Host has not been set");
  27. $user?self::$user=$user:self::Exception("DB User has not been set");
  28. $pass?self::$pass=$pass:self::Exception("DB Pass has not been set");
  29. $db?self::$db=$db:self::Exception("DB Database name has not been set");
  30. session_set_save_handler(array(&$this,"_open"),array(&$this,"_close"),array(&$this,"_read"),array(&$this,"_write"),array(&$this,"_destroy"),array(&$this,"_gc"))or self::Exception("There was an error with session_set_save_nandler on line 28");
  31. }
  32. self::$sessionId = session_id();
  33. }
  34. else self::Exception("Session has been set already");
  35. }//end on
  36.  
  37. private static function Exception($nfo){
  38. require_once(dirname(__FILE__)."/Session/Exception.class.php");
  39. throw new Session_Exception($nfo);
  40. }
  41. public function sessionId(){
  42. return self::$sessionId;
  43. }
  44. public function set($sPath,$value){
  45. $sPath = explode("/",$sPath);
  46. $lvl = count($sPath);
  47. for($i=0;$i<$lvl;$i++){
  48. $path.="['".$sPath[$i]."']";
  49. }
  50. $todo = "$_SESSION['".self::$namespace."']".$path."='".$value."';";
  51. eval($todo);
  52.  
  53. }
  54. public function get($sPath){
  55. $sPath = explode("/",$sPath);
  56. $path = $_SESSION[self::$namespace];
  57. for($i=0;$i<count($sPath);$i++){
  58. $path=$path[$sPath[$i]];
  59. }
  60. return $path;
  61. }
  62. /*-------------------------------------*
  63. |  -- session handlers -- |
  64. *-------------------------------------*/
  65. public function _open(){
  66. mysql_connect(self::$host,self::$user,self::$pass)or self::Exception(mysql_error());
  67. mysql_select_db(self::$db)or self::Exception(mysql_error());
  68. if(! @mysql_num_rows( mysql_query("SHOW TABLES LIKE 'session'"))){
  69. $query = "CREATE TABLE `session` (
  70. `id` VARCHAR( 32 ) NOT NULL ,
  71. `data` LONGTEXT NOT NULL ,
  72. `ip` VARCHAR( 15 ) NOT NULL ,
  73. `set` DATETIME NOT NULL ,
  74. `updated` DATETIME NOT NULL ,
  75. `at` TEXT NOT NULL
  76. ) ENGINE = MYISAM ;";
  77.  mysql_query($query) or self::Exception(mysql_error().", cannnot create table session at query: ".$query);
  78. }// if
  79. return '';
  80. }//end _open
  81. public function _close(){
  82. return mysql_close();
  83. }//end _close
  84. public function _read($id){
  85. $query = "SELECT data FROM session WHERE id = '$id'";
  86.  
  87. if ($result = mysql_query($query)) {
  88. if (mysql_num_rows($result)) {
  89. $record = mysql_fetch_assoc($result);
  90. return $record['data'];
  91. }
  92. }
  93. return '';
  94. }//end _read
  95.  
  96. public function _write($id, $data){
  97.  
  98. $set = mysql_real_escape_string($set);
  99. $data = mysql_real_escape_string($data);
  100. $query = mysql_query("SELECT id FROM session WHERE id = '$id'");
  101. if(@mysql_num_rows($query)){
  102. $query = "UPDATE `session` SET 
  103. `data` = '".$data."',
  104. `ip` = '".self::getIP()."',
  105. `updated` = NOW( ) ,
  106. `at` = '".$_SERVER['REQUEST_URI']."' WHERE id='".$id."'";
  107. }else{
  108. $query="INSERT INTO `session` VALUES (
  109. '".$id."', '".$data."', '".self::getIP()."', NOW( ) , NOW( ) , '".$_SERVER['REQUEST_URI']."');";
  110. }
  111. return mysql_query($query);
  112.  
  113. }//end _write
  114.  
  115. public function _destroy($id){
  116. $query = "DELETE FROM session WHERE id='".$id."'";
  117. return mysql_query($query);
  118. }//end _destroy
  119.  
  120. public function _gc($max){
  121. $old = date("Y-m-d H:i:s") - $max;
  122. $old = mysql_real_escape_string($old);
  123.  
  124. $sql = "DELETE
  125. FROM session
  126. WHERE update < '$old'";
  127.  
  128. return mysql_query($sql, $_sess_db);
  129. }//end _gc
  130. }
  131.  
  132. $sid = new session("namespace",true,"host","user","pass","database");
  133. //ustawianie
  134. $sid->set("sas/asa/asa","as445434regdgdf gdfg dfg dfgdf gd");
  135. //pobieranie
  136. echo $sid->get("sas/asa/asa");
  137.  
  138. ?>

będę wdzięczny jak ktoś mi poda propozycję w jaki sposób mogę się pozbyć eval i wtedy to będzie super smile.gif
wrzasq
ja mam taki kod jednej ze swoich metod (uzywam pole1.sub_pole.itp.foo.bar):

  1. <?php
  2. $data = &$this->data;
  3.  
  4. foreach( explode('.', $key) as $arg)
  5. {
  6. $temp = &$data;
  7. unset($data);
  8.  
  9. $data = &$temp[$arg];
  10. unset($temp);
  11. }
  12.  
  13. $data = $value;
  14. ?>
deirathe
no to teraz sie zastanawiam czy eval nie jest szybsze niż taka ilość unsetów... hmm....
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.