【问题标题】:User defined MySQL function not accessible with PHP PDO connection用户定义的 MySQL 函数无法通过 PHP PDO 连接访问
【发布时间】:2010-10-19 14:39:39
【问题描述】:

我有一个简单的 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 库中工作?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

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

    缺少 dbname=mydb?

    它将是 mydb.CALC_IT

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

    【讨论】:

    • 嗯,好的。如果您通过 PDO 调用它,看起来您需要直接引用该函数,因此它将是 mydb.CALC_IT。请更新您的答案,我会接受!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2010-12-24
    • 2015-12-09
    • 1970-01-01
    • 2018-02-05
    • 2020-08-10
    相关资源
    最近更新 更多