使用来自 PHP 的 UDF MySQL 查询

Posted

技术标签:

【中文标题】使用来自 PHP 的 UDF MySQL 查询【英文标题】:Using a UDF MySQL query from PHP 【发布时间】:2014-05-17 02:52:00 【问题描述】:

我读自 mysql doc

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

...

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

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

    由于我不是root 管理员用户,我是否无法在安装 MySQL 的基本 Web 托管服务器(例如 HostGator、1and1、GoDaddy)上创建函数? 我在以下查询中的语法有什么问题?它在直接的 MySQL shell(黑匣子)或我的 php 脚本中都不起作用。返回的错误是:

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

这是我在 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()'; 

【问题讨论】:

旁注...但是:应该有一个UDF标签。 旁注:您不应使用sql-server 标记mysql 问题。请查看the tag wiki,另请查看this meta answer。你想要的标签确实存在,只是你看起来不够努力。 【参考方案1】:

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

创建函数不支持if exists character 是保留的 SQL 关键字。

以下似乎对我有用。我建议使用 SQL 'ide',例如 MySQL 工作台。它会立即显示语法错误。

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 ;

【讨论】:

我实际上在您回答之前发现了这一点,但非常感谢您的努力。另外,我从来不知道 MySQL 工作台。很高兴知道

以上是关于使用来自 PHP 的 UDF MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 在 SQL 中将多行传递给 UDF

PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询

MySQL如何在我的查询中加速UDF

PHP / MYSQL:如何在while循环中循环来自查询的匹配结果

来自 PHP 的 MDX 查询

PHP Mysql PDO查询来自foreach存储的多个值以供输出