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 =&gt; 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] =&gt; Array ( [@ret] =&gt; [0] =&gt; ) ) @user1709311 在我这边它工作正常。可以执行this script吗?

以上是关于PDO 和 MySQL 存储过程。不返回参数的主要内容,如果未能解决你的问题,请参考以下文章

mysql返回修改后

PHP PDO:存储过程返回空结果

PDO 存储过程返回值

PHP PDO 无法获取 OUT 参数值

PHP MySQL PDO 存储过程和 INOUT 参数

PDO 不返回任何结果,而 MySQL 命令行返回预期结果