#php #sql-server #pdo
#php #sql-сервер #pdo
Вопрос:
Я могу легко выполнить на php запрос pdo_dblib следующим образом:
$stmt = $pdo->prepare("
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY ID) AS _NO
FROM [Reports].[dbo].[Cycle]
) AS SOD
WHERE SOD._NO BETWEEN (( :page -1)* :rows ) 1
AND :rows * 2
");
$stmt->bindValue('page', 2);
$stmt->bindValue('rows', 2);
$stmt->execute();
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
Результат:
Array
(
[0] => Array
(
[ID] => 4608
[StartTime] => Apr 15 2014 06:00:00:000PM
[EndTime] => Apr 16 2014 09:30:00:000AM
[ComputeTime] => May 29 2014 04:33:35:743PM
[ComputeSettlementTime] => May 29 2014 04:34:49:063PM
[_NO] => 3
)
[1] => Array
(
[ID] => 4609
[StartTime] => Apr 16 2014 09:30:00:000AM
[EndTime] => Apr 16 2014 10:00:00:000AM
[ComputeTime] => May 29 2014 04:34:05:927PM
[ComputeSettlementTime] => May 29 2014 04:34:49:297PM
[_NO] => 4
)
)
но если я попытаюсь установить параметр «страница» во второй раз вместо «2» в этом запросе, например, параметр «строки», который уже использовался дважды в одном и том же запросе, я получу результат:
$stmt = $pdo->prepare("
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY ID) AS _NO
FROM [Reports].[dbo].[Cycle]
) AS SOD
WHERE SOD._NO BETWEEN (( :page -1)* :rows ) 1
AND :rows * :page
");
$stmt->bindValue('page', 2);
$stmt->bindValue('rows', 2);
$stmt->execute();
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
результат:
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 8117 General SQL Server error: Check messages from the SQL Server [8117] (severity 16) [(null)]'
и этот код ошибки я не могу найти в таблице ошибок: 8117.
Кто-нибудь знает, что происходит?
Комментарии:
1. Отсутствует
:
попытка$stmt->bindValue(':page', 2);
2. @JitendraYadav Это не имело бы значения.
Ответ №1:
Вы должны называть каждый заполнитель по-разному и привязывать его.
$stmt->bindValue('page1', 2);
$stmt->bindValue('page2', 2);
...