2012-02-08 15 views
8

मेरे पास एक नई वेबसाइट है (मैं अभी एक बना रहा हूं) और मैं यह सुनिश्चित करना चाहता हूं कि मैं इसे सही तरीके से करूँ और 1 महीने के बाद फिर से डिजाइन न करें।अपाचे। गतिशील पृष्ठों (php) प्रदर्शन के साथ htaccess नियम

तो मैं जैसे पृष्ठों है:

/candy 
/candy/chocolate 
/drink 
/drink/beer 

तो मैं के बारे में मैं कैसे यह कर सकते हैं stackoverflow पर देखने के लिए और मैंने पाया:

RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

अब, इस कार्य करेगी, लेकिन मेरे सवाल के बारे में निष्पादन है । स्पष्ट रूप से $ _GET [श्रेणी] नाम और पृष्ठ उदाहरण के लिए चॉकलेट होगा।

अब जब मैं अपनी क्वेरी करना मैं क्या करेंगे:

$sql = "SELECT myfields FROM mytable WHERE name = '" . $_GET['category'] . "'"; 

अब, अगर मैं प्राथमिक कुंजी है जो एक INT है का उपयोग यह बेहतर होगा। यदि हां, तो ऐसा करने के लिए मैं अपने। htaccess में क्या कर सकता हूं?

+2

यदि नाम अद्वितीय है, तो इससे कोई फर्क नहीं पड़ता। यदि नाम अद्वितीय नहीं है, तो आप गहरे रंग में हैं। –

+2

@bianca: क्या आप स्ट्रैक ओवरफ्लो उपयोग जैसे यूआरएल को ध्यान में रखेंगे:/id/category/page? जैसे:/123/कैंडी/चॉकलेट/जो कैंडी और चॉकलेट की कुंजी अद्वितीय है और 123 इस मामले में चॉकलेट आईडी का अंतिम पृष्ठ है? –

+0

मैं अधिमानतः तब से नहीं चाहूंगा लेकिन अगर यह एकमात्र विकल्प है तो मुझे ऐसा लगता है। – Bianca

उत्तर

7

दुर्भाग्य से एक नाम का उपयोग करके एसक्यूएल इंजेक्शन से स्क्रिप्ट की रक्षा और यह एक विशिष्ट आईडी में बदलने का नाम ही पर एक सूचकांक बनाने की तुलना में निष्पादित करने के लिए अधिक समय लग सकता।

पृष्ठ के नाम से एक सूचकांक जोड़े

ALTER TABLE `mytable` ADD key indexname (columnname); 

उदाहरण:

ALTER TABLE `page` ADD key pagename (name); 

अब, क्योंकि

यहाँ है कि मैं क्या यूआरएल आप के आधार पर की सिफारिश है संरचना अलग है /candy बनाम /candy/chocolate, मुझे लगता है कि आपके पास एक मुख्य पृष्ठ की तरह कुछ प्रकार की संरचना है सूची (/ कैंडी) और विशिष्ट सूची (/ candychocolate) इसलिए इस मामले में आप इस का उपयोग कर सकते हैं:

RewriteRule ^([a-z]+)/?$ index.php?category=$1&page=list [NC,L] 
RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

तो फिर तुम बस श्रेणी और पेज अनुक्रमित क्षेत्र का उपयोग क्वेरी कर सकते हैं। यह तेज़ होगा (निश्चित रूप से एक आईएनटी जितना तेज नहीं है लेकिन अभी भी तेज़ है)।

पहले प्रश्न के लिए आप कर सकते हैं:

$name = addslahes($name); 
SELECT fields FROM category WHERE category = '$name'; 

और आप उपयोग कर सकते हैं जब आप एक पृष्ठ मिलता है:

$categoryname = addslahes($categoryname); 
$pagename = addslahes($pagename); 
SELECT fields FROM page LEFT JOIN category ON (page.categoryid = category.id) WHERE page = '$pagename' AND category = '$categoryname'; 

इस तरह से, दोनों वर्ग और पेज का उपयोग करके, आप पेज से दूर रहेंगे नहीं मिला (404)।

0

यूआरएल में इस्तेमाल पहचानकर्ता अद्वितीय होना चाहिए और डेटाबेस सूचकांक होना चाहिए। यदि आईडी और श्रेणी दोनों नाम अद्वितीय और अनुक्रमित हैं, तो यह प्रदर्शन-वार है, लेकिन मैं नाम का उपयोग करने की अनुशंसा करता हूं क्योंकि यह एक आंतरिक आईडी की तुलना में अधिक खोज इंजन-अनुकूल और वर्णनात्मक है, जो विशेष रूप से महत्वपूर्ण होता है जब एक यूआरएल होता है बिना किसी अतिरिक्त संदर्भ के कहीं कहीं प्रदर्शित किया गया (उदाहरण के लिए, example.org/1 बनाम example.org/shoes अख़बार में मुद्रित)। यदि नहीं, तो आईडी का उपयोग करें और के लिए पुनर्लेखन नियम बदलने के लिए: (। Btw, \d+ भी page के लिए इस्तेमाल किया जाना चाहिए अगर यह संख्यात्मक है)

RewriteRule ^(\d+)/([a-z]+)/?$ index.php?category=$1&page=$2 [NC,L] 

3

बस सुनिश्चित करें कि अपने डेटाबेस के लिए एक index है बनाना नाम पंक्ति यह लुकअप को एक पूर्णांक प्राथमिक कुंजी का उपयोग करने के जितना तेज़ बना देगा।

कुछ ऐसा लगता है जैसे CREATE INDEX name ON mytable मुझे लगता है, लेकिन phpmyadmin के माध्यम से इसे करना बहुत आसान है।

इसके अलावा addslashes का उपयोग कर

$sql = "SELECT myfields FROM mytable WHERE name = '" . addslashes($_GET['category']) . "'"; 
+0

"चुनें ... से ... कहां नाम = '"। $ _GET ['श्रेणी']। "" भाग निश्चित रूप से मूल प्रश्न से ज़्यादा उल्लेख करने योग्य है! _Please_, एसक्यूएल इंजेक्शन से अपने कोड की रक्षा करें, _do_ _not_ बस अपने SQL क्वेरी में उपयोगकर्ता इनपुट सामग्री। आप पहले डीबी से सभी श्रेणी के नामों का चयन करके और फिर '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – hijarian

+0

@hijarian देखें नहीं कि यह जोड़ों की तुलना में अधिक सुरक्षित कैसे है। कोड को इंजेक्शन देने का कोई तरीका नहीं है, और जोड़ों को बहुत छोटा है। कुछ लोग mysql_real_escape_string का उपयोग करने का सुझाव देंगे, लेकिन यह केवल तभी महत्वपूर्ण है जब आप किसी अन्य अक्षर का उपयोग करते हैं जो आईएसओ -885 9 -1 या यूटीएफ -8 है। – Gerben

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