Inhaltsverzeichnis
回复讨论(解决方案)
Heim Backend-Entwicklung PHP-Tutorial 跨页面读取数据库session失败

跨页面读取数据库session失败

Jun 23, 2016 pm 02:03 PM

要疯了。。三天了。。一个问题就是搞不定。不知道问谁去。
问题如下:
我在set_session_test.php中注册的session无法再get_session_php中读取,也就是只能读取当天页面的session。。。为神马???求神人解释。高分求救。



数据库结构如下:

conf.php

<?phpdefine("DBHOST", "localhost");define("DBUSER", "root");define("DBPSW", "");define("DBNAME", "savesession");define("PAGENUM",10);
Nach dem Login kopieren


final_session.php
<?php$gb_DBname = "savesession";$gb_DBuser = "root";$gb_DBpass = "";$gb_DBHOSTname = "localhost";$SESS_DBH = "";$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");function sess_open($save_path, $session_name){	global $gb_DBname,$gb_DBuser,$gb_DBpass,$gb_DBHOSTname,$SESS_DBH;	if(!$SESS_DBH = mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){		echo "<li>Mysql Error:".mysql_errno()."</li>";		die();	}		if(!mysql_select_db($gb_DBname)){		echo "<li>Mysql Error:".mysql_errno()."</li>";		die();	}		return true;}function sess_close(){	return true;}function sess_read($key){	global $SESS_DBH,$SESS_LIFE;		$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();	$qid = mysql_query($qry, $SESS_DBH);			if(list($value) = mysql_fetch_row($qid)){		return $value;	}		return false;}function sess_write($key, $val){	global $SESS_DBH,$SESS_LIFE;		$expiry = time()+$SESS_LIFE;	$value = $val;	$qry = "INSERT INTO db_session VALUES('$key', $expiry, '$value')";	//echo $qry;	$qid = mysql_query($qry,$SESS_DBH);	if(!$qid){		$qry = "UPDATE db_session SET expiry=$expiry,value='$value' WHERE sesskey='$key' and expiry>".time();		$qid = mysql_query($qry);	}	return $qid;}function sess_destory($key){	global $SESS_DBH;		$qry = "DELETE FROM db_session WHERE sesskey = '$key'";	$qid = mysql_query($qry, $SESS_DBH);	return $qid;}function sess_gc($maxlifetime){	global $SESS_DBH;		$qry = "DELETE FROM db_session WHERE expiry<".time();	$qid = mysql_query($qry, $SESS_DBH);	return mysql_affected_rows($SESS_DBH);}session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");
Nach dem Login kopieren


set_session_test.php
<?phpinclude_once 'final_session.php';session_start();$_SESSION['message'] = "Can I help you?";$_SESSION['message1'] = "No, Thank ";$_SESSION['Tom'] = "Tom";echo $_SESSION['message'];echo $_SESSION['message1'];echo $_SESSION['Tom'];echo "<a href=\"get_session_test.php\">显示SESSION</a>";?>
Nach dem Login kopieren


get_session_test.php
<?phpinclude_once 'final_session.php';session_start();$_SESSION['test'] = "test";echo $_SESSION['test'];$_SESSION['test2'] = "test22222222222";echo $_SESSION['test2'];echo $_SESSION['message'];echo $_SESSION['message1'];echo $_SESSION['Tom'];?>
Nach dem Login kopieren


回复讨论(解决方案)

session_set_save_handler()
注意:使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

session_set_save_handler()
注意:使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。

有试过。。也用ini_set()函数设置了。。结果依然是这样的。。。数据库中是有session写入的。。

