MySQL函数声明。不适用于PHP。从phpmyadmin运行正常。不创造功能

时间:2011-09-25 22:22:16

标签: php mysql

我的功能是千米距离:

DELIMITER //                                                                                      
    DROP FUNCTION IF EXISTS distance_miles//                                                      
    CREATE FUNCTION distance_miles(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT)                
    RETURNS FLOAT(120)                                                                            
    BEGIN                                                                                         
        DECLARE pi, q1, q2, q3 FLOAT;                                                             
        DECLARE rads FLOAT DEFAULT 0;                                                             
        SET pi = PI();                                                                            
        SET lat1 = lat1 * pi / 180;                                                               
        SET lon1 = lon1 * pi / 180;                                                               
        SET lat2 = lat2 * pi / 180;                                                               
        SET lon2 = lon2 * pi / 180;                                                               
        SET q1 = COS(lon1-lon2);                                                                  
        SET q2 = COS(lat1-lat2);                                                                  
        SET q3 = COS(lat1+lat2);                                                                  
        SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );                                       
        RETURN 6378.388 * rads * 0.621371192;                                                     
    END//                                                                                         
DELIMITER ;                                                                                       

我从phpmyadmin运行1个查询。它运行正常。但我在information_schema的例程表中没有看到这一点。

另外,当我尝试从php运行时,我收到了一个错误

 $mdb->query($mdb->mes("
     DELIMITER //                                                                                      
         DROP FUNCTION IF EXISTS distance_miles//                                                      
         CREATE FUNCTION distance_miles(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT)                
         RETURNS FLOAT(120)                                                                            
         BEGIN                                                                                         
             DECLARE pi, q1, q2, q3 FLOAT;                                                             
             DECLARE rads FLOAT DEFAULT 0;                                                             
             SET pi = PI();                                                                            
             SET lat1 = lat1 * pi / 180;                                                               
             SET lon1 = lon1 * pi / 180;                                                               
             SET lat2 = lat2 * pi / 180;                                                               
             SET lon2 = lon2 * pi / 180;                                                               
             SET q1 = COS(lon1-lon2);                                                                  
             SET q2 = COS(lat1-lat2);                                                                  
             SET q3 = COS(lat1+lat2);                                                                  
             SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );                                       
             RETURN 6378.388 * rads * 0.621371192;                                                     
         END//                                                                                         
     DELIMITER ;                                                                                       

 "));                                                                                      

这一个:

错误:1064
已调用:[资源ID#8] ***您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第1行'\ r \ nDELIMITER ~~'附近使用正确的语法
在db查询中:[\ r \ nDELIMITER ~~

请帮助我,会发生什么?完全不明白这一点。

  1. 如何查看功能是否存在?
  2. 它会出现在information_shema表ROUTINES?
  3. 为什么php运行此查询有问题?
  4. ====

    选择ROUTINE_TYPE,ROUTINE_NAME     FROM INFORMATION_SCHEMA.ROUTINES

    另外 - 不要显示这个功能......奇怪这一切...


    另外这个: SHOW CREATE FUNCTION distance_miles

    回答: MySQL说:文档

    1305 - FUNCTION distance_miles不存在

    ...

2 个答案:

答案 0 :(得分:1)

mysql_query不支持多查询。请参阅manual

您只需删除DELIMITER行,自行拆分查询,CREATE FUNCTION就可以了。

 $mdb->query($mdb->mes("DROP FUNCTION IF EXISTS distance_miles"));
 $mdb->query($mdb->mes("CREATE FUNCTION distance_miles(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT)                
         RETURNS FLOAT(120)                                                                            
         BEGIN                                                                                         
             DECLARE pi, q1, q2, q3 FLOAT;                                                             
             DECLARE rads FLOAT DEFAULT 0;                                                             
             SET pi = PI();                                                                            
             SET lat1 = lat1 * pi / 180;                                                               
             SET lon1 = lon1 * pi / 180;                                                               
             SET lat2 = lat2 * pi / 180;                                                               
             SET lon2 = lon2 * pi / 180;                                                               
             SET q1 = COS(lon1-lon2);                                                                  
             SET q2 = COS(lat1-lat2);                                                                  
             SET q3 = COS(lat1+lat2);                                                                  
             SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );                                       
             RETURN 6378.388 * rads * 0.621371192;                                                     
         END                                                                        
 "));     

答案 1 :(得分:0)

$mdb->query($mdb->mes("DROP FUNCTION IF EXISTS distance_miles"));
 $mdb->query($mdb->mes("delimiter $ 
CREATE FUNCTION distance_miles(lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT)                
         RETURNS FLOAT(120)                                                                            
        DETERMINISTIC BEGIN                                                                                         
             DECLARE pi, q1, q2, q3 FLOAT;                                                             
             DECLARE rads FLOAT DEFAULT 0;                                                             
             SET pi = PI();                                                                            
             SET lat1 = lat1 * pi / 180;                                                               
             SET lon1 = lon1 * pi / 180;                                                               
             SET lat2 = lat2 * pi / 180;                                                               
             SET lon2 = lon2 * pi / 180;                                                               
             SET q1 = COS(lon1-lon2);                                                                  
             SET q2 = COS(lat1-lat2);                                                                  
             SET q3 = COS(lat1+lat2);                                                                  
             SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );                                       
             RETURN 6378.388 * rads * 0.621371192;                                                     
         END $                                                                      
 "));