2012-11-14 25 views
11

Ho utilizzato PDO per un po 'di tempo e sto rifattorizzando un progetto in modo che utilizzi stored procedure anziché SQL in linea. Ricevo un errore che non riesco a spiegare. Uso la versione 5.3.5 di PHP e la versione 5.0.7 di MySQL.Chiamare la procedura memorizzata con il parametro Out utilizzando PDO

Sto solo cercando di ottenere un proc memorizzato di base con un output per funzionare. Ecco il proc memorizzato:

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

Ecco il codice che sto usando per chiamare il proc, $ db è un'istanza della DOP:

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

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

Semplice no? Tuttavia, il risultato e 'il seguente errore:

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 

Se chiamo il proc direttamente in questo modo:

CALL proc_OUT(@res); 
SELECT @res; 

funziona come ci si aspetta che mi porta a credere che ci sia un problema con come è essere chiamato con PHP, tuttavia non riesco a trovare quale sia il problema. Sto seguendo le istruzioni in the manual ma sto ancora ricevendo questo errore. Qualcuno potrebbe suggerire cosa potrei fare di sbagliato? Qualsiasi consiglio sarebbe molto apprezzato. Grazie mille!

+1

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

+1

L'ho replicato con mysql 5.5.28 e php 5.3.10. Inoltre, sembra che tu abbia 2 versioni di '$ return_value'- un'altra senza il carattere di sottolineatura. È destinato? Non sembra fare la differenza in uscita. –

risposta

8

Sembrerebbe che ci sia un bug al lavoro qui, la soluzione migliore che ho trovato è questo:

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

Dal commento al link di cui sopra:

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

See anche questo: https://stackoverflow.com/a/4502524/815386

4

È necessario specificare che il parametro è IN/OUT come nell'esempio di un sito Web PHP:

http://php.net/manual/en/pdo.prepared-statements.php esempio # 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

Grazie per la risposta. Il mio stored proc non ha un parametro in/out, è solo un parametro out come l'esempio # 4 sulla pagina che hai collegato – TheMethod

+1

Il mio errore. Dai un'occhiata qui http: //www.danstraw.com/calling-mysql-stored-procedures-from-phps-pdo-output-parameters/2010/12/21/Potrebbe essere un bug MySQL – sdespont

+0

Sembra risolto per MySQL versione 5.5.3+ e 6.0.8+. Puoi aggiornare? – sdespont

4

Got it! Basta aggiungere un

SELECT @outputparam; 

al termine della stored procedure, in cui @outputparam è il nome usato per il parametro nella definizione della stored procedure. Se non è possibile modificare la stored procedure, è necessario eseguire una seconda query, per SELECT @outputparam, con PHP PDO per ottenere il valore del parametro di output.

Suggerimento: se si utilizza DBLib obsoleto per connettersi a SQL Server e la procedura memorizzata è stata modificata come suggerito, sarà inoltre necessario modificare la sintassi per ottenere il valore del parametro di uscita nello script PHP chiamante:

$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

Mille grazie per la tua risposta, questa soluzione mi ha salvato giorni – vietnguyen09

Problemi correlati