PHP PDO с SQL Server и подготовленными инструкциями


На этот счет уже опубликовано несколько аналогичных вопросов. Однако я не нашел способа заставить этот код работать.

Я обновляю кодовую базу PHP из собственных запросов MSSQL для использования PDO, в частности для использования ODBC. Вот старый код и два варианта, которые я пробовал.

Старый стиль: Работает, это дает множество ожидаемых результатов.

$db = mssql_connect('connection', 'user', 'password');
mssql_select_db('database', $db);

$sp = mssql_init('procedure', $db);
$param=1;
$results=[];
mssql_bind($sp,'@param',$param,SQLINT4,FALSE,FALSE);
$spRes = mssql_execute($sp);

while ($row = mssql_fetch_array($spRes, MSSQL_ASSOC)) $results[] = $row; 
mssql_free_statement($sp);
var_dump(results);

Использование T-SQL с PDO почти работает: я получаю результаты до тех пор, пока не пытаюсь связать какие-либо параметры.

$pdo = new PDO($'dblib:host=connection', 'user', 'password');
$pdo->query('use database');

$sp= $db->prepare("EXEC procedure");
$sp->execute();

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor();
var_dump(results);

Выдает множество ожидаемых результатов. Однако любая попытка привязать параметры приводит к тому, что $results является пустым массивом. Об ошибках не сообщается.

$sp= $db->prepare("EXEC procedure :param");
$sp->bindParam(':param', $param, PDO::PARAM_INT);

Это приводит к пустому набору результатов и не сообщает об ошибках.

Использование ODBC "SQL", похоже, вообще не работает:

$pdo = new PDO($'dblib:host=connection', 'user', 'password');
$pdo->query('use database');

$sp= $db->prepare("CALL procedure");
$sp->execute();

while ($row = $sp->fetch(PDO::FETCH_BOUND)) $results[] = $row; 
$sp->closeCursor();
var_dump(results);

$results пусто; с параметрами или без них, похоже, это не работает.

Сведения о системе: Запуск PHP 5.5.9 на Ubuntu Надежный (14) с unixodbc и freetds установленный.

Я был бы очень признателен за рабочий пример PHP PDO, вызывающий хранимые процедуры и связывающий параметры с MSSQL.

Author: Panagiotis Kanavos, 2016-10-31

2 answers

Попробуйте это..

$result = array();

$sp= $db->prepare("EXECUTE dbo.procedure :param");
$sp->bindParam(":param", $param, PDO::PARAM_INT);
$sp->execute();

$result = $sp->fetchall(PDO::FETCH_OBJ);
 3
Author: hector teran, 2016-11-08 17:58:42

Попробуйте изменить это --

$sp= $db->prepare("CALL procedure");

-- к этому --

$sp= $db->prepare("{ CALL procedure () }");

Смотрите документацию ODBC по Escape-последовательности вызова процедур и документацию PHP PDO для получения дополнительной информации...

 3
Author: TallTed, 2016-11-03 02:12:17