2017-05-30 28 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でエラーログを有効にします。 Temateエンジンを使用して、データベースからUIを分離する必要があります。パラメータの使用は異なる - 削除{ts?}と?その姿勢で –

答えて

2

ODBC escape sequencesで動作する準備文を取得する可能性は低いです。 MySQL(関数UNIX_TIMESTAMP)とは異なり、Unixのタイムスタンプに変換するSQL Serverに組み込まれている関数はありません。あなたは自分を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'なのか、それがそのまま返された場合(つまりキャストやコンバージョンを意味しない)、SQLサーバの結果をPHPで' format'することができます。私は、SQL Serverの 'datetime'オブジェクトとphpの' DateTime'オブジェクトの間に正式な関係があるのか​​どうかはわかりませんが、あなたはそれを使うことができます(おそらくsqlsrvドライバがそのトリックを行います)。 – alalp

+0

それは面白いです、答えを編集します。 fetchメソッドのPHPドキュメンテーションにそれについての言及はありません。私はこれを見つけた:https://docs.microsoft.com/en-us/sql/connect/php/default-php-data-types – miken32

+0

pdo_sqlsrverは文字列を返すようだが、sqlsrvはdatetimeオブジェクトを返すようだphp。今、私は分かる。ありがとうございました。 – arsarc

関連する問題