तैयार विवरण
पर विचार करें concat()
जैसा कि वे अक्सर होते हैं।
DROP PROCEDURE if exists myStoredProc101;
DELIMITER $$
CREATE PROCEDURE myStoredProc101
( pSanitized VARCHAR(124)
)
BEGIN
set @mySql:=concat("SELECT DISTINCT ID FROM user where match(name) against ('* *",pSanitized,"* *')");
PREPARE stmt1 FROM @mySql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
$$
DELIMITER ;
आपकी संग्रहीत खरीद के पास काम करने का कोई मौका नहीं था क्योंकि यह आपके पैरामीटर का उपयोग भी नहीं कर रहा था। आपने जो किया वह एक स्ट्रिंग अक्षर के अंदर कुछ दफन कर रहा था। इसके अलावा, varchar(124) थोड़ा अजीब है :p
केवल सफलता के बारे में लोगों को तैयार बयानों के साथ एक उपयोगकर्ता चर का उपयोग करना है (@
. के साथ) ) बनाम स्थानीय चर का उपयोग करने के असफल प्रयास (DECLARE से)। तो, यह आपको भविष्य में कुछ घंटों के सिर पीटने से बचा सकता है।
PHP मैनुअल पेज से संग्रहित प्रक्रियाएं :
संग्रहीत प्रो को mysqli
. से कॉल करने के लिए , कृपया उत्तर
पर एक नज़र डालें पाब्लो टोबार से। यह कई चर के साथ विशेष रूप से सुखद नहीं दिखता है, लेकिन ऐसा लगता है कि यह कहां है। स्पॉयलर अलर्ट:mysql वैरिएबल का उपयोग करें, PHP वेरिएबल का नहीं।
माना, पाब्लो एक परिणाम सेट नहीं लौटा रहा था, बल्कि एक OUT
. पर लिख रहा था संग्रहित प्रो में var। शायद आपको वही करना होगा जो उसने IN
. के लिए किया था पैरामीटर, और कॉल करें multi_query()
, फिर एक store_result()
, फिर एक fetch_all()
(संक्षेप में, PHP एक पृष्ठ को ऊपर संदर्भित करता है)।
वैकल्पिक रूप से, पैलेडियम यहां द्वारा किए गए कॉल के अनुसार कॉल किया जाएगा। ।
किसी भी मामले में, SQL इंजेक्शन पास करने की ज्ञात भेद्यता से बचने के लिए मामला लिया जाना चाहिए संग्रहीत कार्यविधि दिनचर्या पर।