Как выполнить WHERE-запрос к MS SQL, используя PHP PDO?

Я использую PHP 7.3 и библиотеку php_pdo_sqlsrv_73_nts_x64.dll для доступа к Microsoft SQL Server 14. Для удобства выполнения запросов в основном коде, я несколько лет использую код, который взял (по-моему) из какой-то версии OpenCart и адаптировал его для работы с MSSQL. Одна из основных функций - query - выглядит вот так:

public function query($sql, $params = array()) {
    $this->statement = $this->connection->prepare($sql);

    $result = false;

    try {
        if ($this->statement && $this->statement->execute($params)) {
            $data = array();

            while ($row = $this->statement->fetch(\PDO::FETCH_ASSOC)) {
                $data[] = $row;
            }

            $result = new \stdClass();
            $result->row = (isset($data[0]) ? $data[0] : array());
            $result->rows = $data;
            $result->num_rows = $this->statement->rowCount();
        }
    } catch (\PDOException $e) {
        throw new \Exception('Error: ' . $e->getMessage() . ' Error Code : ' . $e->getCode() . ' <br />' . $sql);
    }

    if ($result) {
        return $result;
    } else {
        $result = new \stdClass();
        $result->row = array();
        $result->rows = array();
        $result->num_rows = 0;
        return $result;
    }
}

Все это время функция исправно служила мне, но недавно я заметил, что она попросту игнорирует некоторые значения. Например, запрос:

$rs = $db->query("SELECT TOP 10 * FROM Products");

прекрасно выполняется, в то время как запрос

$rs = $db->query("SELECT TOP 10 * FROM Products WHERE IsSuppressed = 1");

не возвращает никаких результатов. То есть num_rows = 0.

Я пробовал играть с bindParam и prepare, но ничего не достигает желаемого результата: первая строчка исполняется, а там где появляется WHERE и явно указанное условие - запрос не возвращает результатов. Причем, я просто хочу понять как это работает на простом и прямолинейном примере с явным указанием параметра (hardcoded query). То есть пока мне нет дела до SQL injection - я просто хочу увидеть как мой запрос (№2) выполнится и вернет recordset. Что я делаю не так? Где мне почитать об особенностях таких запросов?

Существуют ли удобные надстройки (wrappers) в виде класса, которые позволяют обращаться из PHP к SQL Server, используя простейшие методы? Например:

  • query - запрос с возвращением данных в виде dataset/recordset.
  • exec - запрос без возвращения данных; простое исполнение DML-оператора на стороне сервера.
  • sp_query - то же что и query, но только вызов хранимой процедуры.
  • sp_exec - соответственно.

Ответы (0 шт):