[英]MySQL function declaration. Not works from PHP. Run's ok from phpmyadmin. Not creates function
I have function to cal miles distance: 我具有校准英里距离的功能:
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 ;
I run this as 1 query from phpmyadmin. 我从phpmyadmin作为1查询运行。 It run's Ok.
没关系 But i dont see this in routines table in information_schema.
但是我在information_schema的例程表中看不到这一点。
Also, when am trying run this from php i got an error 另外,当我尝试从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 ;
"));
this one: 这个:
error:1064
错误:1064
CALLED:[Resource id #8]***You have an error in your SQL syntax;
CALLED:[资源ID#8] ***您的SQL语法有误;
check the manual that corresponds to your MySQL server version for the right syntax to use near '\\r\\nDELIMITER ~~ ' at line 1
在第1行的'\\ r \\ nDELIMITER ~~'附近检查与您的MySQL服务器版本相对应的手册以使用正确的语法
in db query: [\\r\\nDELIMITER ~~ 在数据库查询中:[\\ r \\ nDELIMITER ~~
Pls help me, what happens? 请帮助我,会发生什么? Completely dont understood this.
完全不明白这一点。
==== ====
SELECT ROUTINE_TYPE, ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES 从INFORMATION_SCHEMA中选择ROUTINE_TYPE,ROUTINE_NAME。ROUTINES
Also - dont show this function ... strange this all... 另外-不要显示此功能...这很奇怪...
Also this: SHOW CREATE FUNCTION distance_miles 此外,此:SHOW CREATE FUNCTION distance_miles
Answers: MySQL said: Documentation 答案:MySQL说:文档
... ...
mysql_query
doesn't support multiqueries. mysql_query
不支持多查询。 See manual . 参见手册 。
You just need to remove the DELIMITER
lines, split the queries by yourself, and the CREATE FUNCTION
should work. 您只需要删除
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
"));
$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 $
"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.