2 人のユーザーがほぼ同時に 2 つのメッセージを投稿する可能性があるため、両方の ID の自動インクリメントに依存しないでください。最初のスクリプトがテーブルにデータを挿入し、最初のスクリプトが挿入を完了する前に2 番目のスクリプトがそのデータと挿入のtbl_pm
両方を実行する場合、最初のスクリプトの 2 つのデータベース挿入は異なる ID になります。tbl_pm
tblpm_info
tblpm_info
それを除けば、あなたのデータベース構造は目前のタスクに対してうまく整理されていないようです。メッセージが非常に長く、非常に多数のユーザーに送信される可能性があると仮定すると、メッセージの内容を一度保存し、受信者ごとに未読ステータス、既読時間などを設定するのが理想的です。例:
CREATE TABLE `pm_data` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`date_sent` timestamp NOT NULL,
`title` varchar(255)
`sender_id` smallint(5) unsigned,
`parent_message_id` smallint(5) unsigned,
`content` text,
PRIMARY_KEY (`id`)
);
CREATE TABLE `pm_info` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`pm_id` smallint(5) unsigned NOT NULL,
`recipient_id` smallint(5) unsigned,
`read` tinyint(1) unsigned default 0,
`read_date` timestamp,
PRIMARY_KEY (`id`)
);
これら 2 つのテーブルを作成し、どちらも「id」値が自動インクリメントに設定されていることに注意してください。ただし、「info」テーブルには、pm_id
参照する「data」行の ID 番号を保持するフィールドもあります。各行には、選択に使用できる「情報」テーブルの主キーがあることを確認してください。
MySQL を使用した真のリレーショナル データベースのセットアップが必要な場合は、エンジンが InnoDB に設定されていることを確認してください。これにより、テーブル間の関係をセットアップできます。たとえば、「info」テーブルに何かを挿入しようとすると、 「データ」テーブルに存在しpm_id
ない場合、INSERT は失敗します。
データベース構造を選択すると、PHP コードは次のようになります。
<?php
// Store these in variables such that if they change, you don't need to edit all your queries
$data_table = 'data_table';
$info_table = 'info_table';
mysql_query("INSERT INTO `$data_table` (title, content, sender_id, date_sent) VALUES ('$subject', '$message', '$sender', NOW())" );
$pmid = mysql_insert_id(); // Get the inserted ID
foreach ($recipent_list as $recipient) {
mysql_query("INSERT INTO `$info_table` (pm_id, recipient_id) VALUES ('$pmid', '$recipient')" );
}