Query en PHP voor messaging systeem met sturen en ontvangen van berichten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Brecht S

Brecht S

21/12/2016 12:38:43
Quote Anchor link
Ik ben bezig een messaging systeem te maken voor een soort van webshop. De bedoeling is dat er een verkoper is die zijn product online te koop zet. Dan is er een mogelijke koper die een motivatie moet achterlaten aan de verkoper. Die verkoper zal dan op zijn beurt daarop reacties geven. Er kunnen dus meerdere motivatieberichten zijn van mogelijke kopers waarop de verkoper dan kan reageren.
Nu heb ik een probleem met mijn query en bijhorende output. Zie hieronder.

Tabellen in db:

Tabel users:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
    id  firstname        lastname        company
    1   user1_firstname  user1_lastname  company_user1
    2   user2_firstname  user2_lastname  company_user2


Tabel messages
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    id  userid  motivation                     article_id  date_created
    1   1       Motivation text from buyer 1       1       date_created1
    2   1       Motivation text from buyer 1       1       date_created2
    3   2       Motivation text from buyer 2       1       date_created3


Tabel articles
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
    id  userid  title                explaination                 date_created
    1   3       Title for article 1  explaination for article 1   date_created1
    2   3       Title for article 2  explaination for article 2   date_created2


Tabel messages_sellers
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
    id  userid_buyers  message_id  reaction                         article_id  date_created
    1   1              1           Reaction from seller to buyer 1      1        date_created1
    2   2              2           Reaction from seller to buyer 2      2


Totale code voor de output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
          $article_id
= $_GET['article_id'];
          
          $sql = "
          SELECT
             u.firstname,
             u.lastname,
             u.company,
             m.motivation,
             ms.reaction,
             m.userid as message_id_buyer,
             a.id as article_idx,
             a.explaination,
             a.date_created as datecreated_seller,
             m.id as message_id,
             group_concat(CONCAT(m.motivation, '&&', m.date_created) SEPARATOR '----') as motivations,
             group_concat(CONCAT(ms.reaction, '&&', ms.date_created) SEPARATOR '----') as reactions
          FROM
             messages m
          LEFT JOIN
             articles a
          ON
             a.id = m.article_id
          LEFT JOIN
             users u
          ON
             a.userid = u.id
          LEFT JOIN
             messages_sellers ms
          ON
             ms.message_id = m.id
          WHERE
             m.article_id = '$article_id'
          GROUP BY
             a.id
          ORDER BY
             m.date_created desc
          "
