2009-04-09 74 views
3

我有下面的存储过程来检查用户名的可用性MySQL的存储过程:不能从PHP代码运行

DELIMITER $$; 

DROP PROCEDURE IF EXISTS tv_check_email$$ 

CREATE PROCEDURE tv_check_email (IN username varchar(50)) 
BEGIN 
    select USER_ID from tv_user_master where EMAIL=username; 
END$$ 

DELIMITER ;$$ 

当我运行这个从我的MySQL前端工具,它的作品就好了:

call tv_check_email('[email protected]') 

但试图从PHP页面执行时,我得到这样

"PROCEDURE mydatabase.tv_check_email can't return a result set in the given context" 

我是苏错误重新说我的PHP版本是5.2.6。

回答

3

科迪是不是100%正确。您可以绑定您的结果返回列,并从存储过程中返回选择数据。

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

$stmt = $mysqli->prepare("call tv_check_email(?)"); 
$stmt->bind_param('s', "[email protected]"); 
$stmt->execute(); 

$stmt->bind_result($userid); 

while ($stmt->fetch()) { 
    printf("User ID: %d\n", $userid); 
} 

$stmt->close(); 
$mysqli->close(); 
+1

啊,是的,好多了。从我的理解,标准。 mysql扩展不支持访问OUT的结果集,但是mysqli会(如你的代码所示)?很高兴知道。 – 2009-04-10 05:51:46

3

您需要将结果绑定到OUT参数中。

查看MySQL的文档stored procedures

mysql> delimiter // 

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) 
    -> BEGIN 
    -> SELECT COUNT(*) INTO param1 FROM t; 
    -> END; 
    -> // 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 

mysql> CALL simpleproc(@a); 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @a; 
+------+ 
| @a | 
+------+ 
| 3 | 

+ ------ +

+0

感谢科迪,它的工作 – Shyju 2009-04-09 06:21:35