数据库中没有数据

No data from Database

我写了一个 php 应用程序,它应该 select 根据给定日期从数据库中获取数据。数据库中的日期存储为 2020-07-03。执行语句的代码看起来像


$from = $_POST['from'];
$to = $_POST['to'];

$sql = "SELECT * FROM Database WHERE Date < $from";
$stmt = sqlsrv_query($conn, $sql);

if($stmt == false){
    die( print_r( sqlsrv_errors(), true) );
}
echo $sql;

while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
    echo $row[0].", ".$row[1]."<br />";
}

$from$to 是用户使用日期输入字段给出的范围,return 用户输入如 2020-07-02。 “日期”字段的数据类型是日期。我没有得到任何错误或类似的东西,但它不会执行 while 循环,我不知道为什么。

您需要在语句中使用参数。正如documentation中提到的,sqlsrv_query() 函数非常适合一次性查询,应该是执行查询的默认选择,除非有特殊情况。此函数提供了一种简化的方法,可以用最少的代码执行查询。 sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.

您需要通过以下方式之一传递参数值:

  • 作为使用明确日期格式的文本 (yyyymmdd),
  • 使用扩展参数语法和适当的数据类型绑定。

示例,基于问题中的代码,对日期使用文本值:

<?php
// Connection
$server    = 'server,port';
$database  = 'database';
$uid       = 'uid';
$pwd       = 'pwd';
$cinfo = array(
   "ReturnDatesAsStrings" => true,
   "Database" => $database,
   "UID" => $uid,
   "PWD" => $pwd
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
   echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
   exit;
}

// Test input
$from = (new DateTime('2020-07-02'))->format('Ymd');
$to   = (new DateTime('2020-07-03'))->format('Ymd');

// Statement
$sql = "
    SELECT * 
    FROM Database 
    WHERE (? <= [Date]) AND ([Date] <= ?)"
;
$params = array($from, $to);
$stmt = sqlsrv_query($conn, $sql, $params);
if($stmt == false){
    die( print_r( sqlsrv_errors(), true) );
}
echo $sql;

// Data
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
    echo $row[0].", ".$row[1]."<br />";
}

// End
sqlsrv_free_stmt($stmt);

?>

示例,基于问题中的代码,使用 PHP 日期对象和适当的参数绑定:

<?php
// Connection
$server    = 'server,port';
$database  = 'database';
$uid       = 'uid';
$pwd       = 'pwd';
$cinfo = array(
   "ReturnDatesAsStrings" => true,
   "Database" => $database,
   "UID" => $uid,
   "PWD" => $pwd
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
   echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
   exit;
}

// Test input
$from = new DateTime('2020-07-02');
$to   = new DateTime('2020-07-03');

// Statement
$sql = "
    SELECT * 
    FROM Database 
    WHERE (CONVERT(date, ?) <= [Date]) AND ([Date] <= CONVERT(date, ?))"
;
$params = array(
   array($from, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_DATETIME, SQLSRV_SQLTYPE_DATETIME),
   array($to, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_DATETIME, SQLSRV_SQLTYPE_DATETIME)
);
$stmt = sqlsrv_query($conn, $sql, $params);
if($stmt == false){
    die( print_r( sqlsrv_errors(), true) );
}
echo $sql;

// Data
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC) ) {
    echo $row[0].", ".$row[1]."<br />";
}

// End
sqlsrv_free_stmt($stmt);

?>