sql >> Databáze >  >> RDS >> Mysql

MySQL načte proměnnou z uložené procedury v PHP PDO

Ukazuje se, že se jedná o chybu, která trvá již dlouhou dobu... od roku 2005!

Zde je původní hlášení o chybě:2005 až 2013 . A zde je nová zpráva o chybě:Od roku 2013 do současnosti .

Existují různé přístupy, jak získat odpověď, jeden z nich jsem našel a předvedl...

'Trik' je v tom, že dostanete výstup z procedury 'mysql'. Je to „dvoustupňový“ proces.

  • První částí je spustit proceduru s vašimi vstupy a také jí říct, do jakých MYSQL proměnných má výsledek uložit.

  • Poté spustíte samostatný dotaz pro „výběr“ těchto proměnných „mysql“.

Je to popsáno docela jasně zde:php-calling-mysql-stored-procedures

Aktualizace (leden 2017):

Zde je příklad ukazující použití proměnných pro parametry procedury 'IN', 'INOUT' a 'OUT' Mysql.

Než začneme, zde je několik tipů:

  • Při vývoji:Spusťte PDO v „emulačním režimu“, protože je spolehlivější při určování chyb ve volání procedury.
  • Navazujte proměnné PHP pouze na parametry procedury 'IN'.

Při pokusu o vazbu proměnných na parametry INOUT a OUT se objeví opravdu zvláštní chyby za běhu.

Jako obvykle mám tendenci poskytovat spíše více komentářů, než je požadováno;-/

Běhové prostředí (XAMPP):

  • PHP:5.4.4
  • Mysql:5.5.16

Zdrojový kód:

Kód SQL:

CREATE PROCEDURE `demoSpInOutSqlVars`(IN     pInput_Param  INT, /* PHP Variable will bind to this*/   
                                      /* --- */  
                                      INOUT  pInOut_Param  INT, /* contains name of the SQL User variable that will be read and set by mysql */
                                      OUT    pOut_Param    INT) /* contains name of the SQL User variable that will be set by mysql */
BEGIN
    /*
     * Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
     * These 'SQL user variables names' are the variables that Mysql will use for:
     *    1) finding values
     *    2) storing results
     *
     * It is similar to 'variable variables' in PHP.  
     */
     SET pInOut_Param      := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum  */
     SET pOut_Param        := ABS(pInput_Param) * -3;                /* always negative * 3  */ 
END$$

Kód PHP:

Připojení DB:

$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);    
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Poznámka:Výstup je stejný jako u EMULATE_PREPARES =nepravda.

Nastavte všechny proměnné PHP, které budou použity:

$phpInParam     = 5;                  
$phpInOutParam  = 404;          /* PHP InOut variable  ==> read and should be changed  */
$phpOutParam    = null;         /* PHP Out   variable  ==> should be changed           */

Definujte a připravte volání procedury SQL:

$sql = "call demoSpInOut(:phpInParam, 
                         @varInOutParam, /* mysql variable name will be read and updated */
                         @varOutParam)"; /* mysql variable name that will be written to  */

$stmt = $db->prepare($sql);

Svázání proměnných PHP a nastavení proměnných SQL:

  • 1) svažte proměnné PHP

    $stmt->bindParam(':phpInParam', $phpInParam, PDO::PARAM_INT);

  • 2) Nastavte proměnné SQL User INOUT

    $db->exec("SET @varInOutParam =$phpInOutParam"); // Toto je bezpečné, protože pouze nastavuje hodnotu do proměnné MySql.

Proveďte postup:

$allOk = $stmt->execute();

Získejte proměnné SQL do proměnných PHP:

$sql = "SELECT @varInOutParam AS phpInOutParam,
               @varOutParam   AS phpOutParam
        FROM dual";
$results = current($db->query($sql)->fetchAll());

$phpInOutParam = $results['phpInOutParam'];
$phpOutParam   = $results['phpOutParam'];

Poznámka:možná to není nejlepší způsob;-/

Zobrazte proměnné PHP

"$phpInParam:"     => "5"
"$phpInOutParam:"  => "409"
"$phpOutParam:"    => "-15"


  1. Jak získat zbytek pomocí MOD() v PostgreSQL, MS SQL Server a MySQL

  2. Jak funguje funkce Time() v SQLite

  3. Přehled metod JOIN v PostgreSQL

  4. Migrují všichni do cloudu?