我正在使用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.
任何人都可以帮我解决这个难题吗?
我的存储过程代码:
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);
}
答案 0 :(得分:1)
执行PDO预处理语句不会对$validemail
产生任何影响。
在$results = $query->execute();
之后,尝试添加print_r($query->fetchAll());
以更好地了解当PHP语句运行MySQL存储过程时从MySQL返回到PHP的内容。
请记住,$results
只是一个布尔值,表示该语句是否可以执行。
答案 1 :(得分:1)
来自PDO手册:
int $ length
数据类型的长度。 指示参数是OUT 您存储过程中的参数 必须明确设定长度。
http://php.net/manual/en/pdostatement.bindparam.php
您已省略此参数,这可以解释为何不将其用作OUT参数。
答案 2 :(得分:0)
如果您在以后的代码中设置$validemail=x
并且不使用$validemail
操纵/更改任何内容,那么obvioulsy echo $validemail
将返回x
。什么错了?或者你错过了粘贴一些代码
答案 3 :(得分:0)
尝试包装你的prepare语句,绑定参数并在try,catch块中执行,看看PDO是否吐出任何类型的错误。