2015-09-21 3 views
0

Cette question est encore importante pour moi. Quelqu'un a-t-il une solution?Est-il possible d'utiliser PDO lastInsertId() lorsque la table était précédemment verrouillée?

$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', '********'); 

$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()); 

sortie est la suivante: chaîne (1) "lastInsertId". Mais quand je verrouiller la table alors lastInsertId est toujours 0. Donc, ce code renvoie toujours 0:

$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', 'paragraf'); 

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

Conclusion: est-il possible et comment obtenir lastInsertId lorsque la table est verrouillée? Ou ai-je tort quelque part?

@Ernestas j'ai essayé votre suggestion et ici sont le résultat :(

code:

$sthLastId = $conn->prepare('SELECT LAST_INSERT_ID();'); 
$sthLastId->execute(); 
print_r($sthLastId->fetchAll()); 

//Output when there is no lock: **string(2) "40" Array ([0] => Array ([LAST_INSERT_ID()] => 40 [0] => 40))** 
//And output when lock is use: **string(1) "0" Array ()** 

version de MySQL: 5.6.26

+0

I * pense * votre déclaration exécute jamais. Vous avez émis plusieurs requêtes dans un seul 'prepare'. Vérifiez le résultat de votre '$ sth-> execute();', si c'est faux - cela indique un échec. Aussi, êtes-vous sûr de devoir contrôler le verrouillage et le déverrouillage manuellement? – Mjh

+0

Ses exécutions. J'ai vérifié :( Oui, je suis sûr, car il ya une requête plus complexe alors ceci, c'est juste un exemple –

+0

Pour montrer à quel point la gestion des erreurs PDO est horrible avec plusieurs instructions voir [questions/32690361 - gestion des erreurs intéressantes (pastebin)] (http://pastebin.com/fcBQAtxA) .Il signale comme toujours réussi.Il montre ce qui est réellement envoyé au «serveur mysql» et le résultat d'exécution PDO –

Répondre

0

Answer

Tout semble bien Essayez d'ajouter SELECT LAST_INSERT_ID() après déverrouillage Je ne sais pas pourquoi PD O ne fonctionne pas pour vous.

version de MySQL: 5.5.44

Regardez à autre réponse: MySQL and PDO: Could PDO::lastInsertId theoretically fail?

+0

J'ai essayé, même problème :( –

+0

Exception? Avez-vous essayé directement dans le serveur SQL? Ou seulement en PHP? –

+0

Non, il n'y a pas d'erreur ou d'exception.J'ai essayé dans le serveur sql et SELECT_LAST_INSERT_ID fonctionne parfaitement.Le problème est dans le PDO apparemment. Maintenant, mais pas de chance, essayez-vous de reproduire le problème exactement comme je le fais, peut-être mon serveur mysql a un problème ou php? –