Je dois insérer mes données dans 2 tables différentes. Dans la première table, la requête suivante fonctionne parfaitement:
$insertProjectUser = 'INSERT INTO #__pmanager_user (user_cms_id, user_email, user_created_ip) VALUES (' . $user->id . ', "' . $user->email . '", "' . $_SERVER['REMOTE_ADDR'] . '")';
$db->setQuery($insertProjectUser );
$db->query();
Cette table a une colonne auto-incrémentée appelée project_user_id
et j'ai besoin de cette valeur immédiatement.
Comment puis-je obtenir correctement le "dernier identifiant inséré"? J'ai essayé plus de solutions comme:
Toutes ces solutions ne fournissent que la valeur zéro 0.
Mis à jour:
Ma requête est:
$db = JFactory::getDbo();
$insertProjectUser = 'INSERT INTO #__pmanager_user (user_cms_id, user_email, user_created_ip) VALUES (' . $user->id . ', "' . $user->email . '", "' . $_SERVER['REMOTE_ADDR'] . '")';
$db->setQuery($insertProjectUser );
$db->query();
$addressID = $db->insertid();
Si je fais: echo $addressID
, Je ne reçois rien (chaîne vide).
Il semble que le problème ne soit pas lié à Joomla. Juste Google autour de votre problème. La première réponse que j'ai trouvée est this :
Le problème semblait provenir du fichier de configuration phpmyadmin de MySQL, PersistentConnections, qui avait pour valeur FALSE, ce qui entraînait un nouveau CONNECTION_ID à chaque fois qu'une requête était émise, ce qui rendait SELECT LAST_INSERT_ID () inefficace.
Pour obtenir l'ID de la dernière ligne insérée, vous pouvez utiliser insertid()
comme suit:
$db->query();
$lastRowId = $db->insertid();
Vous pouvez ensuite utiliser $lastRowId
où vous le souhaitez dans votre prochaine requête
Mise à jour avec les dernières normes de codage de la base de données (J2.5)
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$columns = array('user_cms_id', 'user_email', 'user_created_ip');
$values = array($db->quote($user->id), $db->quote($user->email), $db->quote($_SERVER['REMOTE_ADDR']));
$query->insert($db->quoteName('#__pmanager_user'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
$db->setQuery($query);
$db->query();
$addressID = $db->insertid();
echo $addressID;
La fonction insertid
de Joomla 3.7.4 (et de nombreuses versions précédentes de Joomla) repose sur le très peu fiable mysqli_insert_id
_ PHP fonction. Sur les sites extrêmement actifs, cette fonction renvoie généralement 0 ou un nombre inexact. Laissez-moi vous expliquer un peu:
Si la dernière activité sur la base de données est une activité insert
ou update
et que la structure de la table comporte une colonne auto-incrémentée, la valeur de cette colonne est alors renvoyée.
Si la dernière activité sur la base de données est une activité select
, par exemple, la fonction retournera 0.
S'il y avait une autre activité subséquente insert
/update
après votre insert
, alors la fonction renverra l'ID de la colonne auto-incrémentée de la dernière instance insert
/update
.
Le problème avec tout cela n’est pas vraiment Joomla, mais MySQL, qui n’a pas de méthode fiable pour obtenir le dernier ID inséré. La méthode la plus fiable (mais pas encore idéale) pour obtenir le dernier ID inséré consiste à interroger la table pour obtenir une valeur unique. Par exemple, si vous insérez un contact avec un email unique, vous devrez alors interroger la table pour obtenir son email.
J'espère que cela vous aidera, et si quelqu'un a de meilleures informations sur le sujet, n'hésitez pas à commenter ou à modifier cette réponse.