2017-05-30 117 views
1

我遇到了sqlsrv驅動程序的此語法的問題。準備聲明與TS

這只是正常:

$sql = "SELECT * from Table1 WHERE (Table1.Time >= {ts '2017-05-08 
      00:00:00' } AND Table1.Time < {ts '2017-05-10 00:00:00' })"; 
    $stmt = sqlsrv_query($conn, $sql); 

    $tbl = "<table>" 
    while ($row = sqlsrv_fetch_array($stmt)){ 
     $tbl .= "<tr><td>".$row[0]."</td><td>".$row[1]->format('Y-m-d H:i:s')."</td><td align=\"center\">".$row[2]."</td></tr>"; 
    } 
    $tbl .= "</table>"; 
    echo $tbl; 

但這不起作用了所有:

 $sql = "SELECT * from Table1 WHERE (Table1.Time >= {ts ? } AND Table1.Time < {ts ? })"; 
     $stmt = sqlsrv_prepare($conn, $sql, array('2017-05-08 00:00:00','2017-05-10 00:00:00')); 
     $result = sqlsrv_execute($stmt); 
     $tbl = "<table>" 
     while ($row = sqlsrv_fetch_array($stmt)){ 
      $tbl .= "<tr><td>".$row[0]."</td><td>".$row[1]->format('Y-m-d H:i:s')."</td><td align=\"center\">".$row[2]."</td></tr>"; 
     } 
     $tbl .= "</table>"; 
     echo $tbl; 

我得到這個錯誤:

An invalid parameter was passed to sqlsrv_execute. [message] => An invalid parameter was passed to sqlsrv_execute.) 

有沒有一種正確的方法將日期變量傳遞給{ ts ? }聲明?

+0

當你得到一個空白頁面時,啓用PHP中的錯誤記錄。您應該使用臨時引擎從數據庫分離UI。使用參數工作不同 - 刪除{ts?}並只放一個?在位置。 –

回答

2

您不可能獲得準備好的與ODBC escape sequences合作的聲明。與MySQL(具有UNIX_TIMESTAMP函數)不同,SQL Server中沒有內置任何函數可以爲您轉換爲Unix時間戳。你可以do the math自己,但也許它只是更容易做到這一點在PHP中:

$begin = strtotime('2017-05-08 00:00:00'); 
$end = strtotime('2017-05-10 00:00:00'); 
$sql = "SELECT * FROM Table1 WHERE Table1.Time >= ? AND Table1.Time < ?)"; 
$stmt = sqlsrv_prepare($conn, $sql, array($begin, $end)); 
$result = sqlsrv_execute($stmt); 
$tbl = "<table>" 
while ($row = sqlsrv_fetch_array($stmt)){ 
    $row[1] = $row[1]->format('Y-m-d H:i:s'); 
    $tbl .= "<tr><td>$row[0]</td><td>$row[1]</td><td align=\"center\">$row[2]</td></tr>"; 
} 
$tbl .= "</table>"; 
echo $tbl; 

你應該枚舉你獲取使用*而不是列,然後按名稱引用它們(如$row["Time"]),而不是數量。它將使您的代碼更具可讀性並防止數據庫架構發生變化。

+1

實際上,如果列類型是'datetime'或類似的東西,並且它返回原樣(我的意思是沒有轉換或轉換),他可以在php中格式化sql服務器結果。我不知道sql server的'datetime'對象和php的'DateTime'對象之間是否有任何形式的關係,但是你可以使用它(也許sqlsrv司機會這樣做)。 – alalp

+0

這很有趣,會編輯答案。 PHP文檔中沒有提到任何提取方法。我確實找到了這個:https://docs.microsoft.com/en-us/sql/connect/php/default-php-data-types – miken32

+0

pdo_sqlsrver似乎返回一個字符串,但sqlsrv似乎返回一個日期時間對象PHP。我現在知道了。謝謝。 – arsarc