使用PHP的UDF MySQL查询

时间:2014-05-17 02:52:00

标签: php mysql mysqli user-defined-functions

我从MySQL doc

中读取
  

要使UDF机制起作用,必须用C或C ++编写函数   并且您的操作系统必须支持动态加载。

     

...

     

UDF包含成为正在运行的服务器的一部分的代码,因此   你编写一个UDF,你受到任何和所有适用的约束的约束   编写服务器代码

我想动态创建一个MySQL函数(通过使用PHP mysqli提交它),以便我可以在后续查询中使用它。

  1. 我是否无法在基本的网络托管服务器上安装MySQL(例如HostGator,1and1,GoDaddy),因为我不是root管理员用户?
  2. 我在下面的查询中的语法有什么问题?它在直接MySQL shell(黑匣子)或我的PHP脚本中都不起作用。返回的错误是:
  3.   

    警告:mysqli :: query()[mysqli.query] :( 42000/1064):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在'delimiter //创建函数附近使用正确的语法IF NOT EXISTS LeaveNumber(str varchar(50))return'在C:\ wamp \ www_quac \ includes \ database中的第1行第55行的.php

    这是我在php中的查询:

    if ($Database->query("
    delimiter //
    
    create function IF NOT EXISTS LeaveNumber(str varchar(50)) returns varchar(50)
    no sql
    begin
    declare verification varchar(50);
    declare result varchar(50) default '';
    declare character varchar(2);
    declare i integer default 1;
    
    if char_length(str) > 0 then
        while(i <= char_length(str)) do
            set character = substring(str,i,1);
            set verification = find_in_set(character,'1,2,3,4,5,6,7,8,9,0');
    
            if verification > 0 then
                set result = concat(result,character);
            end if;
    
            set i = i + 1;
    
        end while;
    
    return result;
    else
    return '';
    end if;
    end //
    
    
    delimiter ;")) { echo 'hey the function was written. its called LeaveNumber()'; }
    

1 个答案:

答案 0 :(得分:1)

您的代码中有两个语法错误:

  • create function不支持if exists
  • character是保留的SQL关键字。

以下似乎对我有用。我建议使用SQL&#39; ide&#39;比如MySQL workbench。它会立即显示语法错误。

DROP function  IF EXISTS LeaveNumber;

delimiter //

create function LeaveNumber(str varchar(50)) returns varchar(50)
no sql
begin
declare verification varchar(50);
declare result varchar(50) default '';
declare nextChar varchar(2);
declare i integer default 1;

if char_length(str) > 0 then
    while(i <= char_length(str)) do
        set nextChar = substring(str,i,1);
        set verification = find_in_set(nextChar,'1,2,3,4,5,6,7,8,9,0');

        if verification > 0 then
            set result = concat(result,nextChar);
        end if;

        set i = i + 1;

    end while;

return result;
else
return '';
end if;
end //


delimiter ;