PHP,PDO 存储过程不返回任何值或未更改值
Posted
技术标签:
【中文标题】PHP,PDO 存储过程不返回任何值或未更改值【英文标题】:PHP, PDO Stored Procedure return nothing or unchanged value 【发布时间】:2011-10-02 00:52:55 【问题描述】:我的存储过程通过 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);
【问题讨论】:
【参考方案1】:执行 PDO 准备好的语句不会对 $validemail
产生任何影响。
在$results = $query->execute();
之后,尝试添加print_r($query->fetchAll());
以更好地了解当您的 PHP 语句运行 MySQL 存储过程时从 MySQL 返回到 PHP 的内容。
请记住,$results
只是一个布尔值,指示该语句是否可以执行。
【讨论】:
@Schwartzie,如果它是输入/输出参数,它应该对它产生影响。 查看本页上的示例 #10:php.net/manual/en/pdo.prepared-statements.php 再想一想,它并没有那么有启发性。迈克的答案更合适。 好吧,这些想法都不起作用..无论我尝试什么,我仍然无法让它起作用:( Out 应该起作用,但事实并非如此..【参考方案2】:来自 PDO 手册:
int $长度
数据类型的长度。 指示参数是 OUT 来自存储过程的参数,您 必须明确设置长度。
http://php.net/manual/en/pdostatement.bindparam.php
你已经省略了这个参数,这可以解释为什么它没有被用作 OUT 参数。
【讨论】:
试过 b4,它仍然没有在我的 php 中返回任何值,但它在 Toad 上返回。 嗯,它仍然是必要的,所以你应该把它放在那里以防万一。 @Schwartzie 和@diEcho,无论如何,感谢您的反馈。我终于让它工作了..但我仍然不明白为什么必须添加“_global”才能使其工作..【参考方案3】:如果您设置$validemail=x
并且在以后的代码中不使用$validemail
操作/更改任何内容,那么明显的回显$validemail
将返回x
。?这有什么问题?要么你错过了粘贴一些代码
【讨论】:
我有 $validemail=x 来检测值的变化,但由于一些不确定的原因,它没有改变。我的 storedP 从 Toad4MySQL 返回真或假字符串,但在我的 php 中,它对有界变量没有任何作用。 echo $validemail 应该返回 true / false 但不是 x。 但是您在问题中显示的代码没有使用$validemail
的特定代码,除了插入数据库
这是我的 sp 的标题: CREATE PROCEDURE InsertNewUser
( fullname varchar(255), username varchar(255), email_address varchar(255), password varchar(255), con_password varchar(255) ), 输出有效用户名 varchar(10), 输出有效电子邮件 varchar(10), 输出有效密钥 varchar(155))
@Melvin storedP
是什么意思@是错字吗?对不起,我不熟悉Toad4MySQL
它是做什么的?请写出理想的输出??
我正在使用这个软件:quest.com/toad-for-mysql 来管理我的 mysql 代码和查询。【参考方案4】:
尝试包装您的准备语句,绑定参数并在 try 中执行,捕获块并查看 PDO 是否吐出任何类型的错误。
【讨论】:
以上是关于PHP,PDO 存储过程不返回任何值或未更改值的主要内容,如果未能解决你的问题,请参考以下文章
php pdo调用SQLServer存储过程无法获取返回结果