2009-04-15 13 views
0

ich eine triviale MySQL-Funktion habe:Benutzerdefinierte MySQL-Funktion nicht zugänglich mit PHP PDO Verbindung

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 ; 

Und es ist in einer Abfrage von PHP mit einer PDO-Verbindung genannt:

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

Aber es gibt die folgende:

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

Und, wenn Sie es mit dem Erbe Mysql Code versuchen, es funktioniert:

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

Die Abfrage funktioniert auch, wenn Sie es mit einem anderen mysql-Client versuchen.

Also warum nicht einige benutzerdefinierte MySQL-Funktionen arbeiten in PHP-PDO-Bibliothek?

Antwort

1

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

fehlt dbname = meindb?

wird es

Yep mydb.CALC_IT werden, das ist eine Möglichkeit. Es gibt Vor- und Nachteile, wenn Sie eine Datenbank zur Verbindungszeit auswählen und nicht explizit in der Abfrage angeben. Wenn Sie nur eine einzige Datenbank auf dem Server verwenden, ist es bei der Verbindungsherstellung einfacher, dies zu sagen und die möglichen Zugriffsrechte zu behandeln, aber wenn Sie cross-db verwenden, wird der explizite Weg "mydb. CALC_IT "wird benötigt.

+0

Mmmm, ok. Sieht so aus, als müssten Sie direkt auf die Funktion verweisen, wenn Sie sie über PDO aufrufen, also wird es mydb.CALC_IT. Bitte aktualisieren Sie Ihre Antwort, und ich werde es akzeptieren! – Jrgns