2012-11-14 19 views
11

Używam PDO już od jakiegoś czasu i dokonuję refaktoryzacji projektu, aby używał zapisanych procesów zamiast wstawianego SQL. Otrzymuję błąd, którego nie mogę wyjaśnić. Używam wersji PHP 5.3.5 i MySQL w wersji 5.0.7.Wywołanie procedury składowanej z parametrem Out przy użyciu PDO

Po prostu próbuję uzyskać podstawowy zapisany proces z wyjściem do pracy. Oto przechowywane proc:

DELIMITER // 
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100)) 
BEGIN 
    SET var1 = 'This is a test'; 
END // 

Oto kod używam zadzwonić do proc, $ db jest instancją PDO:

$stmt = $db->prepare("CALL proc_OUT(?)"); 
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

    // call the stored procedure 
    $stmt->execute(); 
    echo $returnvalue; 

Proste prawda? Jednak wyniki w następujący błąd:

exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger 

Gdybym wywołać proc bezpośrednio tak:

CALL proc_OUT(@res); 
SELECT @res; 

to działa zgodnie z oczekiwaniami, które pozwala mi wierzyć, że nie ma problemu z tym, jak to jest będąc wywoływanym przez PHP, jednak nie mogę znaleźć problemu. Postępuję zgodnie z instrukcjami w the manual, ale nadal otrzymuję ten błąd. Czy ktoś mógłby zasugerować, co mogę zrobić źle? Każda rada byłaby bardzo doceniana. Dzięki wielkie!

+1

http://stackoverflow.com/a/4502524/815386 –

+1

Powtórzyłem to z mysql 5.5.28 i php 5.3.10. Wydaje się, że masz dwie wersje '$ return_value' - inną bez podkreślenia. Czy to jest zamierzone? Wydaje się, że nie ma różnicy w wynikach. –

Odpowiedz

8

Wydawałoby się, że jest to błąd w pracy tutaj, najlepszym rozwiązaniem Znalazłem to:

http://www.php.net/manual/en/pdo.prepared-statements.php#101993

Z komentarzem w linku powyżej:

$dbh->query("CALL SomeStoredProcedure($someInParameter1, $someInParameter2, @someOutParameter)"); 
$dbh->query("SELECT @someOutParameter"); 

// OR, if you want very much to use PDO.Prepare(), 
// insert "SELECT @someOutParameter" in your stored procedure and then use: 

$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)"); 
$stmt ->execute(array($someInParameter1, $someInParameter2)); 

Apostolskiej również w tym: https://stackoverflow.com/a/4502524/815386

4

musisz określić, że parametr IN/OUT styl jak np PHP stronie internetowej:

http://php.net/manual/en/pdo.prepared-statements.php Przykład # 5

<?php 

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); 
$value = 'hello'; 
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

// call the stored procedure 
$stmt->execute(); 

print "procedure returned $value\n"; 
+0

Dzięki za odpowiedź. Mój zapisany proces nie ma parametru wejściowego/wyjściowego, jest to tylko parametr wyjściowy, taki jak przykład nr 4 na stronie, którą podłączyłeś. – TheMethod

+1

Mój błąd. Zajrzyj tutaj http: //www.danstraw.com/calling-mysql-stored-procedures-from-phps-pdo-output-parameters/2010/12/21/Może to być błąd MySQL – sdespont

+0

Wydaje się być poprawiony dla MySQL w wersji 5.5.3+ i 6.0.8+. Czy możesz uaktualnić? – sdespont

4

Got it! Wystarczy dodać

SELECT @outputparam; 

po zakończeniu procedury przechowywanej, gdzie @outputparam to nazwa używana dla param w definicji procedury. Jeśli nie możesz edytować procedury przechowywanej, powinieneś wykonać drugie zapytanie, dla SELECT @outputparam, z PHP PDO, aby uzyskać wartość parametru wyjściowego.

Wskazówka: Jeśli używasz przestarzałej wersji DBLib do łączenia się z programem SQL Server i zmodyfikowałeś procedurę przechowywaną zgodnie z sugestią, musisz również zmodyfikować składnię, aby uzyskać wartość parametru wyjściowego w wywołującym skrypcie PHP:

$out = 0; 
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib 
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT); 
$sth->execute(); 
$sth->bindColumn(1, $out, PDO::PARAM_INT); 
$sth->fetch(PDO::FETCH_BOUND); 

var_dump($out); // works 
+1

Wielkie dzięki za odpowiedź, to rozwiązanie zaoszczędzić mi dni – vietnguyen09

Powiązane problemy