PHP + PDO + SQL Server + SQL-запрос LIKE = возможные проблемы

Если у вас возникает ошибка

SQLSTATE[IMSSP]: Tried to bind parameter number 0.  SQL Server supports a maximum of 2100 parameters.

при запросе типа

SELECT * FROM table_name WHERE name LIKE 'nick'

с использованием подготовленного SQL-запроса в PHP PDO на сервер БД Microsoft SQL Server, то знайте в чем беда: функция prepare() уже сама проставит все кавычки и отметки (юникод или ASCII), за неё это не следует делать. А теперь конкретный пример: есть запрос SELECT * FROM table_name WHERE name LIKE ‘%<something>%’ Дабы использовать всю мощь PDO в борьбе с SQL-инъекциями следует использовать методы prepare и execute. Как это делать неправильно:


$sql = "SELECT * FROM table_name WHERE name LIKE N'%:name%'";

$db = new PDO("...");

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // catch error via normal "try ... catch"

$statement = $db->prepare($sql);

$statement->execute(array(':name' => 'Наташа'));

Казалось бы, всё правильно. Мы поставили символ N в $sql, который говорит SQL Server, что поиск пойдет по тексту в кодировке юникод, обрамили сам запрос в кавычки. Но нет! Лезут ошибки. А дело оказалось в том, что prepare() сам уже проставит всё, что нужно. Таким образом правильный код выглядит следующим образом:


<strong>$sql = "SELECT * FROM table_name WHERE name LIKE :name";</strong>

$db = new PDO("...");

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // catch error via normal "try ... catch"

$statement = $db->prepare($sql);

<strong>$statement->execute(array(':name' => '%Наташа%'));</strong>

Помог ответ на этот вопрос (хотя там ошибка другая у товарища). И еще, после дочитал-таки официальный ман по теме и оказалось в последнем примере как раз говорится о такой ошибке. В общем, вся сложность в её выявлении оказалось в неадекватном сообщение об ошибке в SQL Server.