PHP同时连接多个mysql数据库的问题

最近在处理一个程序中遇到一个小问题,当时觉得很奇怪,后来在同事的协助下找了一些资料发现原来是mysql_connect这个函数造成的

是这样的 在一个程序中 同时对多个数据库进行连接,程序实际设计多个数据库的意图是为了将数据库分离,减轻数据库服务器的压力,但是我在调试的过程中 都是在本地一个服务器中进行的 建立的了类似于如下的代码:

//前面定义dbhost dbuser dbpwd 等 变量
$conn1 = mysql_connect($dbhost,$dbuser,$dbpwd);
mysql_select_db(”database1〃,$conn1);

$conn2 = mysql_connect($dbhost,$dbuser,$dbpwd);
mysql_select_db(”database2〃,$conn2);

$conn3 = mysql_connect($dbhost,$dbuser,$dbpwd);
mysql_select_db(”database3〃,$conn3);

然后执行一个最简单的 从database1中的table1中查询出所有资料
mysql_query(”select * from table1 where 1〃,$conn1); //注意 这里指定了通过conn1的连接来进行操作
程序返回了mysql错误 信息是 “table database3.table1 not exists ” 奇怪明明指定了conn1的 却为什么使用了conn3

再看php手册 中mysql_query的用法 :请大家注意加下划线的一行

resource mysql_query ( string query [, resource link_identifier] )

mysql_query() 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。

根据函数说明 我的用法并没有错! 明明已经加了 link_identifier 怎么还是使用了上一个打开的连接 ?
后来通过找了一些资料 再看手册 的mysql_connect函数 :

resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )

如果成功则返回一个 MySQL 连接标识,失败则返回 FALSE

我们一般都是用到password那个地方 bool new_link这个我们很少用 上面因为使用了相同的用户名和密码 虽然在我们看来建立的是3个链接 但是在mysql认为 这是一个链接,通过查看mysql的实时状态也证实了只是一个链接,也就是conn2 conn3根本只是conn1的一个影射,影射完以后进行了一个更改数据库的操作! 最终这个链接定位到了database3上面!!

$conn = mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,true) or die('MySQl Connect Error !');

查了下手册 mysql_connect(server,user,pwd,newlink,clientflag)

newlink 可选。如果用同样的参数第二次调用 mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数 new_link 改变此行为并使 mysql_connect() 总是打开新的连接,甚至当 mysql_connect() 曾在前面被用同样的参数调用过。

分享