为了账号安全,请及时绑定邮箱和手机立即绑定

无法从具有日期时间格式的 col 获取数据

无法从具有日期时间格式的 col 获取数据

PHP
慕哥6287543 2023-04-21 17:16:20
我正在尝试从 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));}?>
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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

当您将参数用于datetime值时,您有两个选择:

  • 将值作为文本传递,使用变量值的datetime明确格式(在您的情况下,函数将当前时间作为来自格式化的 PHP datetime 对象的文本返回)。datetime$datetimenowcurrent_time

  • 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对象返回,因此您需要在连接字符串或语句级别使用或设置选项。datetimeDateTime->format()'ReturnDatesAsStrings'

  • 当您将绑定值发送到小数或数字列(也在文档中提到)时,建议使用字符串作为输入以确保精度和准确性,因为 PHP 对浮点数的精度有限。这同样适用于 bigint 列,尤其是当值超出整数范围时


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信