2016-02-10 48 views
0

我在Windows上的PHP 5.6.16,以前是使用MySQL的PDO所有查詢。我在這裏做的唯一更改是使用Microsoft SQL Server 2008而不是MySQL作爲數據庫。因此,我現在已經安裝了適當的SQLSRV驅動程序,phpinfo()看到它並很開心,並且生活一直沒有數據庫連接錯誤。PHP PDO_SQLSRV bindparam()不起作用

在嘗試使用讀取查詢加載某些頁面後,我看不到任何數據通過。我發現在我的$queryResult = $query->execute();命令後,這個$queryResult變量返回FALSE

所以我走了一步,發現我在$query的實際查詢仍然有我準備好的變量,而沒有綁定的數據。這裏就是我綁定變量並執行:

$query->bindParam(':startDate', $startDate); 
$query->bindParam(':endDate', $endDate); 
$queryResult = $query->execute(); 

下面是$query一個VarDump後這些:

object(PDOStatement)#16 (1) { ["queryString"]=> string(86) "SELECT * WHERE UNIX_TIMESTAMP(DATE) >= :startDate AND UNIX_TIMESTAMP(DATE) <= :endDate"} 

這是我的理解是,在這裏,我看到真實的數據,全面查詢,而不是準備的變量。 MS SQL SRV在安裝或初始化期間無法完成嗎?到目前爲止,我還沒有在網絡上發現任何類似的問題。

謝謝。

+1

有沒有'UNIX_TIMESTAMP()'函數SQL Server。看到http://stackoverflow.com/questions/8837225/unix-timestamp-in-sql-server – Barmar

+0

@Barmar當然!非常感謝。 – Shackrock

回答

0

當你移動到SQL Server時,事情不會改變,你仍然必須檢查像你以前應該做的錯誤。從準備或執行中返回假,通常意味着查詢因某種原因失敗,或者連接不正確

向所有對數據庫訪問層的調用添加一些錯誤檢查。

我假設你沒有設置例外的連接上這裏

// add check for good result from prepare 
if ($query === FALSE) { 
    print_r($conn->errorInfo()); 
    exit; 
} 

$query->bindParam(':startDate', $startDate); 
$query->bindParam(':endDate', $endDate); 
$queryResult = $query->execute(); 

if ($queryResult === FALSE) { 
    print_r($query->errorInfo()); 
    exit; 
} 

此代碼應再告訴你什麼是錯,你可以自己解決問題

哦,你也應該檢查該連接正常工作,如果發生錯誤則顯示錯誤

另一個有用的調試工具是在腳本中的第一個<?php標記之後,在調試過程中添加這些行。你不希望這個信息被髮送到課程

<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors', 1); 

特別是如果你是一個活的服務器上工作的真實用戶,其中錯誤報告是最有可能關閉