Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL PHP पीडीओ में संग्रहित प्रक्रिया से चर को पुनः प्राप्त करता है

यह पता चला है कि यह एक बग है जो लंबे समय से चल रहा है... 2005 से!

मूल बग रिपोर्ट यहां दी गई है:2005 से 2013 . और यह रही नई बग रिपोर्ट:2013 से वर्तमान तक

उत्तर वापस पाने के कई तरीके हैं, मैंने उनमें से एक को ढूंढा और उसे प्रदर्शित किया...

'चाल' यह है कि 'mysql' प्रक्रिया से आउटपुट प्राप्त करना। यह एक 'दो चरण' की प्रक्रिया है।

  • पहला भाग आपके इनपुट के साथ प्रक्रिया को चलाना है, और यह भी बताना है कि परिणाम को स्टोर करने के लिए MYSQL वेरिएबल क्या हैं।

  • फिर, आप उन 'mysql' चरों को 'चयन' करने के लिए एक अलग क्वेरी चलाते हैं।

इसका यहाँ स्पष्ट रूप से वर्णन किया गया है:

अपडेट (जनवरी 2017):

यहां एक उदाहरण दिया गया है जो 'IN', 'INOUT' और 'OUT' Mysql प्रक्रिया मापदंडों के लिए चरों के उपयोग को दर्शाता है।

शुरू करने से पहले यहां कुछ सुझाव दिए गए हैं:

  • विकसित करते समय:पीडीओ को 'एमुलेट्स मोड' में चलाएं क्योंकि यह प्रक्रिया कॉल में त्रुटियों को निर्धारित करने में अधिक विश्वसनीय है।
  • केवल PHP वेरिएबल को 'IN' पैरामीटर प्रक्रिया से बाइंड करें।

जब आप INOUT और OUT मापदंडों के लिए चर को बाध्य करने का प्रयास करते हैं, तो आपको वास्तव में कुछ अजीब रनटाइम त्रुटियां मिलेंगी।

हमेशा की तरह मैं आवश्यकता से अधिक टिप्पणियाँ प्रदान करता हूँ;-/

रनटाइम पर्यावरण (XAMPP):

  • PHP:5.4.4
  • मैसकल:5.5.16

स्रोत कोड:

एसक्यूएल कोड:

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 = 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 . के साथ समान है =झूठा।

उपयोग किए जाने वाले सभी 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) पीएचपी वैरिएबल को बाइंड करें

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

  • 2) SQL उपयोगकर्ता INOUT चर सेट करें

    $db->exec ("सेट @varInOutParam =$phpInOutParam"); // यह सुरक्षित है क्योंकि यह सिर्फ MySql वेरिएबल में मान सेट करता है।

प्रक्रिया निष्पादित करें:

$allOk = $stmt->execute();

एसक्यूएल वेरिएबल को 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL पैरामीटरयुक्त प्रश्न

  2. MySQL में पिछले 3 महीने का बिक्री डेटा कैसे प्राप्त करें

  3. बैकअप से एक MySQL या MariaDB गैलेरा क्लस्टर की पूर्ण पुनर्स्थापना

  4. MySQL क्वेरी मॉनिटरिंग बैश स्क्रिप्ट बनाएं

  5. तालिका 'केवल पढ़ने के लिए' है