Нет данных из базы данных - PullRequest
0 голосов
/ 13 июля 2020

Я написал приложение php, которое должно выбирать данные из базы данных в зависимости от заданной даты. Дата в базе данных хранится как 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 - это диапазон, который задается пользователем с полями ввода даты и возвращает пользовательский ввод, например 2020-07-02. Тип данных поля «Дата» - Дата. Я не получаю никаких ошибок или чего-то подобного, но он не выполняет while l oop, и я не могу понять почему.

1 Ответ

1 голос
/ 13 июля 2020

В выписке необходимо использовать параметры. Как упоминается в документации , функция 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);

?>
...