Подтвердить что ты не робот

PDO lastInsertId() всегда возвращает 0

Я столкнулся с проблемой. Моя инфраструктура отлично работала с PHP 5.3.0. Я обновил мою версию PHP до PHP 5.4.x, и у меня появилось несколько проблем с некоторыми частями моей инфраструктуры.

После обновления версии PHP PDO lastInsterId() всегда возвращает 0.

У меня есть поле автоинкремента, называемое id. Он без проблем добавляет данные в базу данных.

По какой-то причине я продолжаю получать 0 как последний идентификатор вставки.

Вот мой код;

databaseobjects.php

public static function create () {
        global $db;
        $attributes = self::sanitize(static::$fields);

        $sql  = "INSERT INTO ".PREFIX.static::$table_name." (";
        $sql .= join(", ", array_keys($attributes));
        $sql .= ") VALUE (:";
        $sql .= join(", :", array_keys($attributes));
        $sql .= ")";

        return ($db->crudQuery($sql, $attributes)) ? true : false;
    }

public static function lastInsertID () {
        global $db;
        return $db->handler->lastInsertId();
    }

database.php

public function crudQuery($sql, $data) {
        $sth = $this->handler->prepare($sql);
        return $sth->execute($data);
    }

Сначала вызывается метод create(), затем вызывается метод crudQuery(). Как я уже упоминал ранее, я могу успешно добавить данные в базу данных MySQL. К сожалению, когда я вызываю метод lastInsterID(), он всегда возвращает 0.

Я буду очень рад, если вы сможете помочь мне с этой проблемой, прежде чем я получу последний ID с SQL Query (:

4b9b3361

Ответ 1

Помимо ошибок в php/PDO или вашей структуре, есть две возможности. Либо lastInsertId() вызывается в другом соединении MySQL, чем вставка, либо вы генерируете идентификатор в своем приложении/фреймворке и вставляете его, вместо того, чтобы позволить auto_increment генерировать его для вас. Какой столбец в таблице является основным ключом /auto _increment? Этот столбец включен в $attributes в вашей функции create()?

Вы можете протестировать PDO, чтобы убедиться, что эта часть работает правильно с этим кодом (в новом файле):

// Replace the database connection information, username and password with your own.
$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'user', 'password');

$conn->exec('CREATE TABLE testIncrement ' .
            '(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))');
$sth = $conn->prepare('INSERT INTO testIncrement (name) VALUES (:name)');
$sth->execute([':name' => 'foo']);
var_dump($conn->lastInsertId());
$conn->exec('DROP TABLE testIncrement');

Когда я запускал этот script, выход был

string(1) "1"

Ответ 2

После совершения транзакции PDO:: lastInsertID() вернет 0, поэтому лучше всего вызвать этот метод до совершения транзакции.