从数据库类返回lastInsertId()

时间:2016-05-19 19:48:11

标签: php mysql pdo

我正在使用从codecourse.com上的教程中挑选的数据库类(我刚开始从程序迁移到pdo),我正在慢慢扩展它以满足我的需求。但是,我无法管理的一件事是返回全局使用的lastInsertId()。

使用该教程中的寄存器示例

$user = new User();
$salt = Hash::salt(32);
try {
 $user->create(array(
  'username' => Input::get('username'),
  'password' => Hash::make(Input::get('password'), $salt),
  'salt' => $salt,
  'firstname' => Input::get('first_name'),
  'lastname' => Input::get('last_name'),
  'joined' => date('Y-m-d H:i:s'),
  'group' => 1
  ));
 } catch(Exception $e) {
   die($e->getMessage());
 }

正是在这一点上,我想获得lastInsertId() - 刚刚注册的用户之一。我不确定它是否通过插入函数

来自Database类
require_once 'core/init.php';

class DB {
 private static $_instance = null;
 private $_pdo,
         $_query,
         $_error = false,
         $_results,
         $_count = 0;

 private function __construct() {
    try {
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'),  Config::get('mysql/username'), Config::get('mysql/password') );

    } catch(PDOException $e) {
        die($e->getMessage());
    }
}
public static function getInstance() {
    if(!isset(self::$_instance)) {
        self::$_instance = new DB();
    }
    return self::$_instance;
}


public function query ($sql, $params = array()) {
    $this->error = false;
    if ($this->_query = $this->_pdo->prepare($sql)) {
        $x = 1;
        if(count($params)) {
            foreach($params as $param) {
                $this->_query->bindValue($x, $param);
                $x++;
            }
        }

        if($this->_query->execute()) {
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count = $this->_query->rowCount();
        } else {
            $this->_error = true;
      }
    }

    return $this;
}

public function action ($action, $table, $where = array()) {
    if (count($where) === 3) {
        $operators = array('=', '>', '<', '>=', '<=');

        $field = $where[0];
        $operator = $where[1];
        $value = $where[2];

        if (in_array($operator, $operators)) {
            $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
            if(!$this->query($sql, array($value))->error()) {
                return $this;
            }
        }
    }
    return false;
}

public function get ($table, $where) {
    return $this->action('SELECT *', $table, $where);
}

public function delete ($table, $where) {
    return $this->action('DELETE', $table, $where);

}

public function insert ($table, $fields = array()) {

        $keys = array_keys($fields);
        $values = '';
        $x = 1;

        foreach($fields as $field) {
            $values .= '?';
            if ($x < count($fields)) {
                $values .= ', ';
            }

            $x++;
        }


        $sql = "INSERT INTO {$table} (`" . implode('`,`', $keys) . "`) VALUES ({$values})";

        if (!$this->query($sql,$fields)->error()) {
            return true;
        }

        echo $sql;
   }
    return false;

}

public function update ($table, $id, $fields = array()) {

        $set = '';
        $x = 1;

       foreach ($fields as $name => $value) {
            $set .= "{$name} = ?";
            if ($x < count($fields)) {
                $set .= ', ';
            }

            $x++;
        }

        $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}";

        if (!$this->query($sql,$fields)->error()) {
            return true;
        }

     }
    return false;

}


public function first () {
    return $this->results()[0];
}

public function results () {
    return $this->_results;
}

public function count () {
    return $this->_count;
}

public function error () {
    return $this->_error;
}

}

或者通过创建函数

