PDO存储过程不返回任何值或未改变的值


PHP, PDO Stored Procedure return nothing or unchanged value

我正在使用PHP与mysql。

我的存储过程通过Toad4MySQL通过out参数返回值,但是当涉及到php Pdo时,它不捕获返回值。

这是我的代码

$validusername= 'x';
$validemail = 'x'; 
$validkey   = 'x';
$query = $pdo->prepare("Call InsertNewUser(:fullname, :usernamex, :email, :password, :con_password, @:validusername, @:validemail, @:validkey); ");
$query->bindParam(':fullname', $fullname , PDO::PARAM_STR);
$query->bindParam(':usernamex', $usernamex , PDO::PARAM_STR);
$query->bindParam(':email', $email, PDO::PARAM_STR);
$query->bindParam(':password', $password, PDO::PARAM_STR);
$query->bindParam(':con_password', $con_password, PDO::PARAM_STR);
$query->bindParam(':validusername', $validusername, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$query->bindParam(':validemail', $validemail , PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$query->bindParam(':validkey', $validkey   , PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$results = $query->  execute();
echo $validemail ; # returns x but not the value that i wanted. 

谁能帮我解这个谜题?

My Stored Procedure code:

DROP PROCEDURE IF EXISTS InsertNewUser;
CREATE PROCEDURE xxx.`InsertNewUser`(
 fullname varchar(255),
 username varchar(255),
 email_address varchar(255), 
 password varchar(255),
 con_password varchar(255),
 out validusername varchar(10),
 out validemail varchar(10),
 out validkey varchar(155)
)
BEGIN
  declare xcnt_1 int;
  declare xcnt_2 int;
    declare xkey varchar(155);
  set xkey = MD5(RAND());
  select count(*) into xcnt_1 from user where user.email_address = email_address;
  select count(*) into xcnt_2 from user where user.username = username;
    if xcnt_1 > 0  then
      set validemail = 'false';
    else 
      set validemail = 'true';
    end if;
     if xcnt_2 > 0  then
      set validusername = 'false';
    else 
      set validusername = 'true';
    end if;
    if xcnt_1 = 0 and xcnt_2 = 0 then
      set validkey = xkey;
      INSERT INTO user
      (user.fullname, user.username, user.email_address, user.password, user.con_password, user.md5validate) 
      VALUES
      (fullname, username, email_address, password, con_password, xkey);
    else
       set validkey = 'false';
    end if;
    commit;
END;

啊……最后解决了这个问题:

由于某些未知的原因,我不得不将调用语句更改为:

Call InsertNewUser(:fullname, :usernamex, :email, :password, :con_password, @validusername_global, @validemail_global, @validkey_global); 

并使用这行代码来获取数据…

$SQL = ' select @validusername_global as validusername, @validemail_global as validemail, @validkey_global as validkey';
$query = $pdo->query($SQL);
while($row = $query->fetch(PDO::FETCH_ASSOC))
{
    print_r($row);
}

执行PDO预处理语句不会对$validemail产生任何影响。

$results = $query->execute();之后,尝试添加print_r($query->fetchAll());以更好地了解当PHP语句运行MySQL存储过程时从MySQL返回到PHP的内容。

请记住,$results只是一个布尔值,表示是否可以执行该语句。

来自PDO手册:

int $length

数据类型的长度。表示参数为OUT参数从存储过程中获取必须显式设置长度。

http://php.net/manual/en/pdostatement.bindparam.php

您省略了这个参数,这可以解释为什么它没有被用作OUT参数。

如果您设置$validemail=x并且在以后的代码中不使用$validemail操作/更改任何内容,那么显然回显$validemail将返回x。这有什么不对吗?或者你没有粘贴一些代码

尝试包装您的prepare语句,绑定参数并在Try, catch块中执行,并查看PDO是否吐出任何类型的错误。