0

私は、データベースとの間で複数のエントリを保存および取得するために、どのように、そしてどれが最適であるかを理解しようとしています。explodesplit、またはpreg_splitのいずれかを使用します。私が達成する必要があるのは、フォームのテキストフィールドを使用して、複数のメッセージを異なるユーザーに送信するか、「101,102,103」などのIDを入力して複数のユーザーとデータを共有するユーザーと、各IDを取得するのに十分なスマートなPHPコードです。 「、」の後にそれぞれを選択します。私はこれが多くのことを求めていることを知っていますが、私はこの分野でより熟練した人々の助けが必要です。PHPコードでIDを取得し、それらで関数を使用できるようにする方法を知る必要があります。「101,102,103」をつかむように

どうすればこれを達成できますか?例は非常に役立ちます。

ありがとう

4

3 に答える 3

1

私があなたの質問を正しく理解していれば、ID番号のコンマ区切りの文字列を扱っているのであれば、おそらくこの形式でそれらを保持するのが最も簡単でしょう。その理由は、データベースにクエリを実行するときにSQLステートメントで使用できるためです。

SELECTIDが入力されたユーザーを取得するためにクエリを実行したいとしますが、正しいですか?SELECT ... WHERE IN ...次のようなタイプのステートメントを使用する必要があります。

// Get the ids the user submitted
$ids = $_POST['ids'];
// perform some sanitizing of $ids here to make sure 
// you're not vulnerable to an SQL injection
$sql = "SELECT * FROM users WHERE ID IN ($ids)";
// execute your SQL statement

または、を使用explodeして個々のIDの配列を作成し、ループして、各値をチェックして正しいことを確認してから、ステートメントimplodeで使用できる文字列に連結して戻すこともできます。SELECT ... WHERE IN ...

編集:申し訳ありませんが、追加するのを忘れました:データベースにユーザーIDのリストを保存するという点で、メッセージIDに対して文字列としてコンマ区切りリストを保存することを検討できますが、欠点があります(他のテーブルでJOINSを実行するのは困難です)必要に応じて)。または、ルックアップタイプのテーブルを作成することをお勧めします。このテーブルは、基本的に2つの列で構成されます:messageiduserid。次に、各個人を例useridに対して保存できます。messageid

messageid | userid
1 | 1
1 | 3
1 | 5

このアプローチの利点は、このテーブルを使用して他のテーブルを結合できることです(messageメッセージ自体の詳細を格納する別のテーブルがある場合があります)。

このメソッドでは、メッセージテーブルに新しいエントリを作成し、IDを取得してから、userids文字列を個別の部分に分解し、最後にINSERT、個々のIDとメッセージIDを使用してデータを挿入するステートメントを作成します。メッセージのユーザーIDのリストの編集、および削除を処理するには、他のメカニズムを検討する必要があります。

それが理にかなっていることを願っています!

于 2011-03-25T18:42:56.527 に答える
0

さて、あなたが提案した3つの機能を考えると:

  • explode()常に同じで ある単純なパターンがある場合は、正常に機能します。
    • たとえば、常に', '、しかし決して','
  • split()POSIX正規表現(非推奨)を使用しているため、使用しないでください。
  • preg_split()パターンとして正規表現を使用します; そして、したがって、より多くの状況を受け入れますexplode()


次に:単一のデータベース列に複数の値を格納しないでください:それを使用して何らかの有用な作業を行うことは不可能です!

これらのデータを格納するために、行ごとに1つの値を使用して、最初のテーブルの1行に対応する複数の行を持つ別のテーブルを作成します。

于 2011-03-25T18:34:34.203 に答える
0

あなたの問題はPHPよりもSQLにあると思います。

技術的には、IDを単一のMySQLフィールドの「set」フィールドに格納し、条件でINまたはFIND_IN_SETを使用してそれに対してクエリを実行できます。ルックアップは実際には超高速ですが、これはベストプラクティスとは見なされず、非正規化されたデータベースを作成します。

ネストの実践であり、正規化されているのは、個別の関係テーブルを作成することです。したがって、メッセージの例を使用すると、ユーザー間でメッセージを関連付けるための「users」テーブル、「messages」テーブル、および「users_messages」テーブルが作成される可能性があります。'messages'テーブルには、メッセージ情報と、元の送信者の'user_id'フィールドが含まれます(1つしかないため)。'users_messages'テーブルには、'user_id'および'message_id'フィールドが含まれます。メッセージを所属するさまざまなユーザーにリンクする行。次に、JOINクエリを使用してデータを取得する必要があるため、ユーザーの受信トレイを取得する場合、クエリは次のようになります。

SELECT
    messages.*
FROM
    messages
    LEFT JOIN users_messages ON users_messages.message_id = messages.message_id
WHERE
    users_messages.user_id = '(some user id)'
于 2011-03-25T18:57:49.203 に答える