データを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」を正しく取得するにはどうすればよいですか?私は次のような他の解決策を試しました:
これらのソリューションはすべて、ゼロ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
を実行すると、何も表示されません(空の文字列)。
問題はJoomlaとは関係がないようです。あなたの問題のためだけにグーグル。私が見つけた最初の答えは this です:
問題は、MySQLのphpmyadmin構成ファイルのPersistentConnectionsがFALSEに設定されているようで、クエリが発行されるたびに新しいCONNECTION_IDが発生するため、SELECT LAST_INSERT_ID()が無効になります。
最後に挿入された行の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;
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を取得するための最も信頼できる(ただし、理想からはほど遠い)メソッドは、テーブルに一意の値をクエリすることです。たとえば、一意の電子メールを含む連絡先を挿入する場合は、テーブルに彼の電子メールを照会する必要があります。
これがお役に立てば幸いです。誰かがその主題についてより良い情報を持っている場合は、この回答をコメントまたは編集してください。