的User类
class User {
private $_db,
        $_data,
        $_sessionName,
        $_cookieName,
        $_isLoggedIn;
public function __construct($user = null) {
    $this->_db = DB::getInstance();
    $this->_sessionName = Config::get('session/session_name');
    $this->_cookieName = Config::get('remember/cookie_name');
    if (!$user) {
        if (Session::exists($this->_sessionName)) {
            $user = Session::get($this->_sessionName);
            if ($this->find($user)) {
                $this->_isLoggedIn = true;
            } else {
                //Logged out
            }
        }
    } else {
        $this->find($user);
    }
}
public function update($fields=array(), $id = null) {
    if (!$id && $this->isLoggedIn ()) {
        $id = $this->data()->id;
    }
    if (!$this->_db->update('users', $id, $fields)) {
        throw new Exception('There was a problem updating the account!');
    }
}
public function create($fields) {
    if (!$this->_db->insert('users', $fields)) {
        throw new Exception('There was a problem creating an account!');
    }
}
 public function find($user=null) {
    if ($user) {
        $field = (is_numeric($user)) ? 'id' : 'username';
        $data = $this->_db->get('users', array($field, '=', $user));
        if ($data->count()) {
            $this->_data = $data->first();
            return true;
        }
    }
    return false;
}
public function login($username=null, $password=null, $remember = false) {
    if(!$username && !$password && $this->exists()) {
        Session::put($this->_sessionName, $this->data()->id );
    } else {
        $user = $this->find($username);
        if ($this->data()->password === Hash::make($password, $this->data()->salt)) {
            Session::put($this->_sessionName, $this->data()->id);
            if ($remember) {
                $hash = Hash::unique();
                $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id));
                if (!$hashCheck->count()) {

                    $this->_db->insert('users_session', array(
                         'user_id' => $this->data()->id,
                        'hash' => $hash
                    ));
                } else {
                    $hash = $hashCheck->first()->hash;
                }
                Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
            }
            return true;
        }
        return false;
        }
}
public function hasPermission ($key) {
    $group = $this->_db->get('groups', array('id', '=', $this->data()->group));
    if($group->count()) {
        $permissions = json_decode($group->first()->permissions, true);
        if ($permissions[$key] == true) {
            return true;
        }
    }
    return false;
}
public function exists () {
    return (!empty($this->_data)) ? true : false;
}
public function logout () {
    Session::delete($this->_sessionName);
}
public function data () {
    return $this->_data;
}
 public function isLoggedIn () {
    return $this->_isLoggedIn;
}
}

我已尝试过两者,但每当我尝试回显lastInsertId()时,都不会返回任何内容。任何建议都会受到欢迎。如果问题可能超出这些区域,我已将整个脚本上传到https://github.com/MargateSteve/login

提前致谢

史蒂夫

2 个答案:

答案 0 :(得分:0)

数据库类的insert()方法应该返回插入ID。以下是相关部分:

public function insert ($table, $fields = array()) {
    $this->query($sql,$fields);
    return $this->_db->lastInsertId;
}

而User类的create()方法应该创建一个用户实例。

public function create($fields) {
    $id = $this->_db->insert('users', $fields);
    $this->find($id);
}

请注意,insert()方法为vulnerable to SQL injection

现在您可以正确使用新创建的用户

$user = new User();
$user->create(array(
  'username' => Input::get('username'),
  'password' => Hash::make(Input::get('password')),
  'firstname' => Input::get('first_name'),
  'lastname' => Input::get('last_name'),
  'joined' => date('Y-m-d H:i:s'),
  'group' => 1
  ));
echo $user->data['id'];

我希望你不是要复制和粘贴代码,而是为了理解。我希望你理解上面的逻辑。

答案 1 :(得分:-1)

向您的DB类添加一个公共变量,该变量将保存最后插入的记录ID:

class DB {
    public $lastInsertId = null;

在同一个DB类中修改查询方法,其中实际插入发生,以便您可以从PDO中获取ID:

public function query ($sql, $params = array()) {
    $this->error = false;
    if ($this->_query = $this->_pdo->prepare($sql)) {
        $x = 1;
        if(count($params)) {
            foreach($params as $param) {
                $this->_query->bindValue($x, $param);
                $x++;
            }
        }

        if($this->_query->execute()) {
            $this->lastInsertId = $this->_pdo->lastInsertId();
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count = $this->_query->rowCount();
        } else {
            $this->_error = true;
        }
    }

    return $this;
}

在上面的代码中,这是重要的一行:

$this->lastInsertId = $this->_pdo->lastInsertId();

您正在为PDO::lastInsertId()实例变量分配lastInsertId的值,这样您就可以从实例化DB对象的任何位置访问它。

现在,修改用户类以保存名为id的变量,不要将其命名为lastInsertId,因为它令人困惑;在此上下文中,您有一个用户的单个实例,它代表一个用户,因此id只是引用此实例用户ID:

class User {

    public $id = null;

在同一个User类中修改create方法以从数据库对象实例中获取lastInsertId值:

public function create($fields) {
    if (!$this->_db->insert('users', $fields)) {
        throw new Exception('There was a problem creating an account!');
    }

    $this->id = $this->_db->lastInsertId;

}

然后您可以访问register.php文件中的用户ID,只需访问用户实例变量,例如$user->id

try {
    $user->create(array(
        'username' => Input::get('username'),
        'password' => Hash::make(Input::get('password'), $salt),
        'salt' => $salt,
        'firstname' => Input::get('first_name'),
        'lastname' => Input::get('last_name'),
        'joined' => date('Y-m-d H:i:s'),
        'group' => 1
    ));

    Session::flash('home', "You have registered with user ID $user->id");
    Redirect::to('index.php');
} catch(Exception $e) {
    die($e->getMessage());
}