2008-11-13 12 views
8

मैं अभी एक ऑब्जेक्ट उन्मुख PHP वेबसाइट विकसित कर रहा हूं और शेष सिस्टम से सार डेटाबेस कार्यक्षमता का सबसे अच्छा तरीका निर्धारित करने का प्रयास कर रहा हूं। अभी, मुझे एक डीबी कक्षा मिली है जो सिस्टम के सभी कनेक्शन और प्रश्नों का प्रबंधन करती है (यह एमडीबी 2 के लिए काफी इंटरफ़ेस है)। हालांकि, इस सिस्टम का उपयोग करते समय, मुझे एहसास हुआ है कि मेरे पास मेरे कोड में हर जगह कई SQL क्वेरी स्ट्रिंग दिखाई दे रही हैं।डीबी कार्यक्षमता से कोड अलग करना

function checkLogin($email,$password,$remember=false){ 
    $password = $this->__encrypt($password); 
    $query = "SELECT uid FROM Users WHERE email=? AND pw=?"; 

    $result = $this->db->q($query,array($email,$password)); 

    if(sizeof($result) == 1){ 
     $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); 
     $uid = $row['uid']; 
    }else{ 
     return false; 
    } 

    /* Rest of the login script */ 
} 

मैं करना चाहते हैं क्या इनलाइन एसक्यूएल की मात्रा को कम करने के लिए सबसे अच्छी तकनीक का पता लगाना है: उदाहरण के लिए, मेरे उपयोगकर्ता कक्षा में, मैं कुछ इस तरह मिल गया है। मैं समझता हूं कि ऐसा करने का एक तरीका उपयोगकर्ता के भीतर कार्यों को प्रत्येक प्रश्न के लिए लिखना होगा जो उपयोगकर्ता (निम्न की तरह कुछ) का उपयोग करता है, लेकिन इससे कुछ फ़ंक्शन हो सकते हैं।

function checkLogin($email,$password,$remember=false){ 
    $password = $this->__encrypt($password); 
    $uid = $this->do_verify_login_query($email,$password); 

    /* Rest of the login script */ 
} 

function do_verify_login_query($email,$encpw){ 
    $query = "SELECT uid FROM Users WHERE email=? AND pw=?"; 
    $result = $this->$db->q($query,array($email,$encpw)); 

    if(sizeof($result) == 1){ 
     $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); 
     return $row['uid']; 
    }else{ 
     return false; 
    } 
} 

तो ... मेरा प्रश्न। एक सामान्य डेटाबेस एप्लिकेशन का उपयोग करने वाली बड़ी संख्या में पूछताछ के प्रबंधन के लिए सबसे अच्छी तकनीक क्या है? जिस तरह से मैंने वर्णन किया है, क्या इस स्थिति को संभालने का सही तरीका होगा? या डीबी कक्षा के भीतर प्रश्नों की एक सूची पंजीकृत करने और प्रत्येक अद्वितीय आईडी (जैसे USER_CHECKLOGIN) के साथ संबद्ध करने के बारे में क्या है जो डीबी के क्वेरी फ़ंक्शन में पारित किया गया है? यह विधि सुरक्षा के साथ भी मदद कर सकती है, क्योंकि यह उन प्रश्नों को सीमित कर देगी जो केवल इस सूची में पंजीकृत हैं, लेकिन सभी वर्ग कार्यों को लिखते समय याद रखना एक और बात है। विचार?

उत्तर

7

SQL को अलग-अलग कार्यों में खींचने के बाद एक सभ्य शुरुआत है। कुछ अन्य चीजें जो आप कर सकते हैं:

  • डेटाबेस एक्सेस कोड के लिए अलग-अलग कक्षाएं बनाएं। इससे यह सुनिश्चित करने में मदद मिलेगी कि आपके पास अपनी सभी PHP फ़ाइलों में बिखरे हुए SQL फ़ंक्शन नहीं हैं।
  • बाहरी फ़ाइलों से एसक्यूएल लोड करें। यह आपके SQL कोड और आपके PHP कोड को पूरी तरह से अलग करता है, जिससे दोनों अधिक रखरखाव योग्य होते हैं।
  • संग्रहीत प्रक्रियाओं का उपयोग करें जब आप कर सकते हैं। यह एसक्यूएल को आपके PHP कोड से पूरी तरह से हटा देता है, और बाहरी एसक्यूएल निष्पादित होने वाले जोखिम को कम करके आपकी डेटाबेस सुरक्षा में सुधार करने में मदद करता है।
+0

संग्रहित नहीं किया जाएगा प्रक्रियाओं को इन्हें निष्पादित करने के लिए इनलाइन SQL कथन की आवश्यकता होती है, क्योंकि वे केवल डेटाबेस में मौजूद हैं? या जब मैं संग्रहीत प्रक्रियाओं का उपयोग करने के लिए कहता हूं तो क्या मैं समझ नहीं पा रहा हूं? – cmptrgeekken

+0

MySQL वास्तव में संग्रहीत प्रक्रियाओं को जोड़ता है, और मैंने पढ़ा है कि वाक्यविन्यास उतना ही लचीला नहीं है जितना कि यह SQL सर्वर में है। आईएमओ, संग्रहित प्रक्रियाएं वास्तव में बेकार हैं जब तक कि आपको एक व्यापक या जटिल क्वेरी लिखने की आवश्यकता न हो। – Kevin

