Вам необходимо изменить инструкцию и использовать параметризованный запрос, чтобы предотвратить возможные проблемы с внедрением 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, особенно когда значения выходят за пределы целого диапазона .