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
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
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 –
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 –