SQL दिखाने से त्रुटि संदेश रोकें


10

मेरी तालिका में मैंने डुप्लिकेट प्रविष्टियों को रोकने के लिए 'col1' पर एक इंडेक्स बनाया है जो अच्छी तरह से काम करता है लेकिन परिणामी त्रुटि संदेश उपयोगकर्ता को तब दिखाई देता है जब वे डुप्लिकेट प्रविष्टि को जोड़ने का प्रयास करते हैं, मुझे लगता है कि यह एक सुरक्षा चिंता का विषय है क्योंकि यह एसक्यूएल को प्रदर्शित करता है। तालिका उपसर्ग।

क्या त्रुटि संदेश में जूमला को एसक्यूएल प्रदर्शित करने से रोकने का कोई तरीका है?

मैंने वैश्विक कॉन्फ़िगरेशन में त्रुटि रिपोर्टिंग सेटिंग्स को बदलने की कोशिश की है लेकिन इसका कोई प्रभाव नहीं है जहां तक ​​मैं बता सकता हूं ...

उदाहरण संदेश:

त्रुटि

निम्न त्रुटि से सहेजें 'टेस्ट', '2', '1', '730')


1
मैं जूमला के लिए नया हूं, लेकिन आप बिल्कुल सही हैं, उत्पादन वातावरण में किसी भी उपयोगकर्ता की त्रुटियों में कोई एसक्यूएल नहीं होना चाहिए। न केवल सुरक्षा के लिए, बल्कि इसलिए कि यह उपयोगकर्ताओं के लिए अर्थहीन है और एक खराब उपयोगकर्ता अनुभव देता है। एक उत्पादन वातावरण में, display_errors(PHP सेटिंग) बंद होना चाहिए और ऐसी त्रुटियां केवल आपके सर्वर-साइड त्रुटि लॉग में लॉग की जानी चाहिए।
MrWhite

बस जिज्ञासु, आप शायद पहले से ही यह जाँच चुके हैं, लेकिन आप किसी भी डिबग सेटिंग्स को सक्षम करने के लिए नहीं होते हैं? जाँच करें: ग्लोबल कॉन्फ़िगरेशन> डिबग सिस्टम सेटिंग। जाँच करें: ग्लोबल कॉन्फिगरेशन> त्रुटि रिपोर्टिंग स्तर। जाँच करें: प्लगइन्स> डिबग प्लगइन बस जिज्ञासु अगर आप कुछ भी अजीब चल रहा है। मैं पूछता हूं क्योंकि मैं यह सीख
चाड विंडनागले

@ChadWindnagle हाय चाड, हाँ मैंने कोशिश की थी कि इसे बंद कर
दूं

क्षमा करें अभी संपादित किया गया है, क्या आप मुझे बता सकते हैं कि आपने अपडेट की गई सामग्री देखी है? thnx!
चाड विंडनागल

@ChadWindnagle नहीं, मैंने आपका संपादन नहीं देखा था! मैंने रिपोर्ट करने में त्रुटि की कोशिश की, लेकिन मैं प्लगइन (टिप के लिए धन्यवाद) को अक्षम करने के बारे में भूल गया, जिसे मैंने अभी अभी कोशिश की थी लेकिन फिर भी कोई प्रभाव नहीं पड़ा!
doovers

जवाबों:


6

हो सकता है कि आप एक कोशिश पकड़ कमान का उपयोग कर सकते हैं:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}

सुझाव के लिए धन्यवाद, लेकिन जब से मैं JTableसबसे अच्छा समाधान का उपयोग कर रहा था check, मेरे जवाब में विधि को ओवरराइड करना था ।
doovers

यह अच्छा जवाब है
डेविड एडोटेय

3

चूंकि यह इस व्यवहार को रोकने के लिए संभव प्रतीत नहीं होता है, मैंने निम्नलिखित समाधान लागू किया। एक JTable checkविधि से ओवरराइड करने के लिए एक डुप्लिकेट जाँच जोड़ें :

// Check for duplicate entry
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('COUNT(*)');
$query->from($this->get('_tbl'));
$query->where($db->quoteName('col1') . ' = ' . $db->quote($this->col1));

$db->setQuery($query);
$result = $db->loadResult();

if ($result) 
{
    $this->setError(" Duplicate entry for col1 = '" . $this->col1 . "'");
    return false;            
}

1

आपको अपना कोड बदलना चाहिए जो सबसे पहले डुप्लिकेट की जांच करता है और उपयोगकर्ता को एक उचित त्रुटि (जो आप लिखता है) लौटाता है और MySQL द्वारा लौटाए गए वास्तविक त्रुटि को दिखाने पर भरोसा नहीं करता है।


हाँ मुझे लगा कि मुझे ऐसा करना पड़ सकता है, लेकिन मुझे अभी भी चिंता है कि जूमला उपयोगकर्ता को प्रदर्शित त्रुटि संदेश में एसक्यूएल दिखाने के लिए खुश है। निश्चित रूप से यह एक सुरक्षा चिंता है ?? मुझे लगा कि यादृच्छिक तालिका उपसर्ग का पूरा बिंदु सुरक्षा उपाय नहीं है? शायद सबसे अच्छा अभ्यास अपनी त्रुटि से निपटने के लिए है, लेकिन ऐसी स्थिति हो सकती है कि आप आगे नहीं बढ़ सकते ... बस मुझे थोड़ा अजीब लगता है!
doovers

खैर, जुमला! उपयोगकर्ता को SQL त्रुटि संदेश नहीं दिखाता है, आपका कोड करता है।
इवो

मैं असहमत हूं, मेरा कोड त्रुटि संदेश नहीं दिखाता है लेकिन जूमला कोर कोड को दिखाने की अनुमति देता है। मेरी राय में, कोर कोड किसी भी परिस्थिति में तालिका उपसर्ग प्रदर्शित नहीं करना चाहिए, क्योंकि यह एक सुरक्षा चिंता का विषय है ...
doovers

आप INSERT के बजाय INSERT IGNORE का उपयोग क्यों नहीं करते?
इवो

अच्छा सुझाव और मैं ऐसा कर सकता था, लेकिन जब से मैं उपयोग कर JTableरहा हूं, मैं इस checkपद्धति को ओवरराइड करने और वहां एक डुप्लिकेट के लिए परीक्षण करने के लिए इच्छुक हूं । मैं उपयोगकर्ता को एक त्रुटि संदेश प्रदर्शित करना चाहता हूं, बस इसमें SQL नहीं है!
doovers
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.