Име на сесия php

cHuBakA

Registered
Здравейте, опитвам се да направя сисията да създаде и използва бисквитка със собствено име за да може след разглеждане потребителя да натисне бутон и да си я изтрие. Обаче не става. старта на сесията винаги прави и използва PHPSESSID. Как би могло да стане?
 
Не съм много сигурен какво точно искаш да постигнеш, но ако идеята ти е да изтриеш всички данни за сесията - може да ползваш следното:

PHP:
// Изтрива всички данни в обкръжението, свързани със сесията (глобалната променлива)
$_SESSION = array();

// Изтрива сетната бисквитка, съдържаща сесията от клиенстска страна
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Унищожаване на самата сесия
session_destroy();
 
Това ще изртие само сесията от сайта нали? Може ли да се направи с бутон?
 
cHuBakA каза:
Това ще изртие само сесията от сайта нали? Може ли да се направи с бутон?
HTML:
<a href="скрипт_изтриващ_сесията.php">Изтрий сесията</a>
:roll:
 
lamerko мерси. Това работи супер. Остава обаче въпроса как може да се създаде нова бисквитка с друго име и сесията да се накара да работи с нея, а не с PHPSESSID. Създавам новата бисквита, но как да накарам сесията нея да използа?



anonimen :D :D съвсем се замаях с тези кодове
 
PHPSESSID ти е само ключа. към него се присвоява уникална стоност, която вече идентифицира конкретно сесията. Функцията session_start() генерира едно такова уникално ID и го присвоява към сесията, като същото се подава и за бисквитка към клиента, при положение, че така е указано на самото PHP (по подразбиране). Самото име на ключа "PHPSESSID" е описано в конфигурацията на PHP и съответно от там може да се смени, макар и не виждам особен смисъл от това. С функцията session_destroy() унищожаваш уникланото ID и то дори да стов дадена бисквитка - вече е невалидно за сървъра и няма да повлияе по никакъв начин. Ако искаш само да подмениш ID-то, без да затваряш сесията (по съображения за сигурност), то може да използваш функцията session_regenerate_id() тя ще подмени ID-то навсякъде - на сървъра, в обкръжението и в потребителската бисквитка.
 
Представях си нещата по друг начин. Сега разбрах. БЛАГОДАРЯ МНОГО!!!!!

А бях тръгнал да го правя за всяка стока в количката да има отделна бисквитка. Но в такъв случай при положение че има обща id стойност за всчко , потребителя как ще може да изтрие определена стока , без да премахва всичко.


$_SESSION['kolichka'][] = $kolichka_stoka;
 
Eто ти и един примерен клас като кода е на основата на функцията http://php.net/manual/bg/function.session-set-save-handler.php

Ти си знаеш какво искаш нали виждам, че и по-прости решения са ти дали но все пак погледни и това. :)

PHP:
<?php

namespace system\library;

class Session{
	private static $instance = null;
	private $className = null;
	private $opt = array();
	
	private $alive = true;
	private $db = NULL;
	
	private function __construct(){
		$this->className = str_replace(__NAMESPACE__ . "\\", "", __CLASS__);
		$this->opt = $this->options();
		
		if($this->opt['sess_use_database'] == true){
			$this->db = \system\core\SAL::getInstance()->db();
			if(!$this->db->tableExists($this->opt['sess_table_name'])){
				$r = $this->db->query($this->opt['sess_table_structure']);
			}
			session_set_save_handler(
				array($this, '_open'),
				array($this, '_close'),
				array($this, '_read'),
				array($this, '_write'),
				array($this, '_destroy'),
				array($this, '_gc')
			);
		}
		session_start();
	}
 
	public function __destruct(){
		if($this->alive){
			session_write_close();
			$this->alive = false;
		}
	}
	
	public static function getInstance(){
        if(self::$instance == null){
            self::$instance = new self();
        }
        return self::$instance;
    }
	
	public function delete(){
		if(ini_get('session.use_cookies')){
			$params = session_get_cookie_params();
			setcookie(session_name(), '', time() - 42000,
				$params['path'], $params['domain'],
				$params['secure'], $params['httponly']
			);
		}
		session_destroy();
		$this->alive = false;
	}
 
	private function _open(){return true;}
 
	private function _close(){return true;}
 
	private function _read($sid){
		$sid = $this->db->real_escape_string($sid);
		$q = "SELECT `".$this->opt['sess_table_column_2']."` FROM `".$this->opt['sess_table_name']."` WHERE `".$this->opt['sess_table_column_1']."` = '".$sid."' LIMIT 1";
		$r = $this->db->query($q);
		if($r->num_rows == 1){
			$field = $r->fetch_assoc();
			return $field[$this->opt['sess_table_column_2']];
		}else{
			return null;
		}
	}
 
	private function _write($sid, $data){
		$sid = $this->db->real_escape_string($sid);
		$data = $this->db->real_escape_string($data);
		$q = "REPLACE INTO `".$this->opt['sess_table_name']."` (`".$this->opt['sess_table_column_1']."`, `".$this->opt['sess_table_column_2']."`) VALUES ('".$sid."', '".$data."')";
		$this->db->query($q);
	}
 
	private function _destroy($sid){
		$sid = $this->db->real_escape_string($sid);
		$q = "DELETE FROM `".$this->opt['sess_table_name']."` WHERE `".$this->opt['sess_table_column_1']."` = '".$sid."'"; 
		$this->db->query($q);
 
		$_SESSION = array();
	}
 
	private function _gc($lifetime){
		$lifetime = (int)$lifetime;
		$q = "DELETE FROM `".$this->opt['sess_table_name']."` WHERE DATE_ADD(`".$this->opt['sess_table_column_3']."`, INTERVAL ".$lifetime." SECOND) < NOW()"; 
		$this->db->query($q);
	}
	
	private function options(){
		return \system\core\SAL::getInstance()->MDC()->load('library/'.$this->className);
	}

}
 
Добре е да прочетеш как точно работят сесиите. В бисквитката се записва просто едно ID - нищо друго като информация (има още неща, но те са за идентификация и контрол). Самите данни в сесията се записват от страната на сървъра, най-често в специални типизирани текстови файлове, като цялата информация е налична при активна сесия в обкръжението, представена като многомерен МАСИВ. В твоя случай артикулите от количакатс техните атрибути ще са клюове и стойности в масива и всяка промяна (добавяне, изтриване, модификация) ще се отнася до данните в обкръжението и сървърната сесия, но не и от страна на клиента и самата бисквитка.
 

Back
Горе