user_load

定義

user_load($array = array())
modules/user/user.module

描述

取得一個 user 物件

參數

$array 一個關連式陣列,讓這個函數可以找得到你想找的使用者資料,可能是帳號名稱或是e-mail位址。

傳回值

如果找到的話,傳回一個"完整"的 user 物件,否則傳回 FALSE

範例

其實Drupal 的登入就是靠它來檢查,輸入帳號密碼,來作搜尋有沒有符合的條件。

$account = user_load(array('name' => '納格髓', 'pass' => 'very secret', 'status' => 1))

name: 帳號
pass: 密碼
status:狀態 (1 代表啟用中)

如果有找到,就表示帳號密碼正確,$account 就會傳回一個 user 物件。再下兩行

global $user;
$user = $account;  // 把找到的 user 物件"存"起來

這樣就算是完成登入了。很簡單吧!!

附帶一提,登出的語法也很簡單。

global $user;
$user = drupal_anonymous_user();

程式碼

<?php
function user_load($array = array()) {
 
// Dynamically compose a SQL query:
 
$query = array();
 
$params = array();

  foreach (
$array as $key => $value) {
    if (
$key == 'uid' || $key == 'status') {
     
$query[] = "$key = %d";
     
$params[] = $value;
    }
    else if (
$key == 'pass') {
     
$query[] = "pass = '%s'";
     
$params[] = md5($value);
    }
    else {
     
$query[]= "LOWER($key) = LOWER('%s')";
     
$params[] = $value;
    }
  }
 
$result = db_query('SELECT * FROM {users} u WHERE '. implode(' AND ', $query), $params);

  if (
db_num_rows($result)) {
   
$user = db_fetch_object($result);
   
$user = drupal_unpack($user);

   
$user->roles = array();
    if (
$user->uid) {
     
$user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
    }
    else {
     
$user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
    }
   
$result = db_query('SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = %d', $user->uid);
    while (
$role = db_fetch_object($result)) {
     
$user->roles[$role->rid] = $role->name;
    }
   
user_module_invoke('load', $array, $user);
  }
  else {
   
$user = FALSE;
  }

  return
$user;
}
?>