2016-05-23 94 views
0

我有一个用户类,它将用户保存到我的MySQL数据库。这很好,但我试图记录新用户和对现有用户所做的更改。 此日志记录功能未执行,我查询的查询不会返回任何错误。公共职能不执行

用户等级:

class User 
{ 
    private $db; 

    function __construct($db_con) 
    { 
     $this->db = $db_con; 
    } 

    public function log_change_user($id, $action) 
    { 
     $usr_name = get_name($this->db, $id, 'full'); 
     $cur_user = $_SESSION['user_id']; 
     if($action == 'new') 
     { 
      $log_act = 0; 
     } 
     else if($action == 'edit') 
     { 
      $log_act = 1; 
     } 
     else if($action == 'delete') 
     { 
      $log_act = 2; 
     } 
     try { 
      $stmt = $this->db->prepare("INSERT INTO mainlog (user, action, type, subject_id, subj_name, cdate) VALUES (:user_id, :action, 0, :id, :subj_name, now())"); 
      $stmt->bindParam(":user_id", $cur_user); 
      $stmt->bindParam(":action", $log_act); 
      $stmt->bindParam(":id", $id); 
      $stmt->bindParam(":subj_name", $usr_name); 

      $stmt->execute(); 

      return $stmt; 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 

    } 

    public function register($user_id, $fname, $lname, $prefix, $email, $pass, $role, $phone, $dob) 
    { 
     try 
     { 
      if($pass !== null) 
      { 
       $new_password = password_hash($pass, PASSWORD_DEFAULT); 

       $stmt = $this->db->prepare("INSERT INTO users(id, firstname, lastname, prefix, email, password, role, phone, dob, cdate) VALUES(:id, :fname, :lname, :prefix, :email, :pass, :role, :phone, :dob, now()) ON DUPLICATE KEY UPDATE firstname=:fname, lastname=:lname, prefix=:prefix, email=:email, password=:pass, role=:role, phone=:phone, dob=:dob, edate=now()"); 

       $stmt->bindparam(":pass", $new_password); 
      } 
      else 
      { 
       $stmt = $this->db->prepare("INSERT INTO users(id, firstname, lastname, prefix, email, role, phone, dob, cdate) VALUES(:id, :fname, :lname, :prefix, :email, :role, :phone, :dob, now()) ON DUPLICATE KEY UPDATE firstname=:fname, lastname=:lname, prefix=:prefix, email=:email, role=:role, phone=:phone, dob=:dob, edate=now()"); 

      } 

      $stmt->bindParam(":id", $user_id); 
      $stmt->bindparam(":fname", $fname); 
      $stmt->bindparam(":lname", $lname); 
      $stmt->bindparam(":prefix", $prefix); 
      $stmt->bindparam(":email", $email); 

      $stmt->bindparam(":role", $role); 
      $stmt->bindparam(":phone", $phone); 
      $stmt->bindparam(":dob", $dob); 

      $stmt->execute(); 

     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     }  
    } 

    public function login($email, $pass) 
    { 
     try 
     { 
      $stmt = $this->db->prepare("SELECT id, password, role FROM users WHERE email=:email LIMIT 1"); 
      $stmt->execute(array(':email' => $email)); 
      $row = $stmt->fetch(PDO::FETCH_ASSOC); 
      if($stmt->rowCount() > 0) 
      { 
       if(password_verify($pass, $row['password'])) 
       { 
        $_SESSION['user_id'] = $row['id']; 
        $_SESSION['user_role'] = $row['role']; 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    public function is_loggedin() 
    { 
     if(isset($_SESSION['user_id'])) 
     { 
      return true; 
     } 
     else 
     { 
      return false;  
     } 
    } 

    public function redirect($view) 
    { 
     $_GET['view'] = $view; 
    } 

    public function logout() 
    { 
     session_destroy(); 
     unset($_SESSION['user_id']); 
     unset($_SESSION['user_role']); 
     return true; 
    } 

} 

我的Ajax调用中使用的users.php:

require_once('../../../../config/config.php'); 

if(isset($_POST['add_user'])) 
{ 
    if($_POST['add_user'] == true) 
    { 
     $fname = $_POST['fname']; 
     $lname = $_POST['lname']; 
     $prefix = $_POST['prefix']; 
     $email = $_POST['email']; 
     if(isset($_POST['pass'])) 
     { 
      $pass = $_POST['pass']; 
     } 
     else 
     { 
      $pass = ''; 
     } 
     $role = $_POST['role']; 
     $phone = $_POST['phone']; 
     $dob = date('Y-m-d', strtotime($_POST['dob'])); 

     $add_user = new User($db_con); 

     if($add_user->register(null, $fname, $lname, $prefix, $email, $pass, $role, $phone, $dob)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 

    } 
    else if($_POST['add_user'] == false) 
    { 
     $user_id = $_POST['uid']; 
     $fname = $_POST['fname']; 
     $lname = $_POST['lname']; 
     $prefix = $_POST['prefix']; 
     $email = $_POST['email']; 
     $role = $_POST['role']; 
     $phone = $_POST['phone']; 
     $dob = date('Y-m-d', strtotime($_POST['dob'])); 

     $edit_user = new User($db_con); 

     if($edit_user->register($user_id, $fname, $lname, $prefix, $email, $pass, $role, $phone, $dob)) 
     { 
      $edit_user->log_change_user($user_id, 'edit'); 
      return true; 

     } 
     else 
     { 
      return false; 
     } 
    } 
} 

if(isset($_POST['delete_user'])) 
{ 
    $id = $_POST['delete_user']; 
    $stmt = $db_con->prepare("DELETE FROM users WHERE id=:id"); 
    //add_log_entry($db_con, $_SESSION['user_id'], 2, 0, $id); 
    if($stmt->execute(array(':id' => $id))) 
    { 
     echo true; 
    } 
    else 
    { 
     echo false; 
    } 

} 

if(isset($_POST['get_user_data'])) 
{ 
    $id = $_POST['get_user_data']; 
    $stmt = $db_con->prepare("SELECT * FROM users WHERE id=:id"); 
    $stmt->execute(array(':id' => $id)); 
    $record = $stmt->fetch(PDO::FETCH_OBJ); 

    echo json_encode($record); 

} 

if(isset($_POST['user_full_name'])) 
{ 
    $id = $_POST['user_full_name']; 
    echo get_name($db_con, $id, 'full'); 
} 
+1

你检查'$ _ POST [...] == FALSE'但将“从不”这样的情况,因为POST数据总是字符串(从来不是,但这只是一个错误的假设)。 – apokryfos

+0

我不知道,但由ajax调用发送的数据将'$ _POST ['add_user']'设置为true或false。 – MartijnICU

+0

它可能是'$ _POST ['add_user'] =='true''或'$ _POST ['add_user'] =='false''(注意引号)。我会做一个:'filter_input(INPUT_POST,'add_user',FILTER_VALIDATE_BOOLEAN)'将字符串布尔值恢复为正常的布尔值。 – apokryfos

回答

1

有两个问题在此代码:

  1. 你假设你的register功能将成功返回true,但事实并非如此。

你需要解决这个问题。

public function register($user_id, $fname, $lname, $prefix, $email, $pass, $role, $phone, $dob) 
    { 
     try 
     { 
      if($pass !== null) 
      { 
       $new_password = password_hash($pass, PASSWORD_DEFAULT); 

       $stmt = $this->db->prepare("INSERT INTO users(id, firstname, lastname, prefix, email, password, role, phone, dob, cdate) VALUES(:id, :fname, :lname, :prefix, :email, :pass, :role, :phone, :dob, now()) ON DUPLICATE KEY UPDATE firstname=:fname, lastname=:lname, prefix=:prefix, email=:email, password=:pass, role=:role, phone=:phone, dob=:dob, edate=now()"); 

       $stmt->bindparam(":pass", $new_password); 
      } 
      else 
      { 
       $stmt = $this->db->prepare("INSERT INTO users(id, firstname, lastname, prefix, email, role, phone, dob, cdate) VALUES(:id, :fname, :lname, :prefix, :email, :role, :phone, :dob, now()) ON DUPLICATE KEY UPDATE firstname=:fname, lastname=:lname, prefix=:prefix, email=:email, role=:role, phone=:phone, dob=:dob, edate=now()"); 

      } 

      $stmt->bindParam(":id", $user_id); 
      $stmt->bindparam(":fname", $fname); 
      $stmt->bindparam(":lname", $lname); 
      $stmt->bindparam(":prefix", $prefix); 
      $stmt->bindparam(":email", $email); 

      $stmt->bindparam(":role", $role); 
      $stmt->bindparam(":phone", $phone); 
      $stmt->bindparam(":dob", $dob); 

      return $stmt->execute(); 

     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
      return false; //Probably better to rethrow the exception to let the global error handler handle it but this works too. 
     }  
    } 
  • 您使用$_POST值作为布尔值,但他们总是会被进来的字符串。大多数IDE都会警告直接使用$ _POST并建议使用filter_input
  • 例子:

    if(filter_input(INPUT_POST,'add_user',FILTER_VALIDATE_BOOLEAN) == true) { } 
    

    Read more on PHP input filters

    +0

    是的。谢谢!我只是错过了(一定是一直盯着它太长)。事实上,'$ _POST'总是以字符串的形式进行评估,这是我今天学到的。 – MartijnICU

    0

    检查您的用户::注册方法。你期望一个布尔返回类型与你的if检查。你没有任何回报(void)。如果检查无效将始终返回false(空== NULL)

    返回TRUE或FALSE