使用 PHP 在 MSSQL 中查询来自用户的数据

Query with data from user in MSSQL with PHP

(我实习期间被迫在微软 sql 服务器上工作)。 我不明白为什么我的查询在 PHP 中不起作用(它 returns 没有数据),但是当我将它直接放在 Microsoft SQL Server Management Studio 中时它起作用了(它 returns数据)。

这是我的代码:

<?php 
  require('conn.php');

    if(isset($_POST['submit-search'])){
      $search = $_POST['search'];
      $sql = "SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day, date, '$search') = 0";
      var_dump($sql);
      $result = sqlsrv_query($conn2, $sql);
      $queryResult = sqlsrv_num_rows($result);

      ?>
    (...)
      <?php
      if($queryResult > 0){
        while($donnees = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
          ?>
          <tbody>
          <tr>
            <th style="font-weight: normal;"><?php echo htmlspecialchars($donnees['codepo']); ?></th>
            <td><?php echo htmlspecialchars($donnees['codepsa']); ?></td>
            <td <?php if ($donnees['controle'] === 'NOK') {
                  echo 'style="color: red; font-weight: bold"';
                } ?>><?php echo htmlspecialchars($donnees['controle']);  ?></td>
            <td><?php echo $donnees['date'] ?></td>
          </tr>
        </tbody>
        <?php
        }
      } else {
        echo "No data";
      }
    }

var_dump($sql)returns我这个:

string(138) "SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') as date FROM dbo.codebarre where datediff(day, date, '20210107') = 0"

正如我在 Management studio 中粘贴它时告诉你的那样,它有效,所以我不明白为什么它不在这里。

您有两个选择:

  • 如果您想获得返回行的确切数量,请使用适当的游标类型执行 sqlsrv_query()
  • 如果要检查是否有返回的行,请使用 sqlsrv_has_rows()

PHP 代码使用 sqlsrv_num_rows():

<?php
    
   ...
   $result = sqlsrv_query($conn2, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
   $queryResult = sqlsrv_num_rows($result);
   if ($queryResult > 0) {
       // Fetch data
   }

   ...
?>

PHP 代码使用 sqlsrv_has_rows():

<?php
    
   ...
   $result = sqlsrv_query($conn2, $sql);
   $queryResult = sqlsrv_has_rows($result);
   if ($queryResult) {
       // Fetch data
   }

   ...
?>

作为附加说明,始终使用参数化语句来防止可能的 SQL 注入问题。正如documentation中提到的,函数sqlsrv_query()同时进行语句准备和语句执行,可用于执行参数化查询。

<?php

    ...
    $sql = "
        SELECT codepo, codepsa, controle, FORMAT(date, 'dd-MM-yyyy hh:mm:ss') AS date 
        FROM dbo.codebarre 
        WHERE datediff(day, date, ?) = 0
    ";
    $params = array($search);
    $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
    $result = sqlsrv_query($conn2, $sql, $params, $options);

...
?>