首页 > 解决方案 > 无法从具有日期时间格式的 col 获取数据

问题描述

我正在尝试从 MS SQL Server 获取按当前时间过滤的列数据。单元格有datetime格式。但我得到空洞的回应。哪里有错?

在此处输入图像描述

在此处输入图像描述

<?php
$serverName = ''; // server name
$cinfo      = array(
    "Database" => "", // database
    "UID" => "", // user
    "PWD" => "" // pass
);
$conn       = sqlsrv_connect($serverName, $cinfo);

if ($conn) {
    echo "connected" . "<br/>";
    $datetimenow = current_time("d.m.Y H:i"); // wordpress function
    echo $datetimenow . "<br/>"; // 30.05.2020 14:10
    if (($result = sqlsrv_query($conn, "SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime=$datetimenow")) !== false) {
        while ($obj = sqlsrv_fetch_object($result)) {
            echo $obj->Longitude . '<br />';
        }
    }
} else {
    die(print_r(sqlsrv_errors(), true));
}
?>

标签: phpsqlsql-serversqlsrv

解决方案


您需要更改语句并使用参数化查询来防止可能的 SQL 注入问题。如文档中所述,sqlsrv_query 函数非常适合一次性查询,除非有特殊情况,否则应该是执行查询的默认选择。此函数提供了一种简化的方法,可以用最少的代码执行查询。sqlsrv_query 函数同时进行语句准备和语句执行,并可用于执行参数化查询

当您使用参数作为datetime值时,您有两种选择:

  • 将值作为文本传递datetime,对变量的值使用明确datetime的格式$datetimenow(在您的情况下,函数current_time将当前时间作为文本从格式化的 PHP 日期时间对象返回)。
  • datetime使用扩展参数语法将值作为 PHP 日期时间对象传递。

PHP:

<?php
$serverName = '';     // server name
$cinfo = array(
    "Database" => "", // database
    "UID" => "",      // user
    "PWD" => ""       // pass
);
$conn = sqlsrv_connect($serverName, $cinfo);

if ($conn) {
    echo "connected" . "<br/>";

    // Datetime value in `yyyy-mm-ddThh:mi:ss` format
    $datetimenow = current_time("Y-m-d\TH:i:00");
    // or if you want a specific datetime value
    //$datetimenow = '2020-05-30T14:10:00';

    // Pass datetime value as text
    $sql = "SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime = ?";
    $params = array($datetimenow);
    if (($result = sqlsrv_query($conn, $sql, $params)) !== false) {
        while ($obj = sqlsrv_fetch_object($result)) {
            echo $obj->Longitude . '<br />';
        }
    }

    // Pass datetime value as PHP datetime object
    $sql = "SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime = ?";
    $params = array(
        array(
           date_create_from_format('Y-m-d\TH:i:s', $datetimenow),
           SQLSRV_PARAM_IN, 
           SQLSRV_PHPTYPE_DATETIME, 
           SQLSRV_SQLTYPE_DATETIME
        )
    );
    if (($result = sqlsrv_query($conn, $sql, $params)) !== false) {
        while ($obj = sqlsrv_fetch_object($result)) {
            echo $obj->Longitude . '<br />';
        }
    }

} else {
    die(print_r(sqlsrv_errors(), true));
}
?>

补充笔记:

  • 当您从 SQL Server 检索数据时,这些datetime值默认作为 PHP对象返回datetime,因此您需要在连接字符串或语句级别使用DateTime->format()或设置选项。'ReturnDatesAsStrings'
  • 当您将绑定值发送到十进制或数字列(文档中也提到)时,建议使用字符串作为输入以确保精度和准确性,因为 PHP 对浮点数的精度有限。这同样适用于 bigint 列,尤其是当值超出整数范围时

推荐阅读