2016-10-31 1 views
6

Существует ряд подобных вопросов, которые уже были отправлены. Однако я не нашел способ заставить этот код работать.PHP PDO с SQL Server и подготовленные операторы

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

Old style: Works, Это дает массив ожидаемых результатов.

$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 Trusty (14) с установленным unixodbc & freetds.

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

+0

http: // st ackoverflow.com/a/32224294/285587? –

+0

После некоторой помощи. Я теперь подключаюсь к '$ pdo = new PDO ('odbc = connection', 'user', 'password');' Однако привязка к указанным параметрам все еще не работает. –

+0

Лучше всего изменить свои изменения в своем вопросе, оптимально сохранив как то, с чего вы начали, так и то, что вы изменили. – TallTed

ответ

3

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

$result = array(); 

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

$result = $sp->fetchall(PDO::FETCH_OBJ); 
+0

Это работает. Мне также пришлось изменить соединение DSN с dblib на «$ pdo = new PDO (« odbc = connection »,« user »,« password »); –

3

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

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

- к этому -

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

См ODBC documentation on Procedure Call Escape Sequence, и PHP PDO documentation для более ...

+0

Хорошо, это очень помогает. Я могу подключиться к ODBC DSN и вызывать процедуры с этим синтаксисом. Однако я все еще не могу заставить привязывать параметры к работе. Я включил отслеживание ODBC и увидит, что это даст больше подсказок завтра. –

+0

Я не вижу никакого PHP-кода, показывающего ваши усилия с привязанными параметрами, поэтому я не могу делать какие-либо полезные комментарии там ... – TallTed

+0

Спасибо. Хотя если вы ищете «bind» в вопросе. В коде есть несколько примеров. Возможно, я полностью понял это, и есть другой путь. –

 Смежные вопросы

  • Нет связанных вопросов^_^