用户定义的MySQL函数无法通过PHP PDO连接访问

时间:2009-04-15 14:15:32

标签: php mysql pdo

我有一个简单的MySQL功能:

DELIMITER $$
DROP FUNCTION IF EXISTS `mydb`.`CALC` $$
CREATE FUNCTION `mydb`.`CALC_IT`(Flag VARCHAR(1), One FLOAT, Other FLOAT) 
RETURNS FLOAT
BEGIN
    IF One IS NULL THEN RETURN 0; END IF;
    IF Other IS NULL THEN RETURN 0; END IF;
    IF Flag = 'Y' THEN
        RETURN Other - One;
    ELSE
        RETURN Other
    END IF;
END $$
DELIMITER ;

在使用PDO连接的PHP查询中调用它:

$query = 'SELECT CALC_IT(`Flag`, `One`, `Two`) FROM `mydb`.`table` WHERE `Condition` = 1';
$db = new PDO('mysql:host=localhost', 'user', 'pass');
$stmt = $db->prepare($query);
if (!$stmt->execute()) {
    var_dump($stmt->errorInfo());
}

但是,它报告了以下内容:

array
  0 => string '42000' (length=5)
  1 => int 1305
  2 => string 'FUNCTION CALC_IT does not exist' (length=37)

而且,如果你使用传统的Mysql代码尝试它,它可以工作:

$db = mysql_connect('localhost', 'user', 'pass');
$result = mysql_query($query);
if (mysql_error()) {
    var_dump(mysql_error());
}

如果您尝试使用任何其他mysql客户端,该查询也可以。

所以为什么某些用户定义的MySQL函数不能在PHP的PDO库中运行?

1 个答案:

答案 0 :(得分:1)

  

新PDO('mysql:host = localhost','user','pass');

缺少dbname = mydb?

  

它将是mydb.CALC_IT

是的,这是可能的。在连接时选择数据库而不是在查询中明确指定数据库有优点和缺点。如果您只在服务器上使用单个数据库,那么在连接时更容易说出来并处理可能的访问权限错误,但是如果您正在以明确的方式进行跨数据库工作“mydb。 CALC_IT“将是必要的。