+0

आप नाम और क्वेरी पैरामीटर पास करने, फ़ंक्शन कॉल के साथ संग्रहीत प्रक्रियाओं को कॉल करते हैं। http://www.macronimous.com/resources/using_stored_procedure_with_mySQL_and_PHP.asp –

4

आप ActiveRecord Pattern को लागू करने के लिए देख सकते हैं। इस तरह के एक डिजाइन पैटर्न का उपयोग करने से आप अपनी तालिकाओं से डेटा के साथ काम करने में कुछ स्थिरता प्रदान करते हैं। इन प्रकार के दृष्टिकोणों के लिए कुछ डाउनसाइड्स हो सकते हैं, मुख्य रूप से कुछ प्रकार के प्रश्नों के लिए प्रदर्शन लेकिन इसे चारों ओर काम किया जा सकता है।

+0

मुझे लगता है कि इस तरह के पैटर्न का उपयोग करने के लिए एक फायदा यह होगा कि आप प्रश्नों का प्रतिनिधित्व करने के लिए एक ही संरचना का उपयोग कर सकते हैं, और अपने एसक्यूएल को उत्पन्न करने में डेटाबेस-विशिष्ट सिंटैक्स के बारे में चिंता करने की ज़रूरत नहीं है, इस प्रकार अमूर्तता की एक और परत जोड़ना। – cmptrgeekken

4

एक अन्य विकल्प एक ORM का इस्तेमाल किया जा सकता, पीएचपी के लिए सबसे शक्तिशाली हैं:

दोनों आप वस्तुओं का एक सेट का उपयोग कर अपने डेटाबेस का उपयोग करने की अनुमति , डेटा को संग्रहीत करने और पूछताछ के लिए एक सरल एपीआई प्रदान करते हुए, दोनों की अपनी क्वेरी भाषा होती है, जो आंतरिक रूप से लक्षित डीबीएमएस देशी एसक्यूएल में परिवर्तित होती है, इससे सरल कॉन्फ़िगरेशन चा के साथ एक आरडीबीएमएस से दूसरे में माइग्रेटिंग अनुप्रयोगों को आसानी मिल जाएगी। nges। मुझे यह तथ्य भी पसंद है कि आप उदाहरण के लिए सत्यापन जोड़ने के लिए डेटामैडेल तर्क को समाहित कर सकते हैं, केवल अपने मॉडल वर्गों को विस्तारित करके।

3

चूंकि आप कहते हैं कि आप इसे ओओ PHP के रूप में कर रहे हैं, तो आपके पास पहली जगह में सभी विधियों के माध्यम से SQL क्यों बिखरा हुआ है?अधिक आम मॉडल होंगे:

  1. एक ओआरएम का उपयोग करें और डेटाबेस को संभालने दें।
  2. अपनी कक्षाओं को एक या अधिक 'लोड' विधियों को दें जो एक ऑब्जेक्ट के सभी डेटा को स्मृति में खींचने के लिए एक एकल क्वेरी का उपयोग करें और 'सेव' विधि जो डेटाबेस में सब कुछ अपडेट करने के लिए एक क्वेरी का उपयोग करती है। अन्य सभी तरीकों को केवल मेमोरी मैनिपुलेशन करने की आवश्यकता है और डेटाबेस इंटरैक्शन लोड/सेव विधियों तक सीमित हैं।

पहला विकल्प आम तौर पर अधिक मजबूत होगा, लेकिन दूसरा तेजी से चल सकता है और यदि आप इनमें से कोई भी चिंता करते हैं, तो आप चीजों को करने के तरीके के मुकाबले अधिक परिचित महसूस करेंगे।

आपके लॉगिन उदाहरण के लिए, जिस तरह से मैं इसे करूँगा, तो उपयोगकर्ता को ईमेल पते से बस लोड करना होगा, $user->check_password($entered_password) पर कॉल करें, और एक अपवाद/वापसी झूठी फेंक दें/जो भी check_password विफल हो जाए। न तो check_password और न ही किसी भी लॉगिन हैंडलिंग कोड को डेटाबेस के साथ खुद को चिंता करने की आवश्यकता है, या यहां तक ​​कि यह जानकर कि एक डेटाबेस है जहां उपयोगकर्ता लोड हो जाता है।

0

एक और विकल्प डेटा के रूप में प्रश्नों के बारे में सोचना और उन्हें डेटाबेस में स्टोर करना है। उदाहरण के लिए, आप एक टेबल बना सकते हैं जो क्वेरी को एक नाम और दूसरी तालिका के साथ संग्रहीत करता है जो उस क्वेरी के पैरामीटर को संग्रहीत करता है। फिर PHP में एक फ़ंक्शन बनाएं जो क्वेरी का नाम और पैराम्स की सरणी लेता है और क्वेरी को निष्पादित करता है, जिससे कोई परिणाम लौटाता है। आप कुछ उपयोगकर्ताओं तक पहुंच प्रतिबंधित करने के लिए प्रश्नों के लिए अन्य मेटाडेटा भी संलग्न कर सकते हैं, परिणामों के लिए पोस्ट-फ़ंक्शंस लागू कर सकते हैं।

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