2016-10-31 49 views
6

Istnieje wiele podobnych pytań do tego już opublikowany. Jednak nie znalazłem sposobu na uruchomienie tego kodu.PHP PDO z SQL Server i przygotowane oświadczenia

Aktualizuję kod PHP z natywnych zapytań MSSQL, aby używać PDO, w szczególności do korzystania z ODBC. Oto stary kod i dwie odmiany, które próbowałem.

Stary styl: Działa, to daje szereg oczekiwanych wyników.

$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); 

Korzystanie z T-SQL z PDO prawie działa: mam wyniki, tak długo jak nie próbować wiązać żadnych parametrów.

$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); 

Tworzy tablicę wielu oczekiwanych wyników. Jednak każda próba związania parametrów prowadzi do tego, że $results jest pustą tablicą. Nie zgłoszono błędów.

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

Prowadzi to do pustego zestawu wyników i nie zgłasza błędów.

Korzystanie ODBC "SQL" nie wydają się działać na wszystkich:

$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 jest pusta; z parametrami lub bez, nie działa.

Szczegóły systemu: Uruchamianie PHP 5.5.9 na Ubuntu Trusty (14) z zainstalowanymi unixodbc & freetds.

Naprawdę doceniłbym działający przykład PHP PDO wywoływania procedur składowanych i parametrów wiązania z MSSQL.

+0

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

+0

Po uzyskaniu pomocy. Łączę się teraz z '$ pdo = new PDO ('odbc = connection', 'user', 'password');' Jednak powiązanie z nazwanymi parametrami nadal nie działa. –

+0

Najlepiej edytować zmiany w swoim pytaniu, optymalnie zachowując zarówno to, co zacząłeś, jak i to, na co się zmieniłeś. – TallTed

Odpowiedz

3

Spróbuj ..

$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

To działa. Musiałem również zmienić połączenie DSN z dblib na "$ pdo = new PDO (" odbc = connection "," user "," password ");" –

3

Spróbuj zmienia to -

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

- do tego -

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

Zobacz ODBC documentation on Procedure Call Escape Sequence, a PHP PDO documentation Więcej ...

+0

OK, to bardzo pomaga. Mogę połączyć się z DSN ODBC i wywołać procedury z tą składnią. Jednak nadal nie mogę uzyskać parametrów wiążących do działania. Włączyłem śledzenie ODBC i zobaczę, czy to daje więcej wskazówek jutro. –

+0

Nie widzę żadnego kodu PHP pokazującego twoje wysiłki z powiązanymi parametrami, więc nie mogę zrobić tam żadnych użytecznych komentarzy ... – TallTed

+0

Dzięki. Chociaż jeśli wyszukasz "bind" na pytanie. W kodzie jest kilka przykładów. Prawdopodobnie całkowicie pomyliłem się i istnieje jakiś inny sposób. –