Не удается получить данные из столбца с форматом даты и времени - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь получить данные столбца, отфильтрованные по текущему времени с сервера MS SQL. Ячейки имеют формат datetime. Но получаю пустой ответ. Где ошибка?

enter image description here

enter image description here

<?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 Ответ

1 голос
/ 30 мая 2020

Вам необходимо изменить инструкцию и использовать параметризованный запрос, чтобы предотвратить возможные проблемы с внедрением SQL. Как упоминается в документации , функция sqlsrv_query хорошо подходит для одноразовых запросов и должна использоваться по умолчанию для выполнения запросов, если не применяются особые обстоятельства. Эта функция предоставляет упрощенный метод выполнения запроса с минимальным объемом кода. Функция sqlsrv_query выполняет как подготовку операторов, так и их выполнение, и может использоваться для выполнения параметризованных запросов .

Когда вы используете параметр для datetime значений, у вас есть два варианта:

  • Передайте значение datetime в виде текста, используя однозначный формат datetime для значения переменной $datetimenow (в вашем случае функция current_time возвращает текущее время в виде текста из отформатированного PHP объекта datetime).
  • Передайте значение datetime как PHP объект datetime с использованием расширенного синтаксиса параметров.

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 сервера, значения datetime возвращаются как объекты PHP datetime по умолчанию, поэтому вам нужно использовать DateTime->format() или установить параметр 'ReturnDatesAsStrings' в строке подключения или на уровне оператора.
  • Когда вы отправляете значения привязки в десятичный или числовой столбец c (также упоминается в документации ), рекомендуется использовать строки в качестве входных данных для обеспечения точности и точности, поскольку PHP имеет ограниченную точность для чисел с плавающей запятой. То же самое относится к столбцам bigint, особенно когда значения выходят за пределы целого диапазона .
...