Задавайте вопросы, мы ответим
Вы не зашли.
в MySQL API есть такая функции как mysql_escape_string(),mysql_real_escape_string(), но когда нужно сделать тоже самое в хранимых процедурах возникает проблема. Есть ли в самом языке что то похожее или нужно писать свою функцию для этого ?
Неактивен
В самом языке нету, т.к. это лишено смысла - Вы передаете строку внутрь
MySQL уже в нужном виде. Внутри процедуры строка уже внутри MySQL =>
передавать ее туда не надо ни в каком виде.
Неактивен
НУ давайте разберем на примере:
DROP DATABASE IF EXISTS tst;
CREATE DATABASE tst;
USE tst;
DROP TABLE IF EXISTS tst;
CREATE TABLE tst(
id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
tst_name varchar(64) NOT NULL DEFAULT ''
);
тестовая процедура:
DELIMITER $$
DROP PROCEDURE IF EXISTS `atswitch`.`sp_tst`$$
CREATE PROCEDURE `tst`.`sp_tst`(
IN in_name varchar(64),
OUT out_err_desc varchar(1024)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET out_err_desc = CONCAT(out_err_desc, ' SQLEXCEPTION occured.');
SET out_err_desc = CONCAT('Insert into tst failed (', in_name, ').');
INSERT INTO tst SET tst_name=in_name;
SET out_err_desc='success'.
END$$
DELIMITER ;
тестовый запрос:
call sp_tst('test\'name', @err_dsc);
SELECT @err_dsc
попробуйте все это выполнить и скажите мне что получилось.
Отредактированно Golova (04.12.2007 17:27:02)
Неактивен
+-------------------------------------+ | @err_dsc | +-------------------------------------+ | Insert into tst failed (test'name). | +-------------------------------------+ 1 row in set (0.00 sec) > select * from tst; +----+-----------+ | id | tst_name | +----+-----------+ | 1 | test'name | +----+-----------+ 1 row in set (0.02 sec)
Отредактированно paulus (04.12.2007 15:36:06)
Неактивен
Наверное, такая функция могла бы понадобиться в другой ситуации, при попытке неправильного использования PREPARE.
Неактивен
rgbeast написал:
Наверное, такая функция могла бы понадобиться в другой ситуации, при попытке неправильного использования PREPARE.
У меня как раз таки PREPARE и используется, просто даже обычный запрос не проходит, поэтому я не стал огород городить с PREPARE.
значит считаем выражение:
В самом языке нету, т.к. это лишено смысла - Вы передаете строку внутрь
MySQL уже в нужном виде. Внутри процедуры строка уже внутри MySQL =>
передавать ее туда не надо ни в каком виде.
.
недействительным ?
Неактивен
Даже в случае PREPARE, как мне думается, это бессмысленно. Попробуйте придумать
пример, где это нужно?
Неактивен
Обычный запрос проходит, как указал paulus. А PREPARE надо использовать правильно, то есть передавать переменные в нее при выполнении EXECUTE
Неактивен
В PREPARE ты все равно будешь делать CONCAT со строками, которые пришли снаружи
(т.е. через addslashes) или из базы (но все равно как законченные строки). У тебя никогда
не возникнет необходимости в такой функции внутри процедуры.
Убедить меня в обратном можно примером... но я думаю, что такого примера нету.
Неактивен
Вот пример неправильного использования PREPARE, при котором функция требуется
mysql> create table g (g varchar(100));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into g values ('horse');
Query OK, 1 row affected (0.00 sec)
mysql> DELIMITER //
mysql> create procedure gg (s VARCHAR(100)) BEGIN
SET @s1:=CONCAT('UPDATE g SET g=\'',s,'\'');
PREPARE gstat FROM @s1; EXECUTE gstat;
END //
Query OK, 0 rows affected (1.66 sec)
mysql> DELIMITER ;
mysql> set @a='kon\'';
Query OK, 0 rows affected (0.01 sec)
mysql> call gg(@a);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''kon''' at line 1
Неактивен
Да, согласен, был не прав
Неактивен
Согласен что приведенный мною пример корявый, но вот rgbeast привел правильный пример.
Отредактированно Golova (04.12.2007 17:28:14)
Неактивен
Требуемую функции несложно реализовать, используя функцию REPLACE.
REPLACE( REPLACE(@a, '\\', '\\\\'), '\'', '\\\'');
Неактивен
Лучше уж тогда хранимой функцией в базе mysql
И менять надо 4 символа - две кавычки, бэкслеш и #0.
Неактивен
начал было я писать хранимую функцию, да усиленно лазить по строковым функциям и обнаружил:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_quote
QUOTE(str)
Quotes a string to produce a result that can be used as a properly escaped data value in an SQL statement. The string is returned enclosed by single quotes and with each instance of single quote (“'”), backslash (“\”), ASCII NUL, and Control-Z preceded by a backslash. If the argument is NULL, the return value is the word “NULL” without enclosing single quotes.
помню что точно искал её и усиленно но попалась только сейчас - зараза
Неактивен