sql >> データベース >  >> RDS >> Mysql

MySQLはPHPPDOのストアドプロシージャから変数を取得します

    これは長い間続いているバグであることが判明しました...2005年以来!

    元のバグレポートは次のとおりです。2005年から2013年 。そして、ここに新しいバグレポートがあります:2013年から現在まで

    答えを返すにはさまざまなアプローチがありますが、そのうちの1つを見つけて、それを示します...

    「トリック」とは、「mysql」プロシージャから出力を取得することです。これは「2段階」のプロセスです。

    • 最初の部分は、入力を使用してプロシージャを実行し、結果を格納するMYSQL変数を指定することです。

    • 次に、別のクエリを実行して、これらの「mysql」変数を「選択」します。

    ここでは非常に明確に説明されています: php-calling-mysql-stored-procedures

    更新(2017年1月):

    これは、「IN」、「INOUT」、および「OUT」Mysqlプロシージャパラメータの変数の使用を示す例です。

    ここから始める前に、いくつかのヒントを示します。

    • 開発時:プロシージャ呼び出しのエラーを判別する際の信頼性が高いため、「エミュレートモード」でPDOを実行します。
    • PHP変数をプロシージャの「IN」パラメータにのみバインドします。

    変数をINOUTおよびOUTパラメータにバインドしようとすると、非常に奇妙なランタイムエラーが発生します。

    いつものように、私は必要以上に多くのコメントを提供する傾向があります;-/

    ランタイム環境(XAMPP):

    • PHP:5.4.4
    • MySQL:5.5.16

    ソースコード:

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

    PHPコード:

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

    注:出力はEMULATE_PREPARESと同じです。 =false。

    使用するすべてのPHP変数を設定します:

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

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

    PHP変数をバインドしてSQL変数を設定する:

    • 1)PHP変数をバインドする

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

    • 2)SQLユーザーのINOUT変数を設定します

      $ db-> exec( "SET @varInOutParam =$ phpInOutParam"); //値をMySql変数に設定するだけなので、これは安全です。

    手順を実行します:

    $allOk = $stmt->execute();
    

    SQL変数をPHP変数に取得します:

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

    注:おそらく最善の方法ではありません;-/

    PHP変数を表示する

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


    1. 複数のパラメータを持つEXECsp_executesql

    2. グループ内の最後の行をクエリで検索-SQLServer

    3. SQLite LIKE

    4. SQLServerからのINSERTINTOを使用したSalesforceデータの変更