MySQL存储过程:无法从PHP代码运行

时间:2009-04-09 05:18:29

标签: php mysql stored-procedures

我有以下存储过程来检查用户名可用性

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('shyju@techies.com')

但是当尝试从PHP页面执行时,我收到类似

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

我确信我的PHP版本是5.2.6。

3 个答案:

答案 0 :(得分:3)

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

查看stored procedures

上的mysql文档
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    |

+ ------ +

答案 1 :(得分:3)

看起来如果使用mysqli PHP库,您实际上可以检索结果集,而无需使用OUT变量和另一个查询来检索您的值。本文介绍了详细信息:

http://amountaintop.com/php-5-and-mysql-5-stored-procedures-error-and-solution-qcodo

答案 2 :(得分:3)

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

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

$stmt = $mysqli->prepare("call tv_check_email(?)");
$stmt->bind_param('s', "shyju@techies.com");
$stmt->execute();

$stmt->bind_result($userid);

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

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