14

When a user enters his login information and hits submit, i want to check if the user already exists or not. So, i have the following two questions 1. Which hook is needed to be implemented , for the case when user hits the submit button on the login form. I need the username entered by the user. 2. How to check if a user already exists in drupal or not programmatically ?

Some sample code would be really appreciated. Please help.

Thank You.

googletorp
  • 33,075
  • 15
  • 67
  • 82
simonr
  • 141
  • 1
  • 1
  • 3

5 Answers5

22

Drupal 7 provides a function to get a user object by name :

$user = user_load_by_name($name);
if(!$user){
    // User doesn't exist
} 
else {
    // User exists
}

http://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_load_by_name/7

Mika Andrianarijaona
  • 1,619
  • 17
  • 29
  • 1
    This is a heavy-handed solution as it loads the entire user object, just to validate the existence of a user by name. Also, if you're loading a user, do not use a variable named `$user` as it could easily be confused with the `global $user` which is the current user account. – Christopher Feb 13 '14 at 04:39
  • you can also use `user_load_by_mail` in case you're searching by mail: https://api.drupal.org/api/drupal/modules!user!user.module/function/user_load_by_mail/7 – asiviero Mar 27 '15 at 13:32
12

This can be done with hook_form_alter:

function module_(&$form, &$form_state, $form_id) {
  $user_login_forms = array('user_login', 'user_login_block');
  if (in_array($form_id, $user_login_forms)) {
    $form['#validate'][] = 'my_validate_function';
  }
}

function my_validate_function(&$form, &$form_state) {
  $name = $form_state['values']['name'];
  // Drupal 6:
  if (!db_result(db_query("SELECT COUNT(*) FROM {users} WHERE name = '%s';", $name))) {
    // User doesn't exist
  }
  // Drupal 7:
  if (!db_query("SELECT COUNT(*) FROM {users} WHERE name = :name;", array(':name' => $name))->fetchField()) {
    // User doesn't exist
   }
}

It's better to query the DB directly in this case than than using user_load as it hooks into other modules as well.

googletorp
  • 33,075
  • 15
  • 67
  • 82
  • 1
    I'd forgotten you could do that with `hook_form_alter`! Kudos! Deleting my answer. – ceejayoz May 10 '10 at 16:54
  • This does not work for Drupal 7. This does: `$result = db_query("SELECT COUNT(*) FROM {users} WHERE uid = :uid", array(':uid' => $uid))->fetchField(); if ($result == 0) { // User doesn't exist return FALSE; } return TRUE;` – DrCord Jul 29 '14 at 22:50
3

In Drupal 7, substitute for this in the validation function:

if (!db_query("SELECT COUNT(*) FROM {users} WHERE name = :name", array(':name' => $name))->fetchField()) {
  // User doesn't exist
}
Arla
  • 31
  • 1
1

I realize this is almost 2 years old, but user_authenticate does this nicely.

$existing_user = user_authenticate($name,$password);
if($existing_user)
  // user exists
else
  // user doesn't exist

Hope this helps someone else.

dawoodman71
  • 395
  • 4
  • 16
  • 3
    this needs the password, this is a bad answer. – DrCord Jul 29 '14 at 21:58
  • 1
    If the user is entering a username and password why would this be a bad solution? The password isn't getting displayed and I'm simply using the password that was given. Am I missing something? – dawoodman71 Oct 24 '14 at 13:08
1

You can try to look on these 2 modules for inspiration: friendly_register and username_check.

Jasom Dotnet
  • 1,225
  • 12
  • 17