Определяемая пользователем функция MySQL недоступна при подключении к PHP PDO - PullRequest
0 голосов
/ 15 апреля 2009

У меня есть тривиальная функция 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 ;

И он вызывается в запросе из PHP с использованием соединения PDO:

$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 не работают в библиотеке PDO PHP?

1 Ответ

1 голос
/ 15 апреля 2009

новый PDO ('mysql: host = localhost', 'user', 'pass');

Отсутствует dbname = mydb?

это будет mydb.CALC_IT

Да, это возможно. Существуют преимущества и недостатки при выборе базы данных во время соединения, а не в явном указании ее в запросе. Если вы используете только одну базу данных на сервере, то, как правило, проще сказать об этом во время соединения и обработать возможные ошибки прав доступа, но если вы выполняете кросс-db, то работайте явно «mydb. CALC_IT »будет необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...