PDO 和 MySQL 存储过程。不返回参数
Posted
技术标签:
【中文标题】PDO 和 MySQL 存储过程。不返回参数【英文标题】:PDO and MySQL stored procedure. Not returning out param 【发布时间】:2012-12-17 02:32:37 【问题描述】:当使用 PDO 时,我应该能够选择参数并回显它。然而,我得到的只是 NULL。当我使用 Workbench 时,我可以看到它。
谁能告诉我为什么会这样?
CREATE PROCEDURE testing(OUT ret int)
BEGIN SET ret=12; END;
// On workbench returns '12' - Correct
call testing(@ret);
select @ret;
// php/PDO returns NULL
$stmt=Db()->prepare("CALL testing(@ret)");
$stmt->execute();
$param = Db()->query("SELECT @ret")->fetch(PDO::FETCH_ASSOC);
var_dump($param);
编辑: 我几乎确信这可能是 Windows 的一个特定问题,所以我将此示例上传到我的 UNIX 服务器并得到完全相同的结果,NULL。
【问题讨论】:
你如何检查错误,看看他们怎么说php.net/manual/en/pdo.error-handling.php Pablo,是的,我已经检查了错误,mysql 或 PDO 没有报告任何错误。 【参考方案1】:我在这里看到了一个错误http://bugs.mysql.com/bug.php?id=11638。
试试这个
insert "SELECT @someOutParameter" in your stored procedure and then use:
<?php
$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)");
$stmt ->execute(array($someInParameter1, $someInParameter2));
?>
【讨论】:
嘿里松。感谢您的链接。实际上,我刚刚发现自己并正在经历它。我会试试你的例子,让你知道,但你知道真正奇怪的事情吗?我还有其他使用这些程序的应用程序,它们都还在工作。我不知道为什么这对我不起作用;我没有升级 MySQL 或 PHP。 Rizon,这是输出:check the manual that corresponds to your MySQL server version for the right syntax to use near 'CAST testing('1')' at line 1'
只是出于好奇,您是否能够让其中任何一个工作?
不只是找到可能有用的东西,你用过CALL吗,我最近编辑了它。
嘿 Rizon,事实证明,第二个可以带回我的返回值的查询被一个新的 PDO 实例清除了。我刚刚在我的连接字符串中添加了PDO::ATTR_PERSISTENT => true
,它运行良好。再次感谢我的朋友一直支持我!【参考方案2】:
试试这个
$stmt=Dbh->prepare("CALL testing(@ret)");
$stmt->execute();
$param = $stmt->fetchAll();
var_dump($param);
【讨论】:
Rizon,我刚刚运行了它,我得到的是:array(0)
【参考方案3】:
您似乎错过了对bindParam()
的呼叫。来自the PHP doc examples:
<?php
/* Call a stored procedure with an INOUT parameter */
$colour = 'red';
$sth = $dbh->prepare('CALL puree_fruit(?)');
$sth->bindParam(1, $colour, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
$sth->execute();
print("After pureeing fruit, the colour is: $colour");
?>
更新
我错过了 MySQL 部分。 MySQL doesn't support 通过其 C API 绑定输出参数。在错误报告中说您必须使用 SQL 级别的变量:
$stmt = $db->prepare("CALL sp_returns_string(@a)");
$stmt->execute();
print_r($db->query("SELECT @a")->fetchAll());
但这正是你所做的,它不起作用。我现在正在自己尝试。
【讨论】:
MySQL 不支持通过其 C API 绑定输出参数。您必须使用 SQL 级别的变量: 谢谢拉斐尔,但没有骰子。我也去过那里,但仍然返回 NULL。不过还是谢谢你的回答。 Raffaele,我知道你从哪里得到这个例子,就在 PHPs 网站上。我尝试了相同的确切示例,但无法返回任何东西。我很好奇你有没有运气。请告诉我。 Raffaele,我刚刚运行了您的更新示例,结果如下:Array ( [0] => Array ( [@ret] => [0] => ) )
@user1709311 在我这边它工作正常。可以执行this script吗?以上是关于PDO 和 MySQL 存储过程。不返回参数的主要内容,如果未能解决你的问题,请参考以下文章