1

私は現在、ユーザーが一度に複数の受信者にメッセージを送信できるプライベート メッセージング システム (PHP/MySQL) の作成に取り組んでおり、それらのユーザーは返信を決定できます。

これが私が現在取り組んでいるものです:

tbl_pm tbl:
id
date_sent
title
content
status ENUM ('unread', 'read') DEFAULT 'unread'

tblpm_info tbl:
id
message_id
sender_id
receiver_id

ただし、次の 2 つの点についてロジックを決定するための助けが必要です。

1) 新しいメッセージが作成されたとき、「id」は自動インクリメントされるべきですか? 両方のテーブルで「id」列が自動インクリメントに設定されている場合、「関係テーブル」で「message_id」列を設定するにはどうすればよいですか?

たとえば、新しいメッセージが作成されるとき、MySQL ステートメントは次のようになります。

<?php
mysql_query("INSERT INTO `tblpm` (title, content, sender_id, date_sent) VALUES ('$subject', '$message', '$sender', NOW())" );

同じステートメントで、tblpm の「自動インクリメント」値を tblpm_info の「message_id」フィールドに入力するにはどうすればよいですか?

2) ユーザーがメッセージに返信するとき、MySQL ステートメントはどのように見えるべきですか?

おそらく、これを必要以上に複雑にしています。どんな助けでも大歓迎です!

4

6 に答える 6

1

2 人のユーザーがほぼ同時に 2 つのメッセージを投稿する可能性があるため、両方の ID の自動インクリメントに依存しないでください。最初のスクリプトがテーブルにデータを挿入し、最初のスクリプトが挿入を完了する前に2 番目のスクリプトがそのデータと挿入のtbl_pm両方を実行する場合、最初のスクリプトの 2 つのデータベース挿入は異なる ID になります。tbl_pmtblpm_infotblpm_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')" );
 }
于 2009-07-24T22:04:20.187 に答える
0

おそらくgavinが推奨するのと同様のことをしますが、スレッド化されたメッセージが必要な場合は、次のような別のキーを追加する必要があります。

private_messages
- title (text)
- date (timestamp)
- content (text)
- status (enum)
- sender_id (int)
- receiver_id (int)
- parent_message_id (int)

次に、個別のテーブルやシステムなしでメッセージをネストすることができます。

于 2009-07-24T15:48:16.020 に答える
0

はい。両方の ID に auto_increment を設定することは間違いありません。

message_id を設定するには、プログラムでそこに挿入します。

クエリは次のようになります。

mysql_query("INSERT INTO `tblpm` (title, content, sender_id, date_sent) VALUES ('$subject', '$message', '$sender', NOW())" );

同じなので注意!id が auto_increment に設定されている場合、すべての魔法が実行されます。

于 2009-07-23T17:19:55.297 に答える
0

個人的にあなたの場合(例が単純化されておらず、表示できないものがない場合)、これらのテーブルの両方からのデータを単一のテーブルに保存します。これらは直接関連しているように見えるためです。

tbl_pm tbl:

message_id

date_sent

題名

コンテンツ

status ENUM ('未読', '既読') DEFAULT '未読'

送信者 ID

receiver_id

つまり、上記のような結果になります。関係は常に 1 対 1 になるため、実際に結合する必要はありませんか? 受信者ごとに確実に変更される tbl_pm テーブルに既読/未読があります。つまり、受信者ごとにメッセージのコピーを保存する必要があります。おそらく、staus は tbl_pm 情報テーブルにあるはずです。

両方のテーブルに挿入したい場合は、クエリ内で last_insert_id() を使用するか、上記で説明したように php 内から mysql_insert_id() を使用してみてください。

于 2009-07-24T15:39:44.507 に答える
0

プレーンな PHP/Mysql 呼び出しでmysql_insert_id()は、前の INSERT 操作から自動インクリメントされた値を返します

したがって、メッセージを挿入し、新しく生成された ID を収集し、その値を別のテーブルに入れます。

于 2009-07-24T09:33:40.407 に答える