2010-07-23 54 views
0

我目前的任务是将我们的网站代码移植到Linux服务器上(来自Win2003)。这些网站在SQL Server数据库上运行。原来dev目录下创建一个包装包含与数据库,包括选择正确的数据库的所有交互(应用跨越多个数据库) 问题代码如下...当前在SQL Server中选择的数据库

if (strcmp($this->_DB_Connection, $param_Database) <> 0) { 
    $this->_DB_Selected = @mssql_select_db($param_Database, $this->_DB_Connection); 
} 

其中$此 - > _ DB_Connection是连接到数据库服务器和$ param_Database是下一个查询所需的数据库的名称。

问题是在Windows上,strcmp返回,在linux上它返回NULL

任何人都有一个这样的工作涉及每次选择数据库。

回答

0

我已经结束了只是存储在数据库包装对象的成员变量最后选定数据库的名称和我比较,代替SQL连接

1

您的连接失败,并且_DB_Connection为空,或者$param_Database变量为空。

+0

没有。 _DB_Connection包含一个有效的资源标识符,$ param_Database包含一个字符串 – michael 2010-07-23 10:43:09

-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; 
     } 
    } 
    [...] 
+0

+1更好的答案 – Andomar 2010-07-23 09:42:27

+0

是的这是实际的代码(请注意,我没有写这个)。 $ this - > _ DB_Connection是一个有效的资源标识符。 如果我删除if语句,mssql_select_db将起作用。 同意我会期望strcmp失败(因为它在linux主机下),但它通过Windows。 我不喜欢这个代码,二进制比较资源和字符串是坏的,因此我要求更好的解决方案 – michael 2010-07-23 10:46:06

+0

@michael:要相信这个代码在Windows机器上工作需要更多的信仰魔术比我有; - )你究竟是怎么测试它的?用像xdebug这样的调试器?一些var_dump/echo行? – VolkerK 2010-07-23 11:13:03