php 数据库 行业数据
rt,我的目的是想通过一个地方改变数据库链接,其他页面查询的时候使用新的链接。。
现在我进入一个查询页面tttt.php,用的默认链接,查询出数据为3
然后我通过页面下拉框选择其他区域,选择下拉框的时候我用ajax从后台切换了数据库的链接
这时候我再进入查询页面ttt.php,数据依然是上一个db的数据,求破。。。
除了把每个区域的db都列出来切换,请问还有没有其他比较好的方法?(因为区域是动态增加的)
require_once dirname(__file__).'/../common/dbsinglehelper.php'; require_once dirname(__file__).'/../svr_yunwei_config.php'; $dbsinglehelper = dbsinglehelper::singleton(); $sql = 'select count(*) as ct from login_log'; $res = $dbsinglehelper -> dosql($sql); echo 查出来的条数:.$res[0]['ct'].
; //$dbsinglehelper -> changedblink(xxxx, xxx, xxx, xxx); //$r = $dbsinglehelper -> dosql($sql); //echo 新条数:.$r[0]['ct'];
上图的代码,把注释打开是正确的,但是问题是我切换的动作是由操作者触发的,在另外一个页面,另外一个页面触发切换后,这个查询的结果依然是上个db的数据。。。
意思就是我在一个地方切换db后,无法改变所有页面其他的地方。。。尽管用单列也不行
求指点。。。
回复讨论(解决方案) 既没有看到传入的数据库条件,也没有看到选择数据库
既没有看到传入的数据库条件,也没有看到选择数据库 public function changedblink($server, $user, $pwd, $db_name) { mysql_close(self::$m_con); return $this -> getconnection($server, $user, $pwd, $db_name); } public function killconnetion() { mysql_close(self::$m_con); } //单列方法 public static function singleton() { if(!isset(self::$m_instance)) { $cls = __class__; self::$m_instance = new $cls; } return self::$m_instance; } private function getconnection($server = db_server, $user = db_userid, $pwd = db_password, $db_name = db_catalog) { self::$m_con = mysql_connect($server, $user, $pwd); if(self::$m_con == false) { errorlog::savelog(db connection falid!server:.$server., user:.$user., password:.$pwd); exit; } $db_sel = mysql_select_db($db_name); if($db_sel == false) { errorlog::savelog(db can't select database.$dbname); exit; } mysql_query(set names utf8); return self::$m_con; } public function dosql($sql) { $data_list = array(); $res = $this -> excute($sql); $i = 0; while($row = mysql_fetch_array($res)) { $data_list[$i] = $row; $i++; } return $data_list; }
我在切换的时候已经在类里选好了,但是查询的时候用此类的函数来查询,如果不是在当前页面调用changedblink,则仍然是跟没切换一样的结果
没有调用changedblink,当然就不能切换数据库了
没有调用changedblink,当然就不能切换数据库了 我在其他的地方调用changedblink不行吗???
在哪里调用都可以,只要是针对的是同一连接、并且是在查询前
在哪里调用都可以,只要是针对的是同一连接、并且是在查询前
刚去测试了,var_dump了mysql_connect的返回值
self::$m_con = mysql_connect($server, $user, $pwd);var_dump(self::$m_con);
其中$m_con是db类的静态变量,并且在每次查询的时候同样var_dump这个值。。
先运行查询页面tttt.php显示结果resource(6) of type (mysql link) 查出来的条数:5(查询的时候var_dump $m_con的值)
然后运行切换dblink的页面dbchange.php,显示resource(7) of type (mysql link)(重建链接打印的$m_con的值)
接着再运行tttt.php,结果还是resource(6) of type (mysql link),为什么呢?
tttt.php的代码
require_once dirname(__file__).'/../common/dbsinglehelper.php'; require_once dirname(__file__).'/../svr_yunwei_config.php'; $dbsinglehelper = dbsinglehelper::singleton(); $sql = 'select count(*) as ct from login_log'; $res = $dbsinglehelper -> dosql($sql); echo 查出来的条数:.$res[0]['ct'].
;
changedb.php的代码
$dbsinglehelper = dbsinglehelper::singleton(); $site = $_request['site']; $ip = $svr_url[$site][url]; if(substr($ip, 0, 4) == http) { $ip = substr($ip, 7); } $dbname = yunwei.$site; $flag = $dbsinglehelper -> changedblink($ip.:xx, xxx, xxx, $dbname);
我发现我用的不是单例??????
我2个页面都用$dbsinglehelper = dbsinglehelper::singleton(),但是都打了flag??
public static function singleton() { if(!isset(self::$m_instance)) { echo ssssssssssssssssssssssssssss; $cls = __class__; self::$m_instance = new $cls; } return self::$m_instance; }
查了下资料,说php变量都是页面级的,每次调用页面重建,页面执行完毕清理内存,这样我怎么保证我2个页面用的是同一个链接呢
2个页面通过url调度的话,就不可能用同一连接
程序结束,数据库也就关闭了
但是你可以通过序列化在两个页面间传递对象的现场
2个页面通过url调度的话,就不可能用同一连接
程序结束,数据库也就关闭了
但是你可以通过序列化在两个页面间传递对象的现场 能给个sample吗?不是很懂。。
