Как выполнить 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 - соответственно.