2010-03-10 142 views
1

我有一個正在從MySql移動到Sql Server的CakePHP應用程序。有一個查詢似乎並不正確傳輸:CakePHP - 生成的查詢與SQL Server無法正常工作

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column' => array(1, 2, 3) 
     ) 
    ) 
); 

當我使用這個語法與MySQL,它似乎「解包」的陣列 正確,並且生成的查詢是一樣的東西

「 ... WHERE 'Model.column' IN(1,2,3)... 「

當我使用SQL Server,生成的查詢是

」 ... WHERE 'Model.column' IN '陣列'「...

這顯然會產生一個錯誤。我昨天在CakePHP Google Group上發佈了這個問題,但還沒有收到回覆,所以我想我會試試。如果任何人有任何想法/建議,我將不勝感激。

回答

1

生成此代碼在dbo_source.php(function conditionKeysToString)中,而特定的數據庫驅動程序可以覆蓋它,我從來沒有見過這樣做。

我在我的系統上有1.2.5,1.2.6和1.3.0-RC1,它們都追加'IN(',沒有任何函數替代,沒有添加'IN'的實例,然後決定是否它是一個數組或標量值,當數組變量在字符串上下文中被計算時,會發生這樣的字數組:EG:php -r'$ a = array(1,2,3); echo $ a;'將輸出陣列。

檢查蛋糕/兩version.txt文件。如果它們是不同的,備份上的SQL Server實例的蛋糕目錄,並從MySQL的一個替換它。

如果它們是相同的嘗試去cake/libs/model/datasources目錄。希望你有Unix或Linux,因爲「grep -r'IN'*」將極大地幫助你。否則,在兩次安裝Cake之間比較dbo_soures.php和dbo/dbo_mssql.php,並查看conditionKeysToString是否有任何區別。

最終我會升級到1.2.6,以便您獲得任何和所有修復程序。

+0

只是增加:這是正確的,因爲''Array''似乎是一個自動數組字符串由PHP完成。它*應該*拋出一個通知,如果這樣做。 *應該*幫助找到*演員正在完成的地方。 – deceze 2010-03-10 23:22:59

+0

對不起,我不清楚,但沒有兩個安裝的蛋糕。我的應用程序是使用MySQL作爲數據庫開發的,但現在管理員希望它使用SQL Server,所以我試圖調試生成的查詢中的任何不一致。我在Linux機器上使用1.2.6。我沒有在cake/libs/model/datasources/dbo/dbo_mssql.php中看到任何會覆蓋默認行爲的東西,所以我將嘗試查找更多關於正在執行的演員的信息。 – 2010-03-12 15:50:34

+0

只需檢查一下,看看你是否取得了進展。我猜這是甚至相同的機器,所以PHP版本將是相同的。 PHP和調試器可能會很痛苦。跟蹤代碼的簡單方法是編輯dbo_mssql。PHP和發現: function _execute($ sql){ return mssql_query($ sql,$ this-> connection); } 並將其更改爲: 函數_execute($ sql){ $ this-> log(debug_backtrace()); return mssql_query($ sql,$ this-> connection); } 它會在您的日誌中轉儲大量數據,但您會得到很多狀態信息。 – 2010-03-24 16:19:04

0

嘗試通過該條件爲一個字符串:

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column in (1, 2, 3)' 
     ) 
    ) 
); 
+0

這很好,如果你是硬編碼1,2,3 。如果這些來自用戶,則可能會挫敗使用Cake這樣的目的。關於RoR,Cake等的一點是開發人員不需要擔心注入攻擊。 – 2010-03-24 16:04:53

0

試試這樣說:

$this->Model->find('all', array(
     'conditions' => array(
      'Model.column' => array(
       'OR' => array(1, 2, 3) 
      ) 
     ) 
    ) 
);