2017-05-30 84 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