2010-07-23 55 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