PDO和MySQL存储过程.不退还参数

NaN*_*NaN 5 php mysql pdo stored-procedures prepared-statement

使用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);
Run Code Online (Sandbox Code Playgroud)

编辑: 我只是确信这可能是Windows的一个特定问题,所以我将此示例上传到我的UNIX服务器并得到完全相同的结果,NULL.

Raf*_*ele 1

您似乎错过了 的电话bindParam()。来自PHP 文档示例

<?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");
?>
Run Code Online (Sandbox Code Playgroud)

更新

我错过了 MySQL 部分。MySQL不支持通过其 C API 绑定输出参数。在错误报告中,它说你必须使用 SQL 级别变量:

$stmt = $db->prepare("CALL sp_returns_string(@a)");
$stmt->execute();
print_r($db->query("SELECT @a")->fetchAll());
Run Code Online (Sandbox Code Playgroud)

但这正是你所做的,但行不通。我自己现在正在尝试这个。