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"