<?php // none of thesehandles are re-used as the connection parameters are different on them all, despite connecting to the same server (assuming 'myuser' and 'otheruser' have the same privileges/accesses in mysql) $handle_db1 = mysql_connect("localhost","myuser","apasswd"); $handle_db2 = mysql_connect("127.0.0.1","myuser","apasswd"); $handle_db3 = mysql_connect("localhost:3306","myuser","apasswd"); $handle_db4 = mysql_connect("localhost","otheruser","apasswd");// give each handle it's own database to work with, permanently. mysql_select_db("db1",$handle_db1); mysql_select_db("db2",$handle_db2); mysql_select_db("db3",$handle_db3); mysql_select_db("db4",$handle_db4);//do a query from db1: $query = "select * from test"; $which = $handle_db1; mysql_query($query,$which);//do a query from db2 : $query = "select * from test"; $which = $handle_db2; mysql_query($query,$which);//etc ?> ---------------------------------------------------------------- code太长了,没有时间看了,不知道我的回答对你有没有帮助呢?
还有就是,ChaoticLife() 楼主的解释是有问题的,
mysql_connect()函数的第四个参数,指的是在连接参数完全一致的情况下才是有用的.
对你的类在修改以下。在创建实例后记得 use 你的数据库名;
问题是这样的:
我现在有两个mysql数据库。如果这两个数据库放在同一服务器上(一个mysql实例),那么我
定义两个数据库对象:
$db1 = new database(1);
$db2 = new database(2);
进行操作是没任何问题的。
但是,如果把两个数据库分开到不同的服务器上(两个mysql实例),那么在定义了第二个数据库对象之后,对$db1的查询操作还是可行的,但接下来update就出问题了,就报no database
selected。
我肯定做了mysql_select选择数据库这个操作的,而且我打印了数据,确实是选择的正确的数据库。
如果我再次 $db1=new database(1);
再用这个操作,就没问题了。
而楼上说将new_link参数设置为true,这是不行的,因为我并没有重新去connect(当然,我如果重新定义一个数据库对象,是重新connect 了,但我不设置new_link为true也可以)。
因为,我认为我的两个数据库对象
db1 db2分别保持对不同的服务器连接,不应该会有问题的,可现在就出了问题,对了
我的数据库版本是:
mysql4.1
mysql_connect、mysql_select_db的php代码
require_once("request.inc.php");class database{ //连接数据库的资源ID
var $link_id;
//查询数据库的资源ID
var $query_id;
var $row_total;
//数据库名
var $db_host;
var $db_user;
var $db_password;
var $db_name;
//############################# 构造函数: database ################################
function database($use_db = 1){
switch($use_db){
case 1:
$this->db_host = __DB__HOST;
$this->db_user = __DB__USER;
$this->db_password = __DB__PASSWORD;
$this->db_name = __DB__NAME;
break;
case 2:
$this->db_host = __DB__HOST_2;
$this->db_user = __DB__USER_2;
$this->db_password = __DB__PASSWORD_2;
$this->db_name = __DB__NAME_2;
break;
}
//连接数据库
if(!$this->link_id = @mysql_connect($this->db_host, $this->db_user, $this->db_password)){
echo "服务器正忙,请稍后重试!";
$this->writelog("");
exit();
}
}
//################################## 选择数据库函数: select_database #####################################
//调用格式:$对象名->select_database()
//没个操作前都必须调用该函数以确定使用的数据库
function select_database(){
if(!@mysql_select_db($this->db_name, $this->link_id)){
echo "打开数据库时出错! ";
$this->writelog("");
exit();
}
} //################################## 查询数据函数: select #####################################
//调用格式:$对象名->select(表名, 字段名, 条件, 排序, 限制)
//返回值为一个以字段名为下标记录数据为值的二维数组,array(数字下标 -> array("字段名" -> "值"))
function select($table, $field = "*", $condition = "", $order = "", $limit = ""){
$this->select_database();
$sql = "SELECT $field FROM $table";
$sql .= $condition ? " WHERE $condition" : "";
$sql .= $order ? " ORDER BY $order" : "";
$sql .= $limit ? " LIMIT $limit" : "";
//echo "<br>Select Sql=".$sql;
$this->query_id = @mysql_query($sql, $this->link_id);
if(!$this->query_id){
@mysql_free_result($this->query_id);
$this->writelog($sql);
return false;
}
$count = 0;
$data = array(); while($row = @mysql_fetch_array($this->query_id)){
$data[$count] = $row;
$count++;
}
$this->row_total = mysql_num_rows($this->query_id); //echo $this->row_total."aaa";
@mysql_free_result($this->query_id); return $data;
} //################################## 查询数据函数: select_row #####################################
//调用格式:$对象名->select_row(表名, 字段名, 条件, 排序, 限制)
//返回值为一个以索引为下标记录数据为值的二维数组
function select_row($table, $field = "*", $condition = "", $order = "", $limit = ""){
$this->select_database();
$sql = "SELECT $field FROM $table";
$sql .= $condition ? " WHERE $condition" : "";
$sql .= $order ? " ORDER BY $order" : "";
$sql .= $limit ? " LIMIT $limit" : "";
$this->query_id = mysql_query($sql, $this->link_id);
if(!$this->query_id){
$this->writelog($sql);
return false;
}
$rows = array();
$count = 0;
while($row = mysql_fetch_row($this->query_id)){
$rows[$count] = $row;
$count++;
}
$this->row_total = mysql_num_rows($this->query_id);
return $rows;
} //################ 插入数据函数: insert #################
//调用格式:$对象名->insert(表名, 字段及数据, 条件, 限制)
//插入成功将返回所插入记录的id号
function insert($table, $field, $condition = "", $limit = ""){
$this->select_database();
$sql = "INSERT INTO $table SET $field";
$sql .= $condition ? " WHERE $condition" : "";
$sql .= $limit ? " LIMIT $limit" : "";
if(!$this->query_id = @mysql_query($sql)){
$this->writelog($sql); return 0;
}else{
return @mysql_insert_id($this->link_id);
}
} //################# 更新数据函数: update ##################
//调用格式:$对象名->update(表名, 字段甩数据, 条件, 限制)
//返回真假
function update($table, $field, $condition = "", $limit = ""){
$this->select_database();
//$this->writeErr("dbname=".$this->db_name." host=".$this->db_host);
$sql = "UPDATE $table SET $field";
$sql .= $condition ? " WHERE $condition" : "";
$sql .= $limit ? " LIMIT $limit" : "";
$this->query_id = @mysql_query($sql);
$this->writelog($sql);
return $this->query_id ; } //################# 删除数据函数: delete ####################
//调用格式:$对象名->delete(表名, 条件, 限制)
//返回真假
function delete($table, $condition = "", $limit = ""){
$this->select_database();
$sql = "DELETE FROM $table";
$sql .= $condition ? " WHERE $condition" : "";
$sql .= $limit ? " LIMIT $limit" : "";
//echo $sql;
$this->query_id = @mysql_query($sql);
$this->writelog($sql);
return $this->query_id ;
} //################################## sql语句查询数据函数: query #####################################
//调用格式:$对象名->query(sql语句)
//返回值为一个以字段名为下标记录数据为值的二维数组,array(数字下标 -> array("字段名" -> "值"))
function query($sql){
$this->select_database();
$result = @mysql_query($sql, $this->link_id);
if(!$result){
@mysql_free_result($result);
$this->writelog($sql);
return false;
}
$count = 0;
$data = array(); while($row = @mysql_fetch_array($result)){
$data[$count] = $row;
$count++;
} @mysql_free_result($result); return $data;
}
//################################## 执行sql语句函数: exe_sql #####################################
//调用格式:$对象名->exe_sql(sql语句)
//返回值查询资源ID
function exe_sql($sql){
$this->select_database();
if(!$this->query_id = @mysql_query($sql, $this->link_id)){
@mysql_free_result($result);
$this->writelog($sql);
return false;
}else{
@mysql_free_result($result);
return $this->query_id;
}
}
//############### 关闭数据库连接函数: close ################
//调用格式:$对象名->close()
function close(){
if(!mysql_close($this->link_id))
echo "关闭数据库时发生错误!";
exit;
}
//写错误日志
function writelog($execsql)
{
if(strlen(trim(mysql_error()))>0)
{
$logdir = "html";
if(!is_dir($logdir))
{
@mkdir($logdir, 0700);
}
$logname = $logdir."//".date("Ym").".txt";
$fp = @fopen($logname, "a+");
@chmod($logname, 0777);
@fwrite($fp, date("Y-m-d H:i:s").":".$_SERVER['REQUEST_URI']."\t".$execsql."\t".mysql_error()."\r\n");
@fclose($fp);
} }
//写错误日志
function writeErr($info)
{
$logdir = "html";
if(!is_dir($logdir))
{
@mkdir($logdir, 0700);
}
$logname = $logdir."//".date("Ym").".txt";
$fp = @fopen($logname, "a+");
@chmod($logname, 0777);
@fwrite($fp, date("Y-m-d H:i:s").":".$_SERVER['REQUEST_URI']."\t".$info."\t"."\r\n");
@fclose($fp);
}
}
?>
我想搜虎的新闻肯定有数据服务器、论坛和BLOG肯定是另外的数据服务器,这样访问对数据服务器的影响相对要小一些。
这个时候,怎么保证对两个甚至多个数据库的同是连接呢?PHP的问题?在java中是没这个问题的
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )new_link
如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数 new_link 改变此行为并使 mysql_connect() 总是打开新的连接,甚至当 mysql_connect() 曾在前面被用同样的参数调用过。 client_flags
client_flags 参数可以是以下常量的组合:MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或 MYSQL_CLIENT_INTERACTIVE。进一步信息见表 153 “MySQL 客户端常量”。为什么你在$db1 = new database(1);完后就不能进行$db1的操作要等到$db2后呢?
是这样,我的一个函数里,需要操作到两个数据库的数据。
以前,我们将两库放在一起(一台机器上),这么做是没问题的。
但是,如果把数据库分到两台数据服务器上,那么就会有问题。
(在紧接着的两行代码声明两个数据库类)
只有在要用到哪个数据库连接的时候,再连接数据库,就不会有问题。
新开一个问题,100分相赠:
同样的问题,在两台服务器上分别保存的是新闻数据和BLOG数据,如果是新闻,访问数据库1,如果是BLOG,访问数据库2。
针对于新闻和BLOG,写的是两个站代码,同一主域名,
新闻WEB服务器和数据服务器在一起
BLOG WEB服务器和数据服务器在一起。两站共用SESSION,在新闻数据服务器上。其实WEB前台的SESSION用的还并不是太多[当然也有]。
但是,这样运行之后,新闻服务器一会就会忙的会崩溃掉(原来两个数据库都在新闻服务器上还好一些),请问这是为什么呢?
1、没有选db
2、连接close了
3、mysql的最大连接数设置成1了。
1、每个操作之前都是做select_database操作
2、关闭连接肯定没做。直到页面关闭(主动关闭,按说页面关闭后应该自动释放)
3、那就更不可能了,最大连接数是1200
$db = new database; //第一台数据服务器
$db2 = new database(2);//第二台数据服务器
$data = $db->select("crd_member", "mb_role_id, mb_id, mb_active, mb_now_login_date, mb_now_login_ip", "mb_name = '$r_account' AND mb_password = '" . md5($r_password) . "' and mb_role_id <> 0");
if(!$data[0]["mb_id"]){
alert_back("用户或密码错误!");
exit();
}
if($data[0]["mb_active"] != 1){
alert_back("用户尚未激活!");
exit();
}
$db->update("crd_member", "mb_previous_login_date = '{$data[0]['mb_now_login_date']}', mb_previous_login_ip = '{$data[0]['mb_now_login_ip']}'", "mb_id = {$data[0]['mb_id']}");
$db->update("crd_member", "mb_now_login_date = '" . date("Y-m-d H:i:s") . "', mb_now_login_ip = '" . $_SERVER['REMOTE_ADDR'] . "'", "mb_id = {$data[0]['mb_id']}");
$db->update("crd_member", "mb_login_times = mb_login_times + 1", "mb_id = {$data[0]['mb_id']}");
//检查日志是否禁用
$log_state_contraller = base64_decode(file_get_contents("../include/log.cfg.xml"));
$log_state = preg_match("/manager_log *= *\"enable\";/", $log_state_contraller);
if($log_state){
$rs = $db2->insert("crd_log","log_account_type=\"manager\",log_login_account=\"$r_account\",log_last_login_ip=\"{$_SERVER['REMOTE_ADDR']}\",log_last_login_date=NOW()");
if(!$rs)alert_back("写入日志时出错!");
}
//echo "databaee".$db->db_name;
$r = $db->select("crd_role", "*", "rl_id = {$data[0]['mb_role_id']}");
$r = $r[0];
当然,如果我在需要使用哪个数据库连接的时候,就直接写new database(n)//
这样就没问题.但是我觉得很奇怪啊,为什么分了数据服务器,代码就要这么写!
另外,如果服务器用固定IP地址,和用localhost,效率上有区别吗,两台服务器都有固定IP,
这样数据访问会不会慢?
是否可以将两台服务器做成局域网,来提高速度?
// none of thesehandles are re-used as the connection parameters are different on them all, despite connecting to the same server (assuming 'myuser' and 'otheruser' have the same privileges/accesses in mysql)
$handle_db1 = mysql_connect("localhost","myuser","apasswd");
$handle_db2 = mysql_connect("127.0.0.1","myuser","apasswd");
$handle_db3 = mysql_connect("localhost:3306","myuser","apasswd");
$handle_db4 = mysql_connect("localhost","otheruser","apasswd");// give each handle it's own database to work with, permanently.
mysql_select_db("db1",$handle_db1);
mysql_select_db("db2",$handle_db2);
mysql_select_db("db3",$handle_db3);
mysql_select_db("db4",$handle_db4);//do a query from db1:
$query = "select * from test"; $which = $handle_db1;
mysql_query($query,$which);//do a query from db2 :
$query = "select * from test"; $which = $handle_db2;
mysql_query($query,$which);//etc
?>
----------------------------------------------------------------
code太长了,没有时间看了,不知道我的回答对你有没有帮助呢?
我写了一个数据库类database,里面有数据连接handle,保存的是连接服务器的句柄
每当我生命一个数据对象的时候,该句柄在内存中保存(作为对象的一个字段)。
我在调用的时候,其实是创建了两个对象,$db 和 $db2
也就是说,我现在有两个句柄,分别连接server1和server2,照说这样的话,这两个句柄应该不会相互影响才对啊!
如
$db = new database()
$db1 = new database()
这样会创建几个连接?(在database构造函数里都会创建一个连接,但是每个连接的参数都一样)