Mam weryfikację e-maila po rejestracji. Nie mogę go zaktualizować DB, znam $_GET pracuje (odbijam to tylko po to, by zobaczyć), ale nie mogę go kontynuować. Nie jestem pewien, co nie widzę, więc jeśli ktoś może rzucić trochę światła, bardzo bym to docenił.

DBC to moje połączenie bazy danych

if (isset($_GET['vkey'])) { 
    $vkey = $_GET['vkey'];
    $db = new dbc;
    
    $db->query("
SELECT user_verified
     , user_vkey 
  FROM users 
 WHERE user_verified = 0 
   AND user_vkey = :user_vkey 
 LIMIT 1
");
    $db->bind('user_vkey', $vkey, PDO::PARAM_STR);
    $result = $db->fetchSingle();
    
        if ($result == 1) {
            // Validate Email
            $db->query("
UPDATE users
   SET user_verified = 1 
 WHERE user_vkey = :user_vkey 
 LIMIT 1
");
            $db->bind("user_vkey", $vkey, PDO::PARAM_STR);
            $run = $db->execute();
    
            if($run){
                echo "Account has been verified";
            }else{
                $db->error;
            }
    
        } else {
            echo $_GET['vkey'];
            echo "<br>This account is invalid or already verified";
        }
    } else { die("Something went wrong"); 
}

Oto funkcja pobierania

public function fetchSingle()
{
$this->execute(); 
return $this->stmt->fetch(PDO::FETCH_ASSOC); 
}

Oto tabela DB

CREATE TABLE `users` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) NOT NULL DEFAULT '',
  `user_email` varchar(255) NOT NULL DEFAULT '',
  `user_pw` varchar(255) NOT NULL DEFAULT '',
  `user_dob` date NOT NULL,
  `user_country` int(11) NOT NULL,
  `user_state` int(11) NOT NULL,
  `user_lvl` tinyint(1) NOT NULL DEFAULT '0',
  `user_vkey` varchar(255) NOT NULL DEFAULT '',
  `user_verified` tinyint(1) NOT NULL DEFAULT '0',
  `user_date` date NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Odpowiedź, którą otrzymuję, jest w instrukcji inaczej ", to konto jest nieprawidłowe lub już zweryfikowane".

Więc zgaduję, że problem jest w pierwszym zapytaniu.

0
JBruner 26 październik 2020, 07:15

1 odpowiedź

Najlepsza odpowiedź

Funkcja fetchSingle() zwraca wynik fetch(), który będzie arrajem asocjacyjny (jeśli sukces) lub false (jeśli awaria).

Sprawdzasz if ($result == 1), co nigdy nie będzie prawdziwe. Powinieneś sprawdzić if (is_array($result)). Więc Twój poprawiony kod byłby:

if (isset($_GET['vkey'])) { 
    $vkey = $_GET['vkey'];
    $db = new dbc;
    
    $db->query("SELECT user_verified,user_vkey FROM users WHERE user_verified = 0 AND user_vkey = :user_vkey LIMIT 1");
    $db->bind('user_vkey', $vkey, PDO::PARAM_STR);
    $result = $db->fetchSingle();
    
        if (is_array($result)) { // If row was retrieved successfully
            // Validate Email
            $db->query("UPDATE users SET user_verified = 1 WHERE user_vkey = :user_vkey LIMIT 1");
            $db->bind("user_vkey", $vkey, PDO::PARAM_STR);
            $run = $db->execute();
    
            if($run){
                echo "Account has been verified";
            }else{
                $db->error;
            }
    
        } else {
            echo $_GET['vkey'];
            echo "<br>This account is invalid or already verified";
        }
    } else { die("Something went wrong"); 
}
2
kmoser 26 październik 2020, 04:23