我目前的任务是将我们的网站代码移植到Linux服务器上(来自Win2003)。这些网站在SQL Server数据库上运行。原始开发人员创建了一个包装器来包含与数据库的所有交互,包括选择正确的数据库(应用程序跨越多个数据库) 问题代码如下......
if (strcmp($this->_DB_Connection, $param_Database) <> 0) {
$this->_DB_Selected = @mssql_select_db($param_Database, $this->_DB_Connection);
}
其中$ this-&gt; _DB_Connection是与DB服务器的连接,$ param_Database是下一个查询所需的数据库名称。
问题是在Windows上,strcmp返回 1 ,在linux上返回 NULL 。
任何人都可以解决这个问题,不会每次都选择数据库。
答案 0 :(得分:1)
您的连接失败且_DB_Connection
为空,或$param_Database
变量为空。
答案 1 :(得分:0)
我最后只是将最后选择的数据库的名称存储在DB包装器对象的成员变量中,并且正在比较它而不是SQL连接
答案 2 :(得分:-1)
这是您复制和粘贴的实际“真实”代码,还是您在此处输入的代码?
mssql_select_db()的第二个参数是数据库链接,它是一个资源。即$this->_DB_Connection
是资源,@mssql_select_db($param_Database, $this->_DB_Connection);
将始终失败
如果$this->_DB_Connection
是资源,那么您将资源传递给strcmp($this->_DB_Connection, $param_Database)
,隐式转换为字符串将类似于resource #3
。因此,除非调用数据库resource #3
,否则strcmp()将始终失败。
根据您提供的代码,选择两个功能中的哪一个始终失败。
要使此方法有效,请将当前所选数据库的名称存储在对象的属性中,并将其用于比较。
protected $_Current_Database = null;
[...]
if ( 0!==strcmp($this->_Current_Database, $param_Database) ) {
$this->_DB_Selected = @mssql_select_db($param_Database, $this->_DB_Connection);
if ( $this->_DB_Selected ) {
$this->_Current_Database = $param_Database;
}
else { // select_db failed.
$msg = mssql_get_last_message();
// do something with $msg here, e.g. echo 'mssql message: ', $msg;
}
}
[...]