Kom ihåg mig?
Home Menu

Menu


Php session management med mysql

 
Ämnesverktyg Visningsalternativ
Oläst 2008-12-12, 18:45 #1
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Hej! När jag kör detta scriptet från php.net så räknar den inte +1 utan +2. Den verkar köra scriptet två ggr. Detta blir väldigt jobbigt när det sparas rader i mysql, till exempel så sparas två rader istället för en rad med samma innehåll.

Varför räknar den med plus 2 istället för plus 1 med session räknaren längst ner i scriptet???


Kod:
<?php

/*
CREATE TABLE IF NOT EXISTS `sessions` (
 `session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
 `session_expires` int(10) unsigned NOT NULL default '0',
 `session_data` text collate utf8_unicode_ci,
 PRIMARY KEY (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/

/**
 * PHP session handling with MySQL-DB
 *
 * Created on 12.03.2008
 * @license  http://www.opensource.org/licenses/cpl.php Common Public License 1.0
 */

class Session
{
  /**
   * a database connection resource
   * @var resource
   */
  private static $_sess_db;

  /**
   * Open the session
   * @return bool
   */
  public static function open() {
    
    if (self::$_sess_db = mysql_connect('localhost',
                      'root',
                      '')) {
      return mysql_select_db('a0938700_db1', self::$_sess_db);
    }
    return false;
  }

  /**
   * Close the session
   * @return bool
   */
  public static function close() {
    return mysql_close(self::$_sess_db);
  }

  /**
   * Read the session
   * @param int session id
   * @return string string of the sessoin
   */
  public static function read($id) {
    $id = mysql_real_escape_string($id);
    $sql = sprintf("SELECT `session_data` FROM `sessions` " .
            "WHERE `session` = '%s'", $id);
    if ($result = mysql_query($sql, self::$_sess_db)) {
      if (mysql_num_rows($result)) {
        $record = mysql_fetch_assoc($result);
        return $record['session_data'];
      }
    }
    return '';
  }

  /**
   * Write the session
   * @param int session id
   * @param string data of the session
   */

  public static function write($id, $data) {
    $sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
            mysql_real_escape_string($id),
            mysql_real_escape_string(time()),
            mysql_real_escape_string($data)
            );
    return mysql_query($sql, self::$_sess_db);
  }

  /**
   * Destroy the session
   * @param int session id
   * @return bool
   */
  public static function destroy($id) {
    $sql = sprintf("DELETE FROM `sessions` WHERE `session` = '%s'", $id);
    return mysql_query($sql, self::$_sess_db);
  }

  /**
   * Garbage Collector
   * @param int life time (sec.)
   * @return bool
   * @see session.gc_divisor   100
   * @see session.gc_maxlifetime 1440
   * @see session.gc_probability  1
   * @usage execution rate 1/100
   *    (session.gc_probability/session.gc_divisor)
   */
  public static function gc($max) {
    $sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
            mysql_real_escape_string(time() - $max));
    return mysql_query($sql, self::$_sess_db);
  }
}

//ini_set('session.gc_probability', 50);
ini_set('session.save_handler', 'user');

session_set_save_handler(array('Session', 'open'),
             array('Session', 'close'),
             array('Session', 'read'),
             array('Session', 'write'),
             array('Session', 'destroy'),
             array('Session', 'gc')
             );


session_start();

if (isset($_SESSION['counter'])) {
  $_SESSION['counter']++;       // Här lägger den till 2 vid en refresh
} else {
  $_SESSION['counter'] = 1;
}
echo $_SESSION['counter'];

?>
Tacksam för svar!

/ Jim
Mr Bond91 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 10:09 #2
cryo cryo är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2008
Inlägg: 12
cryo cryo är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2008
Inlägg: 12
Vad jag kan se så räknar den bara +1 ? Likväl när jag testar scriptet.

Inkluderar du filen från ett annat script?

Kontrollera att kolumnen session verkligen är primär nyckel i MySQLn i fall du får fler än en entry i databasen (förutsatt att de har samma session id).
cryo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 16:01 #3
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Tack för ditt svar.

Jag inkluderar filen. Men det blir samma som när jag bara kör filen direkt.
En annan sak jag märkte nu var att om jag istället har det inställt så att sessionerna sparas som vanliga filer och bara kör kodsnutten


session_start();

if (isset($_SESSION['counter'])) {
$_SESSION['counter']++; // Här lägger den till 2 vid en refresh
} else {
$_SESSION['counter'] = 1;
}
echo $_SESSION['counter'];


så räknar den + 2 ändå. Fattar inte alls varför. Men om jag trycker på refresh Jättesnabbt så den inte hinner ladda klart scriptet så ser jag att den ibland bara kör +1.
Kan det vara någon inställning? Det är precis som om det körs två ggr av någon dum anledning.
Mr Bond91 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 16:21 #4
Holgers avatar
Holger Holger är inte uppkopplad
Medlem
 
Reg.datum: Mar 2007
Inlägg: 129
Holger Holger är inte uppkopplad
Medlem
Holgers avatar
 
Reg.datum: Mar 2007
Inlägg: 129
Kör du med Firebug, i så fall vilken version?
Holger är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 16:26 #5
cryo cryo är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2008
Inlägg: 12
cryo cryo är inte uppkopplad
Nykomling
 
Reg.datum: Jul 2008
Inlägg: 12
Kan vara klokt som Holger är inne på att kanske testa med en annan browser eller låta någon annan se om de får samma respons.

Verkar ju inte vara något fel på koden i övrigt.
cryo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 16:39 #6
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Jag har firebug 1.2.1

Testade i IE 7. Där visas det korrekt. Då är det alltså i firefox det blir fel, har ni någon aning om vad?
Mr Bond91 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 16:43 #7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Stängde av Yslow som tillhör firebug. Då fungerade det perfekt

Tack så mycket för hjälpen!
Mr Bond91 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 18:02 #8
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
Det kan vara farlig med extensions i FF, det värsta jag råkat ut för var en extension som pga en bugg skapade en DoS-attack mot vissa websidor som man besökte...
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 19:39 #9
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Citat:
Originally posted by Mr Bond91@Dec 15 2008, 16:43
Stängde av Yslow som tillhör firebug. Då fungerade det perfekt
Tack så mycket för hjälpen
Det står nånstans i Yslow att den tyvärr måste ladda om sidan för att fungera.
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-15, 20:40 #10
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Mr Bond91 Mr Bond91 är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2008
Inlägg: 7
Jag märkte en annan sak nu när jag testade det med include osv. Nu räknar den tre i taget. Läste någonstans att det var pga antalet requests och att den räknade för varje gång. Om detta nu stämmer, hur kommer jag runt det? Det som egentligen ska köras är en INSERT, som då lägger till 3 rader istället för en. Finns det något sätt att fixa detta?

Tack för svaren
Mr Bond91 är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 18:50.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017