Bạn gặp phải lỗi này có thể do không tìm thấy bản ghi nào trong cơ sở dữ liệu phù hợp với tiêu chí của bạn.
Cách dễ nhất để giải quyết lỗi này là kiểm tra xem cơ sở dữ liệu có trả lại bất kỳ thứ gì trước không.
$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']) {
// ...
}
Nếu bạn không quan tâm liệu cơ sở dữ liệu có trả về bất kỳ thứ gì hay không, thì bạn có thể chỉ cần cung cấp một giá trị mặc định. Ví dụ:
$emailRes = $query->fetch(PDO::FETCH_ASSOC);
$email = $emailRes['Email'] ?? ''; // default: empty string
Cách chính xác để kiểm tra sự tồn tại trong DB bằng PDO là:
$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!");
}
Thay vì tìm nạp hàng và thực hiện lại phép so sánh trong PHP, tôi đang tìm nạp số lượng hàng phù hợp từ cơ sở dữ liệu và tôi sử dụng số đó làm boolean trong if
tuyên bố. fetchColumn()
sẽ tìm nạp một cột từ hàng đầu tiên và nếu tôi sử dụng COUNT(*)
Tôi biết sẽ luôn có một hàng.
Bạn cũng có thể làm điều đó trong một truy vấn:
$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!");
}