2013-12-18 3 views
13

मैंने अपने डेटा के लिए डाटाबेसवेपर का उपयोग करने के बारे में कुछ शोध किया है। हालांकि, मैंने कुछ पोस्ट पढ़ी हैं जहां लोग दावा करते हैं कि आपको पीडीओ का उपयोग डेटाबेसबेस के लिए नहीं करना चाहिए क्योंकि यह पहले से ही एक है।क्या एक पीडीओ रैपर वास्तव में अधिक है?

ऐसा हो सकता है, लेकिन मुझे अभी भी आश्वस्त है कि इसमें बहुत सारे लाभ हैं।

  1. आप अपनी वेबसाइट फ़ाइलों में फैले हुए एक वर्ग में अपने सभी डेटा क्रियाओं (क्रूड) को संभालते हैं। इसलिए त्रुटियों को डीबग करना और संभालना बहुत आसान है।
  2. आप आसानी से अपनी कक्षा को किसी अन्य डेटाबेस क्लास के साथ बदल सकते हैं।
  3. तुम बस databaseclass में कोड फोन
  4. वैकल्पिक रूप से आप उदाहरण प्रवेश, आंकड़ा परीक्षण, के लिए के साथ वर्ग का विस्तार कर सकते अपने कोड को दोहराने के लिए, नहीं है ...

उदाहरण:

<?php 
class Database 
{ 
    public $connection; 
    private $host = ""; 
    private $username = ""; 
    private $password = ""; 
    private $dbname = ""; 

    public function __construct(){  
     $this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username,$this->password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
     $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    public function insert($query, array $data){   
     $this->connection->prepare($query)->execute($data);  
     return $this->connection->lastInsertId(); 
    } 

    public function update($query, array $data) { 
     $stmt = $this->executeQuery($query,$data); 
     return $stmt->rowCount();  
    } 

    public function delete($query, array $data) { 
     $stmt = $this->executeQuery($query,$data); 
     return $stmt->rowCount();  
    } 

    public function findOne($query, array $data = null){   
     $stmt = $this->executeQuery($query,$data);   
     return $stmt->fetchObject(); 
    } 

    public function findMany($query, array $data = null){ 
     $stmt = $this->executeQuery($query,$data); 
     return($stmt->fetchAll(PDO::FETCH_OBJ)); 
    } 

    public function executeQuery($query,$data = null){ 
     $stmt = $this->connection->prepare($query); 
     $stmt->execute($data); 
     return $stmt; 
    } 
} 
?> 

डेटा पुनर्प्राप्त करने के लिए सभी चरणों को लगातार दोहराने के बजाय, आप get() को कॉल कर सकते हैं और एक क्वेरी और कुछ वैकल्पिक पैरामीटर पास कर सकते हैं। यह हर बार एक कनेक्शन खोलने की तुलना में बहुत अधिक प्रभावशाली है, कोड की 3 लाइनें करें और इसे बंद करें।

$db->get("select * from user where id = ?",array(1)); 
+0

"सभी कदम ..." - क्या वास्तव में बहुत से लोग हैं? पीडीओ आपको 'foreach ($ pdo-> क्वेरी (...) $ पंक्ति के रूप में लिखने देता है) ', जो कम से कम लगभग एक अपरिपक्व बयान के लिए मिलता है। डेटाबेस के साथ बातचीत करना महंगा है और केवल "सभी जगहों" के बजाय शुरू होने के लिए बहुत विशिष्ट तरीकों से होना चाहिए, मुझे नहीं लगता कि यह हमेशा एक पंक्ति में क्यों होता है। – deceze

+0

जगह के बजाय बहुत विशिष्ट तरीकों के साथ आपका क्या मतलब है? –

+0

एमवीसी, चिंताओं को अलग करना। आपके मॉडल परत में कुछ केंद्रित स्थान होना चाहिए जहां डेटा डेटाबेस से पुनर्प्राप्त किया जाता है। जैसे 'UserService :: getAllActiveUsers()' या 'PostService :: UpdatePost ($ id, array $ data) '। इन तरीकों का एकमात्र काम डेटाबेस के साथ एक विशिष्ट तरीके से बातचीत करना है। अंदर आपको उचित डेटाबेस क्वेरी पर जितनी आवश्यक हो उतनी लाइनें खर्च करनी चाहिए, इसे एक लाइन में बनाने का कोई फायदा नहीं है। इस तरह के "सरल रैपर" होने से आपको एक बार इन केंद्रीय तरीकों को बनाने के बजाय सभी जगहों से अपने डेटाबेस से पूछताछ करने के लिए प्रेरित किया जाता है। – deceze

उत्तर

6

यह कहा जाता है क्योंकि एक पीडीओ आवरण बनाने के लिए सबसे प्रयास सचमुच असहाय हैं और चीजों को कच्चे पीडीओ के साथ से भी बदतर हैं।
इसके अलावा परिसर, कोई भी उनके रैपर को लिख रहा है, ज्यादातर गलत हैं।

के तुम्हारा लेते हैं:

आप एक कक्षा में अपने सभी डेटा को संभालने, अपनी वेबसाइट फ़ाइलों में फैले नहीं।

किसी भी विशेष अर्थ के साथ काफी अस्पष्ट बयान। निश्चित रूप से आप पूरे एप्लिकेशन में अपने डेटा को संभालते हैं लेकिन कच्चे पीडीओ का उपयोग नहीं करते बल्कि अपनी कक्षा का उपयोग करते हैं।

आप आसानी से अपनी कक्षा को किसी अन्य डेटाबेस क्लास के साथ बदल सकते हैं।

लेकिन एक भ्रम। आप वास्तव में अपने दो सहायक तरीकों से चिपक नहीं सकते - कभी-कभी आपको कच्चे पीडीओ उदाहरण का उपयोग करने की आवश्यकता होती है।

तुम बस databaseclass

इस एक में कोड फोन अपने कोड को दोहराने के लिए, की जरूरत नहीं है पूरी तरह सच है। लेकिन यह किसी अन्य एपीआई के साथ उपयोगी नहीं है। कोई आपत्ति -

वैकल्पिक रूप से आप उदाहरण के प्रवेश के लिए के साथ वर्ग का विस्तार कर सकते, आंकड़ा

यह एक उचित एक है परीक्षण करती है।

यह हर बार कनेक्शन खोलने की तुलना में बहुत अधिक प्रभावशाली है, कोड की 3 लाइनें करें और इसे बंद करें।

यह एक झूठा है। कोई भी आपको हर बार एक कनेक्शन खोलने, कोड की 3 लाइनों को निष्पादित करने और इसे बंद करने के लिए कहता है। कच्चे पीडीओ कनेक्शन के साथ भी एक बार खोला जाता है।

हालांकि, आपका कार्यान्वयन काफी अच्छा है। यह कच्चे पीएसओ में बहुत ज्यादा नहीं जोड़ता है (वास्तव में, यह केवल एक पंक्ति से पुनरावृत्ति को छोटा करता है) लेकिन अभी भी समझदार है। तो - मैं इस दृष्टिकोण को बल्कि सफल कहूंगा।

कुछ सुझाव:

