2014-02-28 31 views
1

我試圖在我需要通過PDO連接到MSSQL數據庫的環境中使用Fat Free Framework。我編寫了一些代碼來測試數據庫查詢功能。這是我的第一次嘗試:F3不從SQL Server數據庫中提取模式?

$f3->route('GET /datasets/read', function($f3) { 
    $db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****"); 

    $results = $db->exec('SELECT * FROM builds'); 
    var_dump($results); 
}); 

這工作正常。我看到builds表中所有記錄都有一個很好的轉儲。到現在爲止還挺好。

我試圖使用該框架提供的ORM方法的下一件事:

$f3->route('GET /datasets/read', function($f3) { 
    $db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****"); 

    $builds =new DB\SQL\Mapper($db,'builds') 
    $builds->load(); 
}); 

然而,這將失敗。生成的查詢沒有字段(這是產生準確的查詢:SELECT FROM builds),這將導致:

內部服務器錯誤

PDOStatement對象:[微軟] [SQL Server本機客戶端11.0] [SQL 服務器]關鍵字 'FROM' 附近有語法錯誤:

[call stack]...[/call stack]

我在做什麼這裏正確嗎?我無法想象連接字符串有問題,因爲它在使用原始SQL方法時可以很好地檢索數據。需要某種配置來啓用表到實體映射?

我跟隨着指南here,以供參考。

回答

0

我通過日誌挖了一下,發現下面的查詢正在執行檢索表模式:

SELECT c.column_name  AS field, 
     c.data_type  AS type, 
     c.column_default AS defval, 
     c.is_nullable  AS nullable, 
     t.constraint_type AS pkey 
FROM information_schema.columns AS c 
     LEFT OUTER JOIN information_schema.key_column_usage AS k 
        ON c.table_name = k.table_name 
         AND c.column_name = k.column_name 
         AND c.table_schema = k.table_schema 
     LEFT OUTER JOIN information_schema.table_constraints AS t 
        ON k.table_name = t.table_name 
         AND k.constraint_name = t.constraint_name 
         AND k.table_schema = t.table_schema 
WHERE c.table_name = 'builds' 
     AND c.table_schema = 'test****'; 

查詢試圖強制執行的table_schema字段包含數據庫的名字!難怪它沒有找到任何列。要lib/db/sql/sql.php並從此改變行249:

($this->engine=='pgsql'? 
'c.table_catalog':'c.table_schema'). 

這樣:

($this->engine=='pgsql'||$this->engine== 'sqlsrv'? 
'c.table_catalog':'c.table_schema'). 

解決了這個問題。我不知道其他數據庫如何存儲指示數據庫名稱的字段,所以我認爲最好是保守的,並且只對SQL服務器數據庫進行此更改,我確信它是需要的。

+0

阿薩德謝謝指出這個錯誤。你能否在[Github](https://github.com/bcosca/fatfree/issues)上創建一個問題,以便你的修復被合併到代碼中? – xfra35

+0

@ xfra35打開一個問題[這裏](https://github.com/bcosca/fatfree/issues/565)。我個人的看法是,這不是一個很好的解決方案,而是更多的權宜之計。 –