2013-06-03 4 views
1

Заранее спасибо за это, я не смог найти ответ, который решил мою проблему ... Я не понимаю, что я делаю иначе, чем учебники/предложения I найдено:PHP PDO :: lastInsertId() возвращает 0

SQL Таблица

CREATE TABLE IF NOT EXISTS `LastInsertID` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` char(150) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 

PHP File

<?php 

// Connect to database 
$user = "foo"; 
$pswd = "bar"; 

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pswd); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// Prepare request 
$rq = $db->prepare('INSERT INTO `LastInsertID` VALUES(NULL,:name,:email)'); 

// Begin and commit request 
$db->beginTransaction(); 
$values = array('name'=>'Foo','email'=>'[email protected]'); 
$rq->execute($values); 
$db->commit(); 

// Echo last ID 
echo $db->lastInsertId(); 

?> 

Это возвращает 0 ш и он должен вернуться 6. Где проблема?

+1

http://www.php.net/manual/en/pdo.lastinsertid.php#85129 –

+0

@Pekka 웃 Глупо мне, я не читал предложение перед примером кода ... – Sheljohn

ответ

6

Перед тем, как совершить сделку, вы должны использовать $db->lastInsertId(). Даже если вы откатите транзакцию, идентификатор «используется» или пропущен, поэтому вы не должны зависеть от идентификаторов, которые должны быть последовательными.

+0

Спасибо; это возвращает правильный идентификатор :) Но что делать, если я выполняю несколько подготовленных запросов в разных таблицах без фиксации, будет ли он корректно обновляться после каждого запроса? – Sheljohn

+0

Да, вы можете делать много запросов и получать идентификатор для каждой транзакции. – Mike

+0

Большое спасибо за вашу помощь! Я буду отмечать вас как ответ, так как SO позволяет мне :) – Sheljohn

0

Используйте этот

INSERT INTO `LastInsertID` (name, email) VALUES(:name,:email) 

вместо

INSERT INTO `LastInsertID` VALUES(NULL,:name,:email) 

Я удалил NULL.

+1

Это не изменить поведение –

+0

@Pekka 웃 Хорошо, я сомневаюсь здесь. Если для 'Id', который является уникальным, и auto increment устанавливается как' NULL', это не повлияет? – Yogus

+0

, если вы укажете «NULL», автоинкремент заполнит правильное значение. (То, что вы предлагаете, тоже не ошибается - это просто не решает проблему OP, которая связана с фиксацией, см. Ответ Майка) –

Смежные вопросы