用户定义的 MySQL 函数无法通过 PHP 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 库中工作?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
缺少 dbname=mydb?
是的,这是可能的。 在连接时选择数据库而不是在查询中显式指定它有优点和缺点。 如果您仅在服务器上使用单个数据库,那么在连接时这样说并处理可能的访问权限错误往往更容易,但如果您正在以显式方式“mydb.”进行跨数据库工作。 CALC_IT”是必要的。
Missing dbname=mydb?
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.