web-dev-qa-db-fra.com

Joomla DB Insert, comment obtenir le dernier identifiant inséré?

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:

  • mysqli_insert_id ($ db)
  • $ selectedID = insertid ()
  • mysqli_insert_id ($ db)

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).

4
xxx

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.

2
Dmitry Rekun

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;
7
Lodder

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.

1
itoctopus