За последние 24 часа нас посетили 51814 программистов и 1756 роботов. Сейчас ищут 1689 программистов ...

Повторная запись в БД при нажатии кнопки ОБНОВИТЬ

Тема в разделе "Прочие вопросы по PHP", создана пользователем Alex_@, 26 май 2011.

  1. Alex_@

    Alex_@ Активный пользователь

    С нами с:
    1 окт 2009
    Сообщения:
    76
    Симпатии:
    0
    Здравствуйте, у меня возникла проблема именно с браузером Опера или я что-то в коде напутал, помогите разобраться!

    для начала я напишу код своих файлов:

    файл index.php

    PHP:
    1.  
    2. <?php
    3. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");  
    4. header("Last-Modified: " . gmdate( "D, d M Y H:i:s") . " GMT");
    5. header("Cache-Control: no-cache, must-revalidate");
    6. header("Pragma: no-cache");
    7. include_once ('include/function.php');
    8. general::sessionConfig();
    9. $p = page::getPage();
    10. $p->getUser();
    11. ?>
    12.  
    файл function.php

    PHP:
    1.  
    2. define("KEYS","gh5f67fdghf756gf7557fbv5c7");
    3. function __autoload($cl){
    4. if(file_exists($_SERVER["DOCUMENT_ROOT"]."/include/".$cl."/".$cl.".inc")) require_once($_SERVER["DOCUMENT_ROOT"]."/include/".$cl."/".$cl.".inc");
    5. elseif(file_exists($_SERVER["DOCUMENT_ROOT"]."/module/".$cl."/".$cl.".inc")) require_once($_SERVER["DOCUMENT_ROOT"]."/module/".$cl."/".$cl.".inc");
    6. else return false;
    7. }
    8.  
    файл general.inc

    PHP:
    1.  
    2.  
    3. class general{
    4.  
    5.  
    6.     static function sessionConfig(){
    7.          ini_set("session.auto_start",0);
    8.          ini_set("session.name",'RED'.md5(KEYS));
    9.          ini_set("session.gc_probability",1);
    10.          ini_set("session.gc_divisor",5);
    11.          ini_set("session.cookie_lifetime",3600);//для примера
    12.          ini_set("session.use_cookies",1);//1
    13.          ini_set("session.use_only_cookies",1);
    14.  
    15.     }
    16.  
    17. //и другие функции
    18.  
    19.    
    20. }
    21.  
    22.  
    23.  
    Файл page.inc с классом page

    PHP:
    1.  
    2.  
    3. class page{
    4.     private static $pageObj;
    5.     private $db;
    6.     private $setting = array();
    7.     private $path = array();
    8.     private $user = null;
    9.     private $module = array();
    10.     private $obj = null;
    11.    
    12.     const index_setting = "sys";
    13.     const index_callback = "callback";
    14.    
    15.     private function __construct(){
    16.         $this->db = base::setBase();
    17.         $this->res = null;
    18.         $arr_setting = array();
    19.         $arr_setting = $this->db->getWhere("setting");
    20.         for($i=0;$i<count($arr_setting);$i++){
    21.            $this->setting[$arr_setting[$i]["set_attribute"]][$arr_setting[$i]["set_name"]] = $arr_setting[$i]["set_value"];
    22.         }
    23.         if(isset($_GET[$this->setting[self::index_setting]["NAME_GET"]])){
    24.             $arr_path = trim($_GET[$this->setting[self::index_setting]["NAME_GET"]], "/");
    25.             $this->path["all"] = $arr_path;
    26.             $this->path["get"] = explode("/", $arr_path);
    27.         }else{
    28.             $this->path["all"] = $this->setting[self::index_setting]["DEFAULT_GET"];
    29.             $this->path["get"] = explode("/", $this->setting[self::index_setting]["DEFAULT_GET"]);
    30.         }
    31.         if(count($_POST) !== 0){
    32.             foreach ($_POST as $key => $value){
    33.                 $this->path["post"][$key] = $value;            
    34.             }
    35.         }else{
    36.             $this->path["post"][$this->setting[self::index_setting]["NAME_POST"]] =
    37.             $this->setting[self::index_setting]["DEFAULT_POST"];
    38.         }
    39.         $this->path["ip"] = $_SERVER['REMOTE_ADDR'];
    40.         $this->path["nameSession"] = 'RED'.md5(KEYS);
    41.         $this->path["sid"] = session_id();
    42.         $this->path["keys"] = md5($this->setting[self::index_setting]["PRIMARY_KEY"].$this->path["sid"]);
    43.  
    44.     }
    45.    
    46.     public function getUser(){
    47.         if(!isset($_COOKIE[$this->path["nameSession"]])){
    48.             setcookie($this->path["nameSession"],$this->path["sid"],general::detectTime("time")+ini_get("session.cookie_lifetime"));
    49.             $this->db->Insert("session",array(null,0,$this->path["keys"],general::detectTime("time")));
    50.         }
    51.         else{
    52.             $old_keys = md5($this->setting[self::index_setting]["PRIMARY_KEY"].$_COOKIE[$this->path["nameSession"]]);
    53.             $arr_ses = $this->db->getWhere("session",array("ses_sid"=>$old_keys));
    54.             if($arr_ses === false){
    55.                          setcookie($this->path["nameSession"],$this->path["sid"],general::detectTime("time")+ini_get("session.cookie_lifetime"));
    56.                 $this->db->Insert("session",array(null,0,$this->path["keys"],general::detectTime("time")));        
    57.             }else{
    58.                 // следующий код он не особо важен в данной ситуации и здесь нет запросов на добавление записей
    59.             }
    60.         }
    61.     }
    62.    
    63.     public static function getPage(){
    64.         if(self::$pageObj === null){
    65.             self::$pageObj = new page();
    66.         }
    67.         return self::$pageObj;
    68.     }
    69.  

    Класс base содержит функции для работы с базой данных!

    В браузерах Internet Explorer и Mozilla Firefox при нажатии кнопки обновить не происходит добавления информации
    о сессии в таблицу session, а вот в опере происходит добавление записи в таблицу!
    У меня такое впечатление, что происходит образование 2 объектов класса page!

    Пробовал выводить в браузер все запросы к БД - все запросы соответствуют задуманной логике, запросов на добавление записей нет, а записи добавляются!

    помогите разобраться!!!!!!!
     
  2. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    p.s session_start обязательно в самом начале после <?php
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Чтобы работала подсветка кода, вставь вначале <?
    После 54-й строки добавь
    PHP:
    1. <?
    2. header('Location: '.$_SERVER['PHP_SELF']);
     
  4. Alex_@

    Alex_@ Активный пользователь

    С нами с:
    1 окт 2009
    Сообщения:
    76
    Симпатии:
    0
    Это я всё понимаю!
    Я не могу понять вот что:
    1.У меня класс page (в котором происходит добавление записи в БД) должен быть в одном экземпляре, другого не должно быть (функция page::getPage()), как тогда в одном окне браузера Опера при обновлении может появиться ещё один эеземпляр объекта page, который добавляет запись!
    2. Класс для работы с БД тоже написан с private __construct(), то-есть 2-ого экземпляра не должно быть!
     
  5. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Alex_@

    Когда ты открываешь один и тот же URL в двух разных вкладках браузера, сервер запускает два РАЗНЫХ экземпляра одного и того же скрипта.

    ВНУТРИ КАЖДОГО будет только один экземпляр page, но для сервера, для базы данных ИХ БУДЕТ 2

    Точно так же и с БД.

    Это 2 РАЗНЫХ запуска интерпретатора php, 2 разных соединения, одно ничего не знает о другом.
     
  6. Alex_@

    Alex_@ Активный пользователь

    С нами с:
    1 окт 2009
    Сообщения:
    76
    Симпатии:
    0
    я это понимаю, для каждого браузера свой COOKIE, но я говорю только об Опере!
    я обновляю страницу в опере и у меня появляется лишняя запись в БД, другие браузеры при этом закрыты!
    такой "косяк" я наблюдаю только в Опере, другие браузеры при этом закрыты!