Не удается получить PHP lastInsertId () для работы с этой настройкой - PullRequest
0 голосов
/ 23 декабря 2018

Я использовал приведенное ниже как способ подключения к базе данных MySQL и как я сейчас запрашиваю ее.Кажется, это немного отличается от множества примеров, которые я вижу в Интернете.Я не могу понять, как заставить lastInsertId () работать с этой настройкой:

define("DB_HOST", "localhost");
define("DB_NAME", "mydatabase");

$link = new DBLink("username", "password");

class DBLink {

  private $host = DB_HOST;
  private $dbname = DB_NAME;
  private $user;
  private $pass;

  private $dbConnection;
  private $error;

  private $sql;

  public function __construct($user, $pass) {

  $this->user = $user;
  $this->pass = $pass;

  $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
  $options = array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
      PDO::ATTR_EMULATE_PREPARES => false,
      PDO::ATTR_ERRMODE  => PDO::ERRMODE_EXCEPTION
    );

   try {
      $this->dbConnection = new PDO($dsn, $this->user, $this->pass, $options);
    }

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

public function query($query) {
  $this->sql = $this->dbConnection->prepare($query);
}

public function bind($param, $value) {
  $this->sql->bindParam($param, $value);
}

public function execute() {
  return $this->sql->execute();
}

Затем я добавлю новую строку в базу данных следующим образом:

 $link->query("INSERT INTO users (username, phone, email)
 VALUES (:username, :phone, :email)");

 $link->bind(':username', $username);
 $link->bind(':phone', $phone);
 $link->bind(':email', $email);
 $link->execute();

После добавления строки я хочу получить идентификатор строки, которая была вставлена ​​в базу данных.Я пробовал:

$link->lastInsertId();

$link->$sql->lastInsertId();

Написание отдельной функции с последующим использованием функции внутри класса DBLink:

$link->getLastID();

public function getLastID() {
   return $this->sql->lastInsertId();
}

И другие дикие догадки, такие как

 $this->dbConnection->lastInsertId();

Я также попробовал все вышеперечисленные варианты с помощью insert_id вместо lastInsertId (), потому что я видел, что это рекомендуется в нескольких местах.

И еще несколько вещей, на которые я потратил около 3 часов.Ничто не работает, чтобы вернуть последний вставленный идентификатор.Я просмотрел множество примеров в Интернете, но все они выполняют запрос к базе данных немного иначе, чем у меня.Я полагаю, что lastInsertId () должен быть в объекте PDO, но я просто не уверен, как это назвать так, как у меня настроены мои запросы и ссылка на базу данных.Кто-нибудь может помочь?

Редактировать: Может быть, у меня неправильно настроена база данных MySQL?Первичным ключом для этой таблицы является id.Это то, как lastInsertId () знает, из какого столбца получить «id», по сравнению с любым другим столбцом?

1 Ответ

0 голосов
/ 23 декабря 2018

Я думаю, что использовал что-то вроде этого.В execute() используйте

public function execute() {
  $this->lastInsertID = null;
  $ret = $this->sql->execute();
  $this->lastInsertID = $this->dbConnection->lastInsertId();
  return $ret;
}

и определите переменную в классе

private $lastInsertID;

, а затем

public function getLastID() {
   return $this->lastInsertID;
}

, что гарантирует получение последнего идентификатора вставкисразу после выполнения SQL.

...