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

3

我有一个MySQL存储过程,通过输出参数返回UUID。 我正在使用PDO从PHP调用此存储过程,但是对于输出参数,我只能得到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语句并轻松地获取数据返回。


1
:name 去掉引号。在此处检查错误 http://php.net/manual/en/pdo.error-handling.php 可以触发该错误。 - Funk Forty Niner
1
可能是重复的问题:何时使用单引号、双引号和反引号? - Funk Forty Niner
谢谢Fred - 去掉那些引号确实有帮助,但是 - 我仍然无法从存储过程的输出参数中获取值。根据您的建议,我已经添加了try / catch - 代码没有抛出任何异常... - Matt Wales
正如Fred II所说,将值绑定到准备自动转义这些值。虽然MySQL慷慨地接受带引号的整数,但其他数据库不会除非定义了“PDO :: TYPE”。 - Xorifelse
是的 - 我明白引号的问题... 但我卡在二进制输出参数上了。 - Matt Wales
显示剩余7条评论
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接