आपको यह त्रुटि शायद इसलिए मिल रही है क्योंकि डेटाबेस में आपके मानदंड से मेल खाने वाले कोई रिकॉर्ड नहीं मिले थे।
इस त्रुटि को हल करने का सबसे आसान तरीका यह जांचना है कि डेटाबेस ने पहले कुछ लौटाया है या नहीं।
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
// VVV - Here I am checking if there was anything returned and then I check the condition
if($emailRes && $emailRes['Email']==$_POST['email']) {
// ...
}
यदि आपको परवाह नहीं है कि डेटाबेस ने कुछ भी लौटाया है, तो आप बस एक डिफ़ॉल्ट मान प्रदान कर सकते हैं। उदाहरण के लिए:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
पीडीओ का उपयोग करके डीबी में अस्तित्व की जांच करने का सही तरीका है:
$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username");
$query->execute([':Username' => $name]);
if ($query->fetchColumn()) {
throw new \Exception("Username is already in use!");
}
$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Email =:Email");
$query->execute([':Email' => $email]);
if ($query->fetchColumn()) {
throw new \Exception("Email is already in use!");
}
पंक्ति लाने और PHP में फिर से तुलना करने के बजाय मैं डेटाबेस से मेल खाने वाली पंक्तियों की गिनती ला रहा हूं और मैं उस गिनती को if
में बूलियन के रूप में उपयोग करता हूं बयान। fetchColumn()
पहली पंक्ति से एक कॉलम लाएगा और अगर मैं COUNT(*)
. का उपयोग करता हूं मुझे पता है कि हमेशा एक पंक्ति होगी।
आप इसे एक प्रश्न में भी कर सकते हैं:
$query = $pdo->prepare("SELECT COUNT(*) FROM Users WHERE Username =:Username OR Email =:Email");
$query->execute([':Username' => $name, ':Email' => $email]);
if ($query->fetchColumn()) {
throw new \Exception("Username or email is already in use!");
}