मुझे लगता है कि ओओपी कैसे काम करता है यह समझने में मुझे कोई समस्या है। मैंने पहले से ही उस कोड को बदल दिया है जो यह काम करता है, लेकिन यह मुझे लगता है कि प्रोपर्स तरीका नहीं है। परिदृश्य के बाद (। नहीं, मैं एक USERLOGIN अपने आप के द्वारा अपने वास्तव में सिर्फ स्थानीय देव के लिए समझने के लिए OOP बेहतर बनाने नहीं कर रहा हूँ,):ओओपी को समझना - अन्य कक्षाओं में पीडीओ कनेक्शन का उपयोग कैसे करें
class Database {
/* Properties */
private $conn;
private $dsn = 'mysql:dbname=test;host=127.0.0.1';
private $user = 'root';
private $password = '';
/* Creates database connection */
public function __construct() {
try {
$this->conn = new PDO($this->dsn, $this->user, $this->password);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "";
die();
}
return $this->conn;
}
}
तो में:
मैं एक database.php फ़ाइल है इस वर्ग में मैं डेटाबेस कनेक्शन बना रहा हूं और मैं कनेक्शन (ऑब्जेक्ट?)
फिर मेरे पास दूसरी श्रेणी है, प्रसिद्ध उपयोगकर्ता वर्ग (वास्तव में मैं ऑटोलोड का उपयोग नहीं कर रहा हूं, लेकिन मुझे इसके बारे में पता है):
include "database.php";
class User {
/* Properties */
private $conn;
/* Get database access */
public function __construct() {
$this->conn = new Database();
}
/* Login a user */
public function login() {
$stmt = $this->conn->prepare("SELECT username, usermail FROM user");
if($stmt->execute()) {
while($rows = $stmt->fetch()) {
$fetch[] = $rows;
}
return $fetch;
}
else {
return false;
}
}
}
तो मेरे दो वर्गों को तोड़ दो। जैसा कि आप देखते हैं, कुछ भी बड़ा नहीं है। अब, फ़ंक्शन नाम login
के बारे में भ्रमित न हों - वास्तव में मैं डेटाबेस से कुछ उपयोगकर्ता नाम और usermails का चयन करने और उन्हें प्रदर्शित करने का प्रयास करें। मैं इस से प्राप्त करने के लिए प्रयास करें:
$user = new User();
$list = $user->login();
foreach($list as $test) {
echo $test["username"];
}
और यहाँ समस्या आती है। जब मैं इस कोड को निष्पादित, मैं निम्नलिखित त्रुटि संदेश मिलता है:
Uncaught Error: Call to undefined method Database::prepare()
और मुझे यकीन है मैं वास्तव में समझते हैं कि क्या इस त्रुटि का कारण बनता है नहीं कर रहा हूँ।
कोड अच्छी तरह से काम करता है जब मैं निम्नलिखित बातें बदलने के लिए: के बजाय निजी की जनता के लिए database.php में
बदलें $conn
(मुझे लगता है कि thats बुरा ... लेकिन जब अपने निजी, मैं केवल निष्पादित कर सकते हैं? डेटाबेस क्लास के अंदर पूछताछ, मैं सही हूँ? तो क्या मुझे इन सभी क्वेरी को डेटाबेस क्लास में रखना चाहिए? मुझे लगता है कि यह खराब है, क्योंकि एक बड़ी परियोजना में यह वास्तव में बड़ा हो जाएगा ..)
और दूसरा परिवर्तन मुझे करना है: उपयोगकर्ता.php फ़ाइल में $this->conn->prepare
से $this->conn->conn->prepare
बदलें। और यहां मैं वास्तव में कोई विचार क्यों नहीं है।
मेरा मतलब है, user.php के निर्माता में मैंने एक $this->conn = new Database()
और के बाद से नए डाटाबेस मुझे डीबी वर्ग से संबंध वस्तु वापस आ जाएगी, मैं वास्तव में नहीं जानता कि क्यों एक दूसरे conn->
अगर कोई मुझे थोड़ा बेहतर समझा सकता है तो मैं वास्तव में आभारी हूं। मैं चर के दृश्यता के बारे में जानता हूं और मैंने इसके बारे में बहुत कुछ पढ़ा है, लेकिन मुझे लगता है कि मुझे अभी यह समझ में नहीं आया है, अन्यथा मुझे यह समस्या नहीं होगी।
प्रत्येक सलाह के लिए धन्यवाद! :)
कन्स्ट्रक्टर को कुछ भी वापस नहीं करना चाहिए: http://stackoverflow.com/questions/6849572/returning-a-value-in-constructor-function-of-a-class - उस विधि तक पहुंचने के लिए आपका 'डाटाबेस' 'वर्ग को 'पीडीओ' – CD001
बढ़ाने की आवश्यकता होगी आपकी त्रुटि' $-- conn-> तैयार है ('आप अपने डेटाबेस वर्ग पर तैयार फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं लेकिन कोई तैयार फ़ंक्शन नहीं है। आप '$ डाटाबेस पब्लिक का conn' जिसके परिणामस्वरूप '$ this-> conn-> conn-> ready' होगा। आपके डेटाबेस' __construct() 'का रिटर्न वैल्यू डाटाबेस ऑब्जेक्ट को वापस नहीं कर रहा है, भले ही आप इसे $- > conn' –
@ सीडी 00001 कन्स्ट्रक्टर के बारे में सलाह के लिए धन्यवाद, मैं इसे देख लूंगा। दूसरी बात के बारे में निश्चित है? क्योंकि जब मैं डेटाबेस क्लास में पूरा 'लॉगिन' फ़ंक्शन डालता हूं, तो यह पूरी तरह से काम करता है पीडीओ से विस्तार ... – Twinfriends