Обрабатывать одинарные и двойные кавычки в mysql sp - PullRequest
0 голосов
/ 01 октября 2018

У меня есть ниже Процедура хранения

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 --- title --- detail
1 ----- A'a ---- Детали
2 ----- B "b ---- Детали" b

Теперь, если я позвоню выше SP и пройду поискпараметр как ', тогда он сломается:

call 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 голосов
/ 02 октября 2018

Я изменил ниже строки:

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

с ниже:

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

и проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...