处理mysql sp

时间:2018-10-01 14:19:27

标签: mysql stored-procedures

我有以下存储过程

DELIMITER $$

USE `database_name`$$

DROP FUNCTION IF EXISTS `get_data`$$

CREATE DEFINER=`database_name`@`%` FUNCTION `get_data`(
                    v_search_text TEXT
) RETURNS TEXT CHARSET utf8
    DETERMINISTIC
BEGIN

    DECLARE v_select TEXT DEFAULT 'SELECT ';
    DECLARE v_from TEXT DEFAULT ' FROM ';
    DECLARE v_order,v_group TEXT DEFAULT '';
    DECLARE v_where TEXT DEFAULT ' WHERE 1 = 1 ';
    DECLARE v_return_string TEXT DEFAULT '';

    SET v_select = CONCAT(v_select,"id, title, detail", v_from, "table");

    IF(IFNULL(v_search_text,'') != '' ) THEN
        SET v_search_text = QUOTE(v_search_text);
        SET v_where = CONCAT(v_where," AND (title like '%",v_search_text,"%' or detail like '%",v_search_text,"%' )");
    END IF;

    -- other stuff like order, pagination etc.
    SET v_return_string = CONCAT(
            v_select,
            v_from,
            v_where
        );

    PREPARE v_return_string FROM @count_query;
    EXECUTE v_return_string;
END$$

DELIMITER ;

现在让我们假设这个问题,我的数据如表

所示

id ---标题---详细信息
1 ----- A'a ----细节
2 ----- B“ b ----详细信息” b

现在,如果我将在SP之上调用并以'的形式传递搜索参数,则它将中断:

  

致电get_data('\''); -表示搜索其中包含单引号的数据

为了解决这一问题,我可以像下面这样更改一行

  

SET v_where = CONCAT(v_where,“ AND(标题,例如'%”,v_search_text,“%'或详细信息,例如'%”,v_search_text,“%')”);

  

SET v_where = CONCAT(v_where,AND(标题为“%',v_search_text,'%”或细节为“%',v_search_text,'%”)');

然后它将适用于单引号,但将变为双引号。那么有两种方法都可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我已更改到以下行:

'b'

具有以下内容:

SET v_where = CONCAT(v_where," AND (title like '%",v_search_text,"%' or detail like '%",v_search_text,"%' )");

问题已解决。