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

发布于 2024-07-17 19:05:00 字数 1187 浏览 1 评论 0原文

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

I've got a trivial MySQL function:

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 ;

And it's called in a query from PHP using a PDO connection:

$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());
}

But, it reports the following:

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

And, if you try it with the legacy Mysql code, it works:

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

The query also works if you try it with any other mysql client.

So why doesn't some user defined MySQL functions work in PHP's PDO library?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放血 2024-07-24 19:05:00

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

缺少 dbname=mydb?

它将是 mydb.CALC_IT

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

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

Missing dbname=mydb?

it will be mydb.CALC_IT

Yep, that's a possibility. There are advantages and disadvantages to selecting a database at connect-time rather than explicitly specifying it in the query. If you're only using a single database on the server it tends to be easier to say so at connect-time and handle the possible access-rights errors then, but if you're doing cross-db work the explicit way “mydb.CALC_IT” will be necessary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文