;
          
          $res = mysql_query($sql) or die (mysql_error());
          $num_rows = mysql_num_rows($res);
          
          if($num_rows > 0) {
          
          while($row = mysql_fetch_assoc($res)) {
       ?>
    
            
                  <?php //Explaination from seller for article ?>
                       <article class="review-box clearfix">
                          <div class="rev-content" style="margin-left: -90px !important;">
                             <h3 style="text-transform: none !important;"><?php echo $row['firstname']; ?> <?php echo $row['lastname']; ?> (<?php echo $row['company']; ?>) | <?php echo date('d-m-Y H:i', strtotime($row['datecreated_seller'])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $row['explaination']; ?></p>
                                <a href="?article_id=<?php echo $row['article_idx']; ?>&userid_buyer=<?php echo $row['message_id_buyer']; ?>#add-review" class="theme-button marT10">Post your reaction</a>
                             </div>
                          </div>
                       </article>
                      
                      
                    <?php
                    $motivations
= $row['motivations'];
                    $motivations_array = explode('----',$motivations);

                    if(is_array($motivations_array) && count($motivations_array) > 0 ){
                        
                        foreach($motivations_array as $motivation_name){
                            $arr = explode('&&',$motivation_name);
                            
                            if(!empty($arr[1])){
                    ?>
    
                      
                       <!-- posting motivations -->
                       <article class="review-box clearfix" style="margin-bottom: -5px !important;">
                          <div class="rev-content">
                             <h3 style="text-transform: none !important;">Uw antwoord verstuurd op <?php echo date('d-m-Y H:i', strtotime($arr[1])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $arr[0]; ?></p>
                             </div>
                          </div>
                       </article>
                    
                    <?php } } } ?>
                    
                    
                    
                    
                    <?php
                    $reactions
= $row['reactions'];
                    $reactions_array = explode('----',$reactions);

                    if(is_array($reactions_array) && count($reactions_array) > 0 ){
                        
                        foreach($reactions_array as $reaction_name){
                            $arr2 = explode('&&',$reaction_name);
                            
                            if(!empty($arr2[1])){
                    ?>
    
                      
                       <!-- Posting reactions on motivations -->
                       <article class="review-box clearfix" style="margin-left: -90px !important;">
                          <div class="rev-content">
                             <h3 style="text-transform: none !important;">Uw reactie verstuurd op <?php echo date('d-m-Y H:i', strtotime($arr2[1])); ?></h3>
                             <div class="rev-text">
                                <p><?php echo $arr2[0]; ?></p>
                             </div>
                          </div>
                       </article>
                    
                    <?php } } } ?>


Het resultaat hiervan is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
    Explaination for article seller 1
       motivation message buyer 1 for article seller 1
       motivation message buyer 1 for article seller 1
       reaction back from buyer 1
    reaction seller 1


Maar wat ik uiteindelijk wil bereiken is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
    Explaination for article seller 1
       motivation message buyer 1 for article seller 1
       motivation message buyer 1 for article seller 1
    Reaction seller 1
       reaction back from buyer 1


Iemand die mij hiermee kan helpen?
Gewijzigd op 21/12/2016 22:52:04 door - Ariën -
 
PHP hulp

PHP hulp

24/11/2024 17:15:37
 
Adoptive Solution

Adoptive Solution

21/12/2016 14:29:59
Quote Anchor link
Het zoveelste halfbakken project wat zal stranden.

Als ik je andere topics 's doorblader, is de rode draad dat je niks snapt, met alles spaak loopt, en je vervolgens een nieuw onderwerp start met dezelfde afloop.
 
Thomas van den Heuvel

Thomas van den Heuvel

21/12/2016 15:04:31
Quote Anchor link
Dus een article is een product?

Ook zie ik het verschil niet helemaal tussen messages en messages_sellers? Kun je niet weer een self-referencing tabel maken waarbij in dit geval enkel verkopers kunnen reageren op kopers? Je kunt dan in code schuiven wie kan reageren op wie zonder dat je (elke keer) je database-structuur hoeft aan te passen.
 
Ozzie PHP

Ozzie PHP

21/12/2016 15:51:15
Quote Anchor link
Adoptive Solution op 21/12/2016 14:29:59:
Het zoveelste halfbakken project wat zal stranden.

Als ik je andere topics 's doorblader, is de rode draad dat je niks snapt, met alles spaak loopt, en je vervolgens een nieuw onderwerp start met dezelfde afloop.

Tot zover de motivatie-speech van Adoptive Solution :-)
 
Brecht S

Brecht S

21/12/2016 19:15:16
Quote Anchor link
@Thomas: in tegenstelling tot het andere reeds geposte project heb ik hier wel de mogelijkheid om direct de code aan te passen. Ik ben misschien wel verkeerd begonnen hier.
Ik kan inderdaad wel een self-reference tabel maken voor de messages van de kopers en verkopers. Hoe bouw ik mijn tabellen dan het beste op?
Zie het als een webshop waar kopers kunnen reageren door het plaatsen van een motivatie. Aan de hand daarvan zal de verkoper beslissen aan wie hij het artikel wil weggeven. Het begint altijd met het plaatsen van een artikel en een tekst erbij door de verkopers. De kopers kunnen hierop dan een motivatie plaatsen in de messages tabel. De verkopers kunnen hierop dan antwoorden. Maar een koper kan bvb wel 2 berichten plaatsen als motivatie of als tegenantwoord op de verkopers. Het omgekeerde moet ook mogelijk zijn.
Dus een voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
Uitleg bij artikel verkoper
  Motivatie koper 1 - knop 'reageren'
  Motivatie koper 1 - knop 'reageren'
Reactie op koper 1 door verkoper
  Motivatie koper 2 - knop 'reageren'
Reactie op koper 2 door verkoper
Reactie op koper 2 door verkoper


Begrijp je wat ik met mijn voorbeeld wil duidelijk maken?
Dat is ook de uiteindelijke output structuur die ik wil aanhouden.

Als je bij de kopers zelf gaat inloggen moet hij natuurlijk enkel zijn eigen geposte berichten kunnen zien en de communicatie per artikel (motivatie en reacties) van enkel de artikelen waarop hij heeft gereageerd.
Gewijzigd op 21/12/2016 19:24:17 door Brecht S
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/12/2016 22:28:12
Quote Anchor link
Brecht je bent toch al een tijdje actief op phphulp.nl maar je neemt nog niet de moeite om je code even tussen [code] tags te zetten. Moet ik dan gemotiveerd raken om jouw post te bestuderen?
 
Brecht S

Brecht S

21/12/2016 22:31:38
Quote Anchor link
@Frank: heb ik gedaan maar als je HTML comments zet breekt die de code gewoon af. Ik weet niet hoe dat komt. Ik heb alles geprobeerd om dit goed te krijgen maar het lukt niet.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

21/12/2016 22:33:52
Quote Anchor link
[code]
Hier HTML
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
// Hier PHP code
?>

// Hier nog wat HTML
[/code]

Resulteert in:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
Hier HTML
<?php
// Hier PHP code
?>

// Hier nog wat HTML
Gewijzigd op 21/12/2016 22:35:00 door Frank Nietbelangrijk
 
Brecht S

Brecht S

21/12/2016 22:50:50
Quote Anchor link
Ik krijg dat niet voor elkaar... Hoe doe jij dat? Ik heb een *code* over de hele lijn met mijn code staan en op het einde heb ik */code* staan...

Toevoeging op 21/12/2016 22:52:44:

HTML heb ik wel aangeduid in het begin met <!-- HTML code comments -->? Misschien is het dat?
Gewijzigd op 21/12/2016 22:53:11 door Brecht S
 
- Ariën  -
Beheerder

- Ariën -

21/12/2016 22:55:01
Quote Anchor link
Er ontbrak een PHP-tag (<?php), die zijn verplicht als je PHP-code highlighting wilt.
Dus het is niet direct een fout van Brecht zelf. Niettemin moet wel gekeken worden hoe dit verbeterd kan worden in UBB-parser van PHPhulp.
Inmiddels heb ik die tag dus maar toegevoegd in de posting.
Gewijzigd op 21/12/2016 22:55:24 door - Ariën -
 
Brecht S

Brecht S

21/12/2016 22:56:31
Quote Anchor link
Thanks Ariën ;-)

Toevoeging op 22/12/2016 14:38:16:

Hoe pak ik nu het beste mijn database structuur aan? Is het mogelijk te werken met mijn opgebouwde structuur hieronder? Waar de ??? staan heb ik niet echt een idee wat daar moet komen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
id  user_id  message                              article_id  message_id
1   1        Motivatie 1 op geplaatst artikel 2   2           NULL
2   2        Motivatie 2 op geplaatst artikel 2   2           NULL
3   3        Antwoord 1 op motivatie 1            2           1
4   3        Antwoord 1 op motivatie 2            2           2
5   3        Antwoord 2 op motivatie 1            2           ??? (ik vermoed dat dit 1 moet zijn?)
6   1        Reactie 1 terug op antwoord 1        2           ??? (ik vermoed dat dit 3 moet zijn?)

De uiteindelijk output voor de verkoper zou dan zo moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Omschrijving bij geplaatst artikel 1
  Motivatie 1 op geplaatst artikel 2 (id is 1)
    Antwoord op motivatie 1 (id is 3)
    Antwoord op motivatie 1 (id is 5)
  Reactie op antwoord 1 (id is 6)

Omschrijving bij geplaatst artikel 2
enz...

Voor de kopers zelf beperkt zich dat dan tot enkel de artikelen waar zijzelf hebben op gereageerd.
Is dit allemaal correct wat ik hier schrijf? Of is er een andere manier?
 
Thomas van den Heuvel

Thomas van den Heuvel

22/12/2016 15:35:07
Quote Anchor link
Uhm, ik zou dan eerder zoiets verwachten?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Omschrijving bij geplaatst artikel 1
-----
Motivatie 1 op geplaatst artikel 2
    Antwoord 1 op motivatie 1
        Reactie 1 terug op antwoord 1
    Antwoord 2 op motivatie 1 (*1)
Motivatie 2 op geplaatst artikel 2
    Antwoord 1 op motivatie 2


Zodat het wat meer een boomstructuur volgt en reacties direct volgen na de berichten. Is het trouwens de bedoeling dat alle geïnteresseerden elkaars reacties zien?

Overigens: bij (*1) zou de productverkoper ook kunnen volstaan met het aanpassen van zijn laatste reactie, dan wordt het misschien wat minder rommelig.

Een ding wat je trouwens nog nodig hebt is een manier om na te gaan in welke volgorde je reacties afdrukt. Je zou kunnen volstaan met het bijhouden van een datum+tijd van plaatsing.
 
Brecht S

Brecht S

22/12/2016 16:00:41
Quote Anchor link
Ok, ik kan een date_created toevoegen aan mijn messages tabel met een CURRENT_TIMESTAMP.
Aanpassen van reacties van de productverkoper zou ik niet doen. Het is een soort van over en weer met berichten. Dus je geposte voorbeeld lijkt me ok. Alleen is het wel zo dat er meerdere berichten kunnen zijn van verkopers en kopers achter elkaar. Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
Omschrijving bij geplaatst artikel 1
------
Motivatie 1 op geplaatst artikel 2 door de koper
   Antwoord 1 op motivatie 1 door de verkoper
      Reactie 1 terug op antwoord 1 door de koper
      Reactie 2 terug op antwoord 1 (moet ook kunnen door de koper)
   Antwoord 2 op reactie 1 en 2 door de verkoper
   Antwoord 3 op reactie 1 en 2 door de verkoper (moet ook kunnen)
enz...


De verkoper ziet per geplaatst product zijn reacties (dat kan ik meesturen uit de eerder getoonde tabel met alle geplaatste producten. Daarnaast staan een knop die dan een GET meegeeft).
De kopers zien enkel hun eigen geplaatste conversaties met de verkopers en dus niet van elkaar per product. Ook terug via die overzichttabel en dan de knop die een GET zal meegeven in de URL.
Is mijn database structuur dan juist? Ook waar die vraagtekens staan?

Toevoeging op 22/12/2016 19:58:36:

Ik heb ondertussen een mysql InnoDb tabel gemaakt voor de nieuwe structuur messages.
Daarin heb ik een index gezet op message_id en dan een FOREIGN KEY op message_id naar id.
Denk dat dit correct is? Kan je mij even helpen hier met de query en de output ervan zoals in het voorbeeld?
 
Thomas van den Heuvel

Thomas van den Heuvel

23/12/2016 14:47:49
Quote Anchor link
Quote:
De kopers zien enkel hun eigen geplaatste conversaties met de verkopers en dus niet van elkaar per product.

Dan hangt de informatie die je ophaalt af van het type gebruiker. En dan wordt het op voorhand ook wat lastiger om de juiste reacties van de verkoper te tonen bij de juiste koper, dit staat namelijk niet op voorhand vast maar hangt af van de persoon waar de verkoper op reageert. In dat opzicht is het misschien makkelijker om deze "threads" te splitsen in aparte conversaties tussen verkoper X en koper Y, en daar dan alles aan op te hangen?

Trouwens, de inhoud van bovenstaande quote bepaalt sterk de vorm van de oplossing. Daarom is het ook zaak dat er eerst een duidelijke (en volledige) specificatie is (nog) voordat je iets gaat bouwen.
 
Brecht S

Brecht S

23/12/2016 20:29:55
Quote Anchor link
Ik kan in de users tabel wel een extra veld zetten of ze koper of verkoper zijn? Iedereen die iets wil achterlaten van bericht moet toch ingelogged zijn. Dus dit is op te lossen. Ik heb een userid en een artikel_id die ik kan meesturen in een GET. Iedereen die is ingelogged krijg een cookie met user_id en type (verkoper of koper) dan.

Ik ben niet mee met je oplossing om deze te splitsen in aparte "threads"?
 
Thomas van den Heuvel

Thomas van den Heuvel

23/12/2016 21:04:49
Quote Anchor link
Iemand kan toch zowel koper als verkoper zijn? :/
 
Brecht S

Brecht S

23/12/2016 21:12:23
Quote Anchor link
Nee, hiervoor is een andere login nodig. Iemand kan met zijn emailadres als koper/verkoper slechts 1 account aanmaken. Dus als iemand koper is geregistreerd kan die enkel inloggen als koper en als hij ook verkoper wil zijn moet hij een andere account aanmaken.
Login is emailadres die die moet mag maar 1 keer voorkomen in db per type account. Paswoord kan wel hetzelfde zijn.
Gewijzigd op 23/12/2016 21:14:56 door Brecht S
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.