原来这是一个长期存在的错误...自2005年以来就一直存在!
以下是原始错误报告:
从2005到2013年。 这是新的错误报告:
从2013年到现在。
有多种方法可以返回答案,我找到了其中一种并进行演示...
“诀窍”是从'mysql'过程中获取输出。这是一个“两阶段”过程。
第一部分是使用您的输入运行该过程,并告诉它要将结果存储在哪些MYSQL变量中。
然后,您运行一个单独的查询来“选择”那些'mysql'变量。
在此处已经很清楚地描述:
php-calling-mysql-stored-procedures
更新(2017年1月):
这是一个示例,展示了如何使用变量作为'Mysql'过程参数的'IN'、'INOUT'和'OUT'。
在开始之前,这里有一些提示:
- 在开发时:将PDO运行在“模拟模式”下,因为它更可靠地确定过程调用中的错误。
- 只将PHP变量绑定到过程的'IN'参数。
当您尝试将变量绑定到'INOUT'和'OUT'参数时,您会得到一些非常奇怪的运行时错误。
像往常一样,我倾向于提供比所需注释更多的注释;-/
运行环境(XAMPP):
源代码:
SQL代码:
CREATE PROCEDURE `demoSpInOutSqlVars`(IN pInput_Param INT,
INOUT pInOut_Param INT,
OUT pOut_Param INT)
BEGIN
SET pInOut_Param := ABS(pInput_Param) + ABS(pInOut_Param);
SET pOut_Param := ABS(pInput_Param) * -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
= 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"
bindParam
看起来正在尝试工作,因为现在我不再收到$returnid not set
错误... 但它仍然没有输出任何内容。 - Just Lucky Really