无法从具有日期时间格式的 col 获取数据
Can't get data from col which has datetime format
我正在尝试从 MS SQL 服务器获取按当前时间过滤的列数据。单元格具有 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));
}
?>
您需要更改语句并使用参数化查询来防止可能的 SQL 注入问题。正如documentation中提到的,sqlsrv_query函数非常适合一次性查询,除非特殊情况适用,否则应该是执行查询的默认选择。此函数提供了一种简化的方法,可以用最少的代码执行查询。 sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.
当您为 datetime
个值使用参数时,您有两个选择:
- 将
datetime
值作为文本传递,使用明确的 datetime
格式作为 $datetimenow
变量的值(在您的情况下函数 current_time
returns 当前时间作为来自格式化 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服务器获取数据时,
datetime
值默认为returned作为PHPdatetime
对象,所以你需要使用DateTime->format()
或在连接字符串或语句级别设置 'ReturnDatesAsStrings'
选项。
- 当您将绑定值发送到小数或数字列(在 documentation 中也提到)时,建议使用字符串作为输入以确保精度和准确性,因为 PHP 对浮点数的精度有限。这同样适用于 bigint 列,尤其是当值超出整数范围 .
时
我正在尝试从 MS SQL 服务器获取按当前时间过滤的列数据。单元格具有 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));
}
?>
您需要更改语句并使用参数化查询来防止可能的 SQL 注入问题。正如documentation中提到的,sqlsrv_query函数非常适合一次性查询,除非特殊情况适用,否则应该是执行查询的默认选择。此函数提供了一种简化的方法,可以用最少的代码执行查询。 sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.
当您为 datetime
个值使用参数时,您有两个选择:
- 将
datetime
值作为文本传递,使用明确的datetime
格式作为$datetimenow
变量的值(在您的情况下函数current_time
returns 当前时间作为来自格式化 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服务器获取数据时,
datetime
值默认为returned作为PHPdatetime
对象,所以你需要使用DateTime->format()
或在连接字符串或语句级别设置'ReturnDatesAsStrings'
选项。 - 当您将绑定值发送到小数或数字列(在 documentation 中也提到)时,建议使用字符串作为输入以确保精度和准确性,因为 PHP 对浮点数的精度有限。这同样适用于 bigint 列,尤其是当值超出整数范围 . 时