2013-01-02 19 views
5

Podczas korzystania z PDO powinienem móc wybrać parametr i wywołać echo. Wszystko, co otrzymuję to jednak NULL. Kiedy używam Workbencha, widzę to dobrze.Przechowywana procedura PDO i MySQL. Nie powracając do tego parametru

Czy ktoś może mi powiedzieć, dlaczego tak się dzieje?

CREATE PROCEDURE testing(OUT ret int) 
BEGIN SET ret=12; END; 

// On workbench returns '12' - Correct  
call testing(@ret); 
select @ret; 

// PHP/PDO returns NULL 
$stmt=Db()->prepare("CALL testing(@ret)"); 
$stmt->execute(); 
$param = Db()->query("SELECT @ret")->fetch(PDO::FETCH_ASSOC); 
var_dump($param); 

EDIT: Właśnie miałem przekonanie, że może to być specyficzny problem z Windows, więc wysłał ten przykład do mojego serwera UNIX i uzyskać dokładnie taki sam wynik, NULL.

+0

Jak sprawdzić błędy i zobacz co mówią http://php.net/manual/en/pdo.error-handling.php – Pablo

+0

Pablo, tak, mam sprawdzone błędy i nie są zgłaszane przez MySQL lub PDO. – NaN

Odpowiedz

1

Wygląda na to, że brakuje połączenia z numerem bindParam(). Od the PHP doc examples:

<?php 
/* Call a stored procedure with an INOUT parameter */ 
$colour = 'red'; 
$sth = $dbh->prepare('CALL puree_fruit(?)'); 
$sth->bindParam(1, $colour, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12); 
$sth->execute(); 
print("After pureeing fruit, the colour is: $colour"); 
?> 

UPDATE

Tęskniłem część MySQL. MySQL doesn't support Parametry wyjściowe wiązania przez jego C API. W naszym raporcie mówi się trzeba używać zmiennych poziomu SQL:

$stmt = $db->prepare("CALL sp_returns_string(@a)"); 
$stmt->execute(); 
print_r($db->query("SELECT @a")->fetchAll()); 

ale to jest dokładnie to, co robisz, i to nie działa. Próbuję tego teraz.

+0

MySQL nie obsługuje parametrów wyjściowych wiązania za pośrednictwem swojego C API. Musisz użyć zmiennych poziomu SQL: – rizon

+0

Dzięki Raffaele, ale bez kości. Byłem tam i robiłem to również, ale wciąż otrzymuję NULL wrócił. Dziękuję za odpowiedź. – NaN

+0

Jesteś [w prawo] (https://bugs.php.net/bug.php?id=35935). Przegapiłem część MySQL – Raffaele

0

Spróbuj

$stmt=Dbh->prepare("CALL testing(@ret)"); 
$stmt->execute(); 
$param = $stmt->fetchAll(); 
var_dump($param); 
+0

Rizon, właśnie uruchomiłem to i otrzymuję: 'tablica (0) {}' – NaN

1

widzę błąd tutaj http://bugs.mysql.com/bug.php?id=11638.

spróbować

insert "SELECT @someOutParameter" in your stored procedure and then use: 

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

Hej Rizon. Dzięki za link. Właśnie to znalazłem i przeżyłem. Podam przykład i spróbuję cię poinformować, ale znasz naprawdę dziwną rzecz? Mam inne aplikacje, które używają tych procedur i wszystkie nadal działają. Nie wiem, dlaczego to nie zadziała dla mnie; Nie uaktualniłem MySQL ani PHP. – NaN

+0

Rizon, to wynik: 'sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'CAST testing (' 1 ')' at line 1'' – NaN

+0

Po prostu z ciekawości, czy byłeś w stanie uzyskać którykolwiek z tego do pracy? – NaN

Powiązane problemy