Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制输出参数-PHP、PDO、MySQL:结果总是空的_Php_Mysql_Pdo - Fatal编程技术网

二进制输出参数-PHP、PDO、MySQL:结果总是空的

二进制输出参数-PHP、PDO、MySQL:结果总是空的,php,mysql,pdo,Php,Mysql,Pdo,我有一个MySQL存储过程,它通过输出参数返回UUID。我使用PDO从PHP调用这个过程-但是我只是得到了输出参数的null。。。输出数据类型没有显式的二进制选项(PDO::PARAM_254;?)-我猜最接近的是LOB。有人知道怎么做吗?以下是我的PHP代码: public function CreateTenant($name) { $qry = $this->conn->prepare("call spInsertTenant(:name, :userId, :id)"

我有一个MySQL存储过程,它通过输出参数返回UUID。我使用PDO从PHP调用这个过程-但是我只是得到了输出参数的null。。。输出数据类型没有显式的二进制选项(PDO::PARAM_254;?)-我猜最接近的是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绝对是二进制的-他们使用的是:

以下是存储过程:

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语句并毫无问题地获取数据。

问题与参数类型无关-关于此主题的PDO文档不正确。以下文章介绍了解决方法。 和
.

':name'
删除引号。检查此处的错误可能会触发该错误。可能重复感谢Fred-删除这些引号会有所帮助,但是-我仍然无法从proc中的输出参数中获取值。根据你的建议,我添加了try/catch——代码没有抛出任何异常……正如fred ii所说,将值绑定到prepare自动转义值。虽然MySQL慷慨地接受带引号的整数,但其他人不接受,除非定义了
PDO::TYPE
Yep-我得到了带引号的东西。。。这是我一直坚持的二进制输出参数。