你的类里面数据库连接的这个函数要把第4个参数置为true
mysql_connect ( $server , $username ,  $password , true );

解决方案 »

  1.   

    问题可能不是不能多个连接的问题,可能是你程序的问题;
    还有就是,ChaoticLife() 楼主的解释是有问题的,
    mysql_connect()函数的第四个参数,指的是在连接参数完全一致的情况下才是有用的.
      

  2.   

    发现:我对db1进行操作,会报NO database selected很明显你程序的问题。
    对你的类在修改以下。在创建实例后记得 use 你的数据库名;
      

  3.   

    我把问题描述的不够清楚。
          问题是这样的:
          我现在有两个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
      

  4.   

    给出 类database 中,全部包含:
    mysql_connect、mysql_select_db的php代码
      

  5.   

    require_once("config.inc.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);
    }
    }
    ?>
      

  6.   

    这种情况用mysql_pconnect就不会有问题了.或mysql_connect的第四个参数用MYSQL_CLIENT_INTERACTIVE
      

  7.   

    用mysql_pconnect,一般不是建议不用mysql_pconnect吗(虽然我非常想用这个),而且据说mysql_pconnect就是php中的数据连接池,可是,因为该函数不自动关闭连接[60S后自动关闭],这样就怕连接超过最大连接数,至于后者,应该是第5个参数吧,是什么意思呢,我去查查
      

  8.   

    大家没有做过同一项目,将数据分到不同的数据服务器上的经历吗?
        我想搜虎的新闻肯定有数据服务器、论坛和BLOG肯定是另外的数据服务器,这样访问对数据服务器的影响相对要小一些。
        这个时候,怎么保证对两个甚至多个数据库的同是连接呢?PHP的问题?在java中是没这个问题的
      

  9.   

    看看手册注意以下:
    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后呢?
      

  10.   

    回楼上:
        是这样,我的一个函数里,需要操作到两个数据库的数据。
        以前,我们将两库放在一起(一台机器上),这么做是没问题的。
        但是,如果把数据库分到两台数据服务器上,那么就会有问题。
     (在紧接着的两行代码声明两个数据库类)
       只有在要用到哪个数据库连接的时候,再连接数据库,就不会有问题。
       
       新开一个问题,100分相赠:
       同样的问题,在两台服务器上分别保存的是新闻数据和BLOG数据,如果是新闻,访问数据库1,如果是BLOG,访问数据库2。
       针对于新闻和BLOG,写的是两个站代码,同一主域名,
       新闻WEB服务器和数据服务器在一起
       BLOG WEB服务器和数据服务器在一起。两站共用SESSION,在新闻数据服务器上。其实WEB前台的SESSION用的还并不是太多[当然也有]。
       但是,这样运行之后,新闻服务器一会就会忙的会崩溃掉(原来两个数据库都在新闻服务器上还好一些),请问这是为什么呢?
      

  11.   

    调用代码呢?有三个可能原因
    1、没有选db
    2、连接close了
    3、mysql的最大连接数设置成1了。
      

  12.   

    以上三个原因都是不可能的!
    1、每个操作之前都是做select_database操作
    2、关闭连接肯定没做。直到页面关闭(主动关闭,按说页面关闭后应该自动释放)
    3、那就更不可能了,最大连接数是1200
      

  13.   

    session_start();
    $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];
      

  14.   

    您有什么好的建议?
       当然,如果我在需要使用哪个数据库连接的时候,就直接写new database(n)//
       这样就没问题.但是我觉得很奇怪啊,为什么分了数据服务器,代码就要这么写!
       
       另外,如果服务器用固定IP地址,和用localhost,效率上有区别吗,两台服务器都有固定IP,
    这样数据访问会不会慢?
       是否可以将两台服务器做成局域网,来提高速度?
      

  15.   

    <?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太长了,没有时间看了,不知道我的回答对你有没有帮助呢?
      

  16.   

    回楼上:
       我写了一个数据库类database,里面有数据连接handle,保存的是连接服务器的句柄
       每当我生命一个数据对象的时候,该句柄在内存中保存(作为对象的一个字段)。
       我在调用的时候,其实是创建了两个对象,$db 和 $db2
       也就是说,我现在有两个句柄,分别连接server1和server2,照说这样的话,这两个句柄应该不会相互影响才对啊!
      

  17.   

    请问,如果我声明两个数据库对象
        如
        $db  = new database()
        $db1 = new database()
        这样会创建几个连接?(在database构造函数里都会创建一个连接,但是每个连接的参数都一样)