У меня есть ниже Процедура хранения
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, '%")');
Тогда это будет работать для одинарных кавычек,но это сломается для двойной кавычки.Так есть ли способ исправить это в обоих случаях?