  1. वास्तव में वर्ग गुण के रूप में डेटाबेस क्रेडेंशियल्स भंडारण का कोई मतलब नहीं है। उन्हें केवल कन्स्ट्रक्टर में और कहीं और
  2. अतिरिक्त विधि की आवश्यकता के बिना, कन्स्ट्रक्टर में कनेक्शन क्यों नहीं बनाया जाए?
  3. सार्वजनिक फ़ंक्शन getOne() आपके सेट के लिए अनिवार्य अतिरिक्त होगा।
  4. आप $ कनेक्शन सार्वजनिक करने की जरूरत है - और कम से कम जब तक आप सभी तरीकों दोनों पीडीओ से उपलब्ध बनाने PDOstatement
+0

मेरे पहले वक्तव्य के साथ मेरा मतलब है कि सभी डेटाबेस संचालन को संभालना। यह वास्तव में काफी अस्पष्ट था। मैं अक्सर देखता हूं कि लोग लगातार पूरे पृष्ठ पर क्रूड ऑपरेशंस का उपयोग करके अपना वेबपृष्ठ बनाते हैं।इसके बजाए, मुझे आश्वस्त है कि सबसे अच्छा अभ्यास एक एकल वर्ग को आपके सभी डेटाबेस संचालन को संभालने देना है। –

+1

अच्छी तरह से पीडीओ पहले से ही इस तरह के एक वर्ग होने का नाटक करता है। तो, पीडीओ के बारे में बात करते हुए, आपका तर्क प्रासंगिक नहीं है। रैपर के साथ मुख्य समस्या, जो लोग लिखते हैं, पीडीओ रचनाकारों की तुलना में कम ज्ञान भी रखते हैं, और चीजों को और भी खराब बनाते हैं। अगर केवल निष्पादित() ने बुलियन की बजाय $ $ लौटाया - यह आपकी कक्षा को वास्तव में अप्रचलित कर देगा। –

+1

दरअसल, मैं समझता हूं, मैं निश्चित रूप से पीडीओ रचनाकारों से बेहतर नहीं हूं :), मैं इसे सुधारने की भी कोशिश नहीं कर रहा हूं, लेकिन वस्तुओं को वापस करने के तरीकों को बनाकर इसे आसान तरीके से उपयोग करें। –

2

'Overkill' व्यक्तिपरक है। आपके विशेष मामले के लिए निर्णय लेने के लिए आपके लिए चीजें हैं। प्रदर्शन के अनुसार मुझे संदेह है कि आपको कोई अंतर दिखाई देगा।

इस तरह कुछ करने के कुछ संभावित लाभ हैं। उदाहरण के लिए, आप कक्षा में क्वेरी प्रोफाइलिंग और एप्लिकेशन लॉगिंग एम्बेड कर सकते हैं। और, जैसा कि आप इंगित करते हैं, आपके पास प्रश्नों को ऐसे तरीके से संरचित करने का विकल्प है जो आपके साथ काम करने और बनाए रखने के लिए सबसे आसान है।

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

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