यह पता चला है कि यह एक बग है जो लंबे समय से चल रहा है... 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"