在PHP中编写MySql函数

在PHP中编写MySql函数,php,mysql,function,syntax,Php,Mysql,Function,Syntax,我的php脚本中有以下函数: $fcnsql = "CREATE FUNCTION CUST_ORDER(index INT, weekday INT, curweekday INT, endtime TIME, curtime TIME) RETURNS INT BEGIN DECLARE custom_weekday INT; IF (weekday=curweekday AND curtime>endtime) THEN SET custom_weekday = index+7

我的php脚本中有以下函数:

$fcnsql = "CREATE FUNCTION CUST_ORDER(index INT, weekday INT, curweekday INT, endtime TIME, curtime    TIME)
RETURNS INT
BEGIN
DECLARE custom_weekday INT;
IF (weekday=curweekday AND curtime>endtime) THEN
SET custom_weekday = index+7;
ELSE
SET custom_weekday = index;
END IF;
RETURN custom_weekday;
END";

$test=mysql_query($fcnsql) or die (mysql_error());
我得到的输出是,我有一个SQL语法错误。你知道怎么了吗

我认为有些事情可能是问题所在:

  • 我不确定在函数中使用时间变量作为参数的语法是否正确
  • 我在一些在线示例代码中看到,在使用mysql函数之前,有一行“delimiter$$”——我不确定这是做什么用的,以及如何/是否需要使用它

  • 我对这一点还不熟悉,所以任何帮助都将不胜感激

    编辑:@Pang称之为索引-索引是一个保留字。如果不想更改名称,请使用反勾号将其括起来:

    `index`
    
    我会把剩下的华夫饼干放在适当的位置,因为您不确定分隔符。:)

    --

    错误可能是您没有设置分隔符,正如您在一些示例中注意到的那样。将以下内容添加到函数的顶部和底部:

    $fcnsql = "
    DELIMITER #
    CREATE FUNCTION CUST_ORDER2(`index` INT, weekday INT, curweekday INT, endtime TIME, curtime TIME) RETURNS INT
    BEGIN
    DECLARE custom_weekday INT;
    IF (weekday=curweekday AND curtime>endtime) THEN
        SET custom_weekday = `index`+7;
    ELSE
        SET custom_weekday = `index`;
    END IF;
    RETURN custom_weekday;
    END;
    #
    DELIMITER ;
    ";    
    

    原因是“;”是MySQLs的默认分隔符(即告诉MySQL它已到达语句末尾的内容)。您的函数的语句需要分隔符,但当MySQL保存它时,您不希望MySQL认为它已找到语句的结尾并停止处理函数。因此,将分隔符更改为函数中不使用的字符,然后再将其更改回来。

    为什么要使用PHP创建MySQL函数?为什么不在控制台中创建MySQL函数,然后使用PHP代码调用该函数呢?会出现什么错误?我该怎么做?正如我所说,我对这一点很陌生。我认为这不会修复语法错误,是吗?我已经尽了最大努力查找在线资源,但经过多次故障排除后,我仍然无法使其正常工作“您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解要使用的正确语法,例如“index INT,weekday INT,curweekday INT,endtime TIME,curtime TIME TIME”)在“at line 1”中返回的“index是一个关键字(请参阅)。您不能将其用作参数名称。感谢您迄今为止的帮助。我似乎仍然收到类似的语法错误:您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以了解使用“DELIMITER”CREATE FUNCTION CUST_ORDER的正确语法(ind INT,weekday INT,curweekday INT,e'在第1EDIT行:我首先尝试在一个单独的mysql查询中设置分隔符#,这似乎解决了我以前的问题(因为mysql一次只能执行一个查询)。但是,我现在得到了这个错误:“mysql.proc的列计数错误。预期为20,发现为16。表可能已损坏。”“你知道如何解决这个问题吗?谢谢你最近升级了mysql?我没有直接经历过这个错误,但是google机器暗示mysql升级不好/不完整是导致这个错误的常见原因