免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2300 | 回复: 4
打印 上一主题 下一主题

无法实现MySQL+session [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-17 09:01 |只看该作者 |倒序浏览
因为我想用数据库保存session,便于统计在线用户数和能“踢”掉某些用户下线。
我是完全按照如下网站的贴子做的,可就是无法实现

http://www.phpe.net/articles/149.shtml


我的错误提示是Unable to select database
具我测试,发现错误可能是因为MySQL导致,用
$a=mysql_pconnect($dbhost,$dbuser,$dbpass)
if(!$a) die("Unable to connect database";
if(!mysql_select_db($db,$a) die("Unable to select database";

包含在一个页面中,第一次执行此页没有问题,再刷新时就提示Unable to select database
也就是说,在一个连接中,无法多次用select去选择同一个数据库?查了N个网站和N本书都没有找到答案。
我用的是php4.3.2+mysql.3.23.49(或mysql.4.0.20)+apache.2.0.45
搞了一夜没有答案。请各位高手帮忙解决,感谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-08-17 12:03 |只看该作者

无法实现MySQL+session

简化问题,session_set_save_handler那几个函数不用关心数据库连接,仅仅在函数里用globals声明一下就可以了,另外一个环节就是数据库连接了,这种算是基础的基础,反正你把问题简化,一个环节一个环节的调试,不要一来就把什么东西都放到一起运行。

论坛徽章:
0
3 [报告]
发表于 2004-08-17 16:07 |只看该作者

无法实现MySQL+session

试试mysql_select_db($db);

论坛徽章:
0
4 [报告]
发表于 2004-08-17 19:52 |只看该作者

无法实现MySQL+session

谢谢楼上的!
我已简单化了,而且也调试了,基本问题是出在数据库连接上,就是mysql_select_db()有问题,我也单独写了PHP网页测试,在一个连接中两次选取同一个数据库,返回结果是false,导致session的其它五个函数无法工作:原代码如下(摘自权威PHP论坛)
<?  
/* ------------------------------------------------------------------------  
* session_mysql.php  
* ------------------------------------------------------------------------  
* PHP4 MySQL Session Handler  
* Version 1.00  
* by Ying Zhang (ying@zippydesign.com)  
* Last Modified: May 21 2000  
*  
* ------------------------------------------------------------------------  
* TERMS OF USAGE:  
* ------------------------------------------------------------------------  
* You are free to use this library in any way you want, no warranties are  
* expressed or implied. This works for me, but I don't guarantee that it  
* works for you, USE AT YOUR OWN RISK.  
*  
* While not required to do so, I would appreciate it if you would retain  
* this header information. If you make any modifications or improvements,  
* please send them via email to Ying Zhang <ying@zippydesign.com>;.  
*  
* ------------------------------------------------------------------------  
* DESCRIPTION:  
* ------------------------------------------------------------------------  
* This library tells the PHP4 session handler to write to a MySQL database  
* instead of creating individual files for each session.  
*  
* Create a new database in MySQL called "sessions" like so:  
*  
* CREATE TABLE sessions (  
* sesskey char(32) not null,  
* expiry int(11) unsigned not null,  
* value text not null,  
* PRIMARY KEY (sesskey)  
* );  
*  
* ------------------------------------------------------------------------  
* INSTALLATION:  
* ------------------------------------------------------------------------  
* Make sure you have MySQL support compiled into PHP4. Then copy this  
* script to a directory that is accessible by the rest of your PHP  
* scripts.  
* 确信你的php4有mysql支持,然后把这个脚本拷贝到和你的php脚本有关的目录。  
* ------------------------------------------------------------------------  
* USAGE:(使用方法)  
* ------------------------------------------------------------------------  
* Include this file in your scripts before you call session_start(), you  
* don't have to do anything special after that.  
* 包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则,  
* 会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一样。  
*/  

$SESS_DBHOST = "localhost"; /* database server hostname */  
$SESS_DBNAME = "sessions"; /* database name */  
$SESS_DBUSER = "phpsession"; /* database user */  
$SESS_DBPASS = "phpsession"; /* database password */  

$SESS_DBH = "";  
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime";  

function sess_open($save_path, $session_name) {  
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;  

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {  
echo "<li>;Can't connect to $SESS_DBHOST as $SESS_DBUSER";  
echo "<li>;MySQL Error: ", mysql_error();  
die;  
}  

if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {  
echo "<li>;Unable to select database $SESS_DBNAME";  
die;  
}  

return true;  
}  

function sess_close() {  
return true;  
}  

function sess_read($key) {  
global $SESS_DBH, $SESS_LIFE;  

$qry = "SELECT value FROM sessions 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 = addslashes($val);  

$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";  
$qid = mysql_query($qry, $SESS_DBH);  

if (! $qid) {  
$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey  
= '$key' AND expiry >; " . time();  
$qid = mysql_query($qry, $SESS_DBH);  
}  

return $qid;  
}  

function sess_destroy($key) {  
global $SESS_DBH;  

$qry = "DELETE FROM sessions WHERE sesskey = '$key'";  
$qid = mysql_query($qry, $SESS_DBH);  

return $qid;  
}  

function sess_gc($maxlifetime) {  
global $SESS_DBH;  

$qry = "DELETE FROM sessions WHERE expiry < " . time();  
$qid = mysql_query($qry, $SESS_DBH);  

return mysql_affected_rows($SESS_DBH);  
}  

session_set_save_handler(  
"sess_open",  
"sess_close",  
"sess_read",  
"sess_write",  
"sess_destroy",  
"sess_gc";  
?>;  

后来我尝试在每一个函数中用
$a=mysql_connect($host,$user,$pass)
$b=mysql_select($dbname,$a);
....
....
$c=mysql_close($a);

这样按道理来说,每一次PHP的session进入函数都应该重新打开数据库用完了还关闭了,应该没有错了,但是还是无法实现session到数据库。不知道哪位大侠做过session定制到mysql数据库。
(另,我按照PHP要求在php.ini中设置了session.save_handler=user)
不知道问题在哪(数据库一切正常,一直在用,files式的session也是正常)
等待高手,谢谢。

论坛徽章:
0
5 [报告]
发表于 2008-11-26 10:20 |只看该作者
感觉这个函数有问题:
function sess_write($key, $val) {  
global $SESS_DBH, $SESS_LIFE;  

$expiry = time() + $SESS_LIFE;  
$value = addslashes($val);  

$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";  
$qid = mysql_query($qry, $SESS_DBH);  

if (! $qid) {  
$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey  
= '$key' AND expiry >; " . time();  

为什么要加上这个: AND expiry >; " . time();  这样会导致session过期后,无法更新数据.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP