二进制输出参数 - PHP,PDO,MySQL:结果始终为null

时间:2016-03-03 20:34:47

标签: php mysql pdo

我有一个MySQL存储过程,它通过输出参数返回一个UUID。我正在使用PDO从PHP调用此proc - 但我只是为输出参数返回null ...输出数据类型没有明确的二进制选项(PDO :: PARAM _ ???) - 我猜的最接近是LOB。有谁知道怎么做?这是我的PHP代码:

public function CreateTenant($name)
{
    $qry = $this->conn->prepare("call spInsertTenant(:name, :userId, :id)");
    $qry->bindParam(':name', $name);
    $qry->bindParam(':userId', $this->currUser);
    $qry->bindParam(':id', $id, PDO::PARAM_LOB, 16);
    try {
        $qry->execute();
        return $id;
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }
}

编辑:好的 - 原来的过程很长。这是MySQL和PHP的组合,我遇到了同样的问题。注意 - 我的表中没有插入任何内容 - 即使没有抛出任何错误。感谢Mihai先点头宣布$ vars ...试试没有任何运气。也是trincot - 我的UUID肯定是二进制的 - 他们正在使用它:https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

这是存储过程:

CREATE TABLE IF NOT EXISTS `Tenant2` (
  `ID` BINARY(16) NOT NULL,
  `Name` VARCHAR(45) NULL,
  PRIMARY KEY (`ID`));

drop procedure if exists spInsertTenant2;
delimiter $$
CREATE PROCEDURE `spInsertTenant2`(pName nvarchar(45), out oId binary(16))
begin

    set @id = ordered_uuid(uuid());

    insert  Tenant2 (ID, Name)
    values  (@id, pName);

    set oId = @id;

end$$
delimiter ;

call spInsertTenant2('Test', @id);
select * from Tenant2;
select @id, hex(@id);

这里有一些PHP可以解决这个问题:

...
// Create connection
$this->conn = new PDO('mysql:dbname=' . $this->database . ';host=' . $this->servername, $this->username, $this->password);
...

function testParam()
{
    try {
        $name = 'SomeName';
        $id = 0;
        $qry = $this->conn->prepare('call spInsertTenant2(:name :id)');
        $qry->bindParam(':name', $name);
        $qry->bindParam(':id', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT);
        $qry->execute();
        print $id;
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }
}

注意与数据库的连接正在运行 - 我能够执行select语句并获取数据,而不是probs。

1 个答案:

答案 0 :(得分:1)

问题与参数类型无关 - 关于此主题的PDO文档不正确。以下帖子描述了解决方法。 http://forums.mysql.com/read.php?98,167022,222800#msg-222800OUT or INOUT argument 1 for routine xxx is not a variable or NEW pseudo-variable in BEFORE trigger