把session写入数据库问题。 本帖最后由 xiexie10o 于 2011-10-29 09:52:44 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 session_id丢失,,,检查浏览器是否禁掉了测试网址的cookie?默认是cookie传吧 你已经问过一次这个问题了.原贴主要问题是sess_write()函数没有对数据库里面是否存在sesskey作验证,每次都是直接insert,那个贴里的代码我有做测试.function sess_write($key, $val) { global $SESS_DBH, $SESS_LIFE; $expiry = time() + $SESS_LIFE; $value = addslashes($val); $qry = "SELECT * FROM `sessions` WHERE sesskey = '$key'";//查找是否有记录 $qid = mysql_query($qry, $SESS_DBH) or die("query Error."); //结果 if (mysql_num_rows($qid) > 0) {//有记录则更新 $qry = "UPDATE sessions SET expiry = '$expiry', value = '$value' WHERE sesskey = '$key' AND expiry > " . time(); } else{//无记录插入 $qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')"; } $qid = mysql_query($qry,$SESS_DBH); return $qid; } LZ你能写出这个类不能想不到问题所在代码是没问题的否则如何解释在本地测试没问题呢?利用数据库主键重复来判定是新插入数据,插入失败则UPDATE你的问题极有可能是session_id丢失,,否则你改下代码,用$_GET['sid']传session_id试试就知道了 我已经贴了几百分了。可是众说纷纭,当我告诉你们,我时刚学PHP的。我就想先实现这个功能在说,你们还叫我写类吗?。。代码是我在网上抄过来的啊。看也看不懂。有时间的话,帮我改写一下。我这次数据库图都挂上来了啊! 哈哈!!我们等着高手来救我们把。主要是现在的空间都要备案,弄个转发吧,session不支持跨域。所以不得不把session存储到数据库里,也是百般无奈啊,备他吗的毕案啊。他妈的也就这点得性! <?php$SESS_DBHOST = "localhost"; /* database server hostname */ $SESS_DBNAME = "h_guochan"; /* database name */ SSESS_DBUSER = "root"; /* database user */ 这一行是有错误的,$符号没了如果你仅仅是因为session不能跨域而使用session的话,那么你完全可以用cookie来替代session,至少cookie可以跨域,这一点你可以下载一个php使用手册详细阅读一下cookie的部分.如果你的浏览器丢失sessionid,那么你只需要获取一次sessionid,然后把它作为参数不断传递下去就好了,这样就不会出现第二个sessionid了.还有就是在insert数据库之前要先select一下,查询看看有没有记录过sessionid,不要不断插入,浪费资源. 帮你在服务器上(不管是本地还是远程)测试过代码了,应该是可以生效的!首先你要确定的你网上那个服务器的数据库数据结构跟本地是一样的(特别是sesskey要设置成主键--PRIMARY,因为你的程序是通过主键来判断的是否重复的)第二:如果是浏览器禁用session_id,建议你换台电脑做同样的测试,可是否还是重复插入第三:难道是你远程服务器配置问题(因为我在本地,远程测试都通过了) 谢谢楼上的兄弟帮忙,还测了。应该是session_id丢掉了。汗。有可能是远程服务器问题。 既然是session丢失的问题那就简单了if($_GET['sessionid']!=''){$sessionid = $_GET['sessionid'];else{$sessionid = session_id();}//设置并使用SessionIDSession_id($sessionid); 这样就行了,只不过所有的操作你都要使用get方法传递$sessionid的值 1、你的代码是正确的,无需担心#3 的说法是多余的。因为 sesskey 是主键,当插入失败(主键已存在)时就进行修改,逻辑上市说的过去的。当然,使用 replace 指令更为妥当2、既然是本地可以,而服务器不可以。就不存在 sessionid 的传递问题你需要检查服务器端的有关 session 的设置,如果 session 被设置成自动时,你这样做就不行了3、session 是否能跨域,与是否存放在数据库无关跨域是通过设置 session.cookie_domain 来完成的 老徐啊。你能具体点吗。session被设置为制动是什么意思啊?我该怎么做,你给点建议或意见啊 关键我本地测试不时框架转发的127.0.0.1。而上传到服务器是域名转发的,空间商不给了一个3级域名吗。因为要备案吗!我就申请了一个.com域名,隐藏转发了。就出现了问题。 版主老大果然看问题果然认真仔细,这个题我看跟上次的代码是一样的所以也就没过多看了,上次的那个帖子,我在测试时确实没设置成sesskey为主键。然后就修改了下源码。这次我误导LZ了。-_-!抱歉 深圳团队收人 php delphi mysql 出现错误,请教原因 那里的空间支持symfony 请问,如何不用数据库,以数组或别的什么方法实现下列统计 为什么我用了 mysql_select_db 全裸 跪求 PHP ZEND解密 我现在用XP,在本地可以调试PHP和ASP.net怎么让网上的用户可以通过我的IP加断口,访问我正在做的主页? 很奇怪,字段属性一样,都做索引为什么其中一个无效? php怎么连接mysql数据库 PHP有些代码无法解析 php通过header函数来做下载地址比较慢 求救,PHP这样的批量更新应该怎么做?
原贴
主要问题是sess_write()函数没有对数据库里面是否存在sesskey作验证,每次都是直接insert,那个贴里的代码我有做测试.function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value = addslashes($val);
$qry = "SELECT * FROM `sessions` WHERE sesskey = '$key'";//查找是否有记录
$qid = mysql_query($qry, $SESS_DBH) or die("query Error."); //结果
if (mysql_num_rows($qid) > 0) {//有记录则更新
$qry = "UPDATE sessions SET expiry = '$expiry', value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
}
else{//无记录插入
$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
}
$qid = mysql_query($qry,$SESS_DBH);
return $qid;
}
$SESS_DBHOST = "localhost"; /* database server hostname */
$SESS_DBNAME = "h_guochan"; /* database name */
SSESS_DBUSER = "root"; /* database user */ 这一行是有错误的,$符号没了如果你仅仅是因为session不能跨域而使用session的话,那么你完全可以用cookie来替代session,至少cookie可以跨域,这一点你可以下载一个php使用手册详细阅读一下cookie的部分.如果你的浏览器丢失sessionid,那么你只需要获取一次sessionid,然后把它作为参数不断传递下去就好了,这样就不会出现第二个sessionid了.还有就是在insert数据库之前要先select一下,查询看看有没有记录过sessionid,不要不断插入,浪费资源.
if($_GET['sessionid']!=''){
$sessionid = $_GET['sessionid'];
else{
$sessionid = session_id();
}//设置并使用SessionID
Session_id($sessionid); 这样就行了,只不过所有的操作你都要使用get方法传递$sessionid的值
#3 的说法是多余的。因为 sesskey 是主键,当插入失败(主键已存在)时就进行修改,逻辑上市说的过去的。当然,使用 replace 指令更为妥当2、既然是本地可以,而服务器不可以。就不存在 sessionid 的传递问题
你需要检查服务器端的有关 session 的设置,如果 session 被设置成自动时,你这样做就不行了3、session 是否能跨域,与是否存放在数据库无关
跨域是通过设置 session.cookie_domain 来完成的