if(list($value) = mysql_fetch_row($qid)){
????

你查询的是全部字段,为什么只取出第一个?
那不是 sessionid 吗?

把sess_read里的

$qry = "SELECT * FROM db_session WHERE sesskey = '$key' and expiry > ".time();
Nach dem Login kopieren

换成
$qry = "SELECT value FROM db_session WHERE sesskey = '$key' and expiry > ".time();
Nach dem Login kopieren

就可以了。

你试用cookie看可以解决你的问题吗。

楼主$_SESSION['message'] = "Can I help you?";
输出变量看看。echo $_SESSION['message'];

.......
试了了一下 楼主的代码 ...

依然木有正解。

难道木有高人了?

这比我那个页内传值的问题高深多了,我只不过想把表单输入的内容都存储下来 ,想什么时候用旧什么时候用,这个功能比我那个全多了。。。时刻关注。

还有一处

function sess_write($key, $val){    global $SESS_DBH,$SESS_LIFE;        $expiry = time()+$SESS_LIFE;    $value = $val;    $qry = "REPLACE INTO db_session VALUES('$key', $expiry, '$value')";    $qid = mysql_query($qry,$SESS_DBH);}
Nach dem Login kopieren

好的。。我去试下。。但感觉应该不是这个问题。。因为session已经成功写入。。是读取的问题。

还有一处
PHP code
function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;

$expiry = time()+$SESS_LIFE;
$value = $val;
$qry = "REPLACE INTO db_session VALUES('$key', $expiry, ……

还是不行。。。不过学会了REPLACE的用法。。受教了。

等待高人解决。。另外本人贴张图上来。好让大家明白究竟什么样的存储结构。


好的。。我去试下。。但感觉应该不是这个问题。。因为session已经成功写入。。是读取的问题。

引用 11 楼 的回复:

还有一处
PHP code
function sess_write($key, $val){
global $SESS_DBH,$SESS_LIFE;

$expiry = time()+$SESS_LIFE;
$value = $val;
$qr……

加分悬赏。提供正解者。加分100.

SESSIONID($key)是保存在COOKIE里的,有没有设置它的保存时间呢?
能确保再次访问的时候能拿到跟前次访问相同的$key?

怎么还没搞好呢?
这是我改写的你的代码。
因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名

<?phpdefine("DBHOST", "localhost");define("DBUSER", "root");define("DBPSW", "");define("DBNAME", "test");define("PAGENUM",10);define("SESS_LIFE", get_cfg_var("session.gc_maxlifetime"));function sess_open($save_path, $session_name){    if(! $conn = mysql_pconnect(DBHOST, DBUSER, DBPSW)){        echo "<li>Mysql Error:".mysql_errno()."</li>";        die();    }    define("SESS_DBH", $conn);    if(!mysql_select_db(DBNAME, SESS_DBH)){        echo "<li>Mysql Error:".mysql_errno()."</li>";        die();    }    return true;}function sess_close(){    return true;}function sess_read($key){    $qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();    $qid = mysql_query($qry, SESS_DBH) or die(mysql_error());        $r = mysql_fetch_assoc($qid);    return $r['value'];}function sess_write($key, $val){    $expiry = time()+SESS_LIFE;    $value = $val;    $qry = "REPLACE INTO sessions VALUES('$key', $expiry, '$value')";    $qid = mysql_query($qry, SESS_DBH);}function sess_destory($key){    $qry = "DELETE FROM sessions WHERE sesskey = '$key'";    $qid = mysql_query($qry, SESS_DBH);    return $qid;}function sess_gc($maxlifetime){    $qry = "DELETE FROM sessions WHERE expiry<".time();    $qid = mysql_query($qry, SESS_DBH);    return mysql_affected_rows(SESS_DBH);}//session_module_name();session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destory", "sess_gc");session_start();
Nach dem Login kopieren

sess_read里的

  if(list($value) = mysql_fetch_row($qid)){        return $value;    }
Nach dem Login kopieren

错了,只需要返回session的序列化串,也就是表内的value字段,改成
    if($value = mysql_fetch_row($qid)){        return $value[2];    }
Nach dem Login kopieren

严重感谢。。。代码测试可以正常运行。。但我还是想知道是神马毛病。
怎么还没搞好呢?
这是我改写的你的代码。
因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名
PHP code
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "test");
define("PAGENUM",10);
defi……

那段代码木有问题。。测试过。。换了结果还是一样的。
sess_read里的  
PHP code
  if(list($value) = mysql_fetch_row($qid)){
        return $value;
    }

错了,只需要返回session的序列化串,也就是表内的value字段,改成
PHP code
    if($value = mysql_fetch_row($qid)){
        re……

100分送你了。。。稍等我看下能不能找出什么毛病。。这两天就结贴。
怎么还没搞好呢?
这是我改写的你的代码。
因为我不喜欢用全局变量改成了常量,另外改了一下库名和表名
PHP code
define("DBHOST", "localhost");
define("DBUSER", "root");
define("DBPSW", "");
define("DBNAME", "test");
define("PAGENUM",10);
defi……

因为你的表中的sesskey列没有设为主键或惟一约束,所以在每次在session_start();会产生一个一样的SID,把数据库表sesskey列设置为主键或惟一键即可解决。

注:你多刷新几次你的测试代码,然后去数据库查一下会发现有多个重复的SID

我的数据库是有设主键的。。你说的情况我明白。但不是这种情况。
我有个回帖里面也提到了这个问题。
数据库的写入是没有问题的。。可以正常插入。

但是你设的主键是不是(sesskey和expiry),而不是sesskey吧???

不是组合主键。。。主键只有sesskey....
但是你设的主键是不是(sesskey和expiry),而不是sesskey吧???

问题可能出在:

function sess_read($key){
    $qry = "SELECT * FROM sessions WHERE sesskey = '$key' and expiry > ".time();

你把$qry打印出来,看看能不能取到?

sess_read里的  

数据库读出来后 只能返回value字段里面的数据! 不能返回整条数据

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Erklären Sie das Konzept der späten statischen Bindung in PHP. Erklären Sie das Konzept der späten statischen Bindung in PHP. Mar 21, 2025 pm 01:33 PM

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Mar 28, 2025 pm 05:12 PM

In dem Artikel werden Frameworks hinzugefügt, das sich auf das Verständnis der Architektur, das Identifizieren von Erweiterungspunkten und Best Practices für die Integration und Debuggierung hinzufügen.

Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Mar 28, 2025 pm 05:11 PM

In Artikel werden wichtige Sicherheitsfunktionen in Frameworks erörtert, um vor Schwachstellen zu schützen, einschließlich Eingabevalidierung, Authentifizierung und regelmäßigen Aktualisierungen.

See all articles