web-dev-qa-db-ja.com

Joomla DB挿入、最後に挿入されたIDを取得する方法?

データを2つの異なるテーブルに挿入する必要があります。最初のテーブルには、完全に機能する次のクエリがあります。

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

このテーブルには、project_user_idという自動インクリメントされた列があり、この値がすぐに必要になります。

「最後に挿入されたID」を正しく取得するにはどうすればよいですか?私は次のような他の解決策を試しました:

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

これらのソリューションはすべて、ゼロ0値のみを提供します。


更新しました:

私のクエリは:

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

echo $addressIDを実行すると、何も表示されません(空の文字列)。

4
xxx

問題はJoomlaとは関係がないようです。あなたの問題のためだけにグーグル。私が見つけた最初の答えは this です:

問題は、MySQLのphpmyadmin構成ファイルのPersistentConnectionsがFALSEに設定されているようで、クエリが発行されるたびに新しいCONNECTION_IDが発生するため、SELECT LAST_INSERT_ID()が無効になります。

2
Dmitry Rekun

最後に挿入された行のIDを取得するには、次のようにinsertid()を使用できます。

$db->query();
$lastRowId = $db->insertid();

その後、$lastRowId次のクエリで希望する場所

最新のDBコーディング標準(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

Joomla 3.7.4(および以前の多くのJoomlaバージョン)のinsertid関数は、非常に信頼性の低いmysqli_insert_id PHP関数に依存しています。非常にアクティブなサイトでは、この関数はほとんどを返します0または不正確な数値です。少し説明しましょう。

  • データベースの最後のアクティビティがinsertまたはupdateアクティビティであり、テーブル構造に自動インクリメント列がある場合、その列の値が返されます。

  • たとえば、データベースの最後のアクティビティがselectアクティビティである場合、関数は0を返します。

  • insertの後に別のupdate/insertアクティビティがあった場合、関数は最後のinsert/updateの自動インクリメント列のIDを返します。

この全体の問題は、実際にはJoomlaではありませんが、MySQLには、最後のIDを挿入するための信頼できる方法がありません。最後に挿入されたIDを取得するための最も信頼できる(ただし、理想からはほど遠い)メソッドは、テーブルに一意の値をクエリすることです。たとえば、一意の電子メールを含む連絡先を挿入する場合は、テーブルに彼の電子メールを照会する必要があります。

これがお役に立てば幸いです。誰かがその主題についてより良い情報を持っている場合は、この回答をコメントまたは編集してください。

1
itoctopus