2013-10-03 5 views
7

मैं पैरामीटर के साथ एक सरल प्रक्रिया बनाने की कोशिश कर रहा हूं।MySQL (संग्रहीत) प्रक्रिया - पैरामीटर और क्वेरी

CALL new_procedure('mode', 'ASC'); 

पहला इनपुट स्तंभ पीछे नहीं है प्रकार दिशा

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 

    DECLARE order_by varchar(30); 
    SET @order_by = CONCAT('`', in_order_by_column, '` ', in_order_by_direction); 
/* 
    SELECT * FROM `common_tags` ORDER BY @order_by LIMIT 5; 
*/ 
    SELECT @order_by as 'c'; 

END 

ऊपर के उदाहरण में मैं इसे केवल 2 मानकों outputting तो मैं देख सकता हूँ क्या हो रहा है है।

परिणाम:

"c" 
`mode` ASC 

जब मैं नीचे के इच्छित कोड के साथ प्रक्रिया चलाता हूं।

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 

    DECLARE order_by varchar(30); 
    SET @order_by = CONCAT('`', in_order_by_column, '` ', in_order_by_direction); 
    SELECT * FROM `common_tags` ORDER BY @order_by LIMIT 5; 

END 

परिणाम

tags_id  data    mode  parent_id  position 
1   Wood    2   13    6 
2   Trippy    0   0    0 
4   Artists    1   0    1 
6   "Newest Additions" 1   0    11 
12   "Natural Elements" 2   5    8 

आप देख सकते हैं परिणाम mode द्वारा पृथक नहीं कर रहे हैं।

किसी भी मदद की सराहना की जाती है।

उत्तर

10

दुर्भाग्य से, आप इस मामले में PREPARE संपूर्ण क्वेरी की जरूरत है:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `new_procedure`$$ 

CREATE PROCEDURE `new_procedure`(IN in_order_by_column varchar(20), in_order_by_direction char(4)) 
BEGIN 
    SET @buffer = CONCAT_WS('', 
     'SELECT * FROM `common_tags` ORDER BY `', in_order_by_column, '` ', in_order_by_direction, ' LIMIT 5' 
    ); 

    PREPARE stmt FROM @buffer; 
    EXECUTE stmt; 

    DEALLOCATE PREPARE stmt; 
END$$ 

DELIMITER ; 

नोट: वर्णित दृष्टिकोण बहुत सावधान इस्तेमाल किया जाना चाहिए, क्योंकि यह SQL इंजेक्शन हमलों के लिए vulnurable है, अगर गलत तरीके से इस्तेमाल किया।

संबंधित मुद्दे