Query en PHP voor messaging systeem met sturen en ontvangen van berichten
Nu heb ik een probleem met mijn query en bijhorende output. Zie hieronder.
Tabellen in db:
Tabel users:
Code (php)
1
2
3
2
3
id firstname lastname company
1 user1_firstname user1_lastname company_user1
2 user2_firstname user2_lastname company_user2
1 user1_firstname user1_lastname company_user1
2 user2_firstname user2_lastname company_user2
Tabel messages
Code (php)
1
2
3
4
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
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)
1
2
3
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
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)
1
2
3
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
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)
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
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 } } } ?>
$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)
1
2
3
4
5
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
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)
1
2
3
4
5
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
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 -
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.
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.
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.
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 :-)
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)
1
2
3
4
5
6
7
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
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
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?
@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.
Hier HTML
// Hier nog wat HTML
[/code]
Resulteert in:
Gewijzigd op 21/12/2016 22:35:00 door Frank Nietbelangrijk
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
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 -
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)
1
2
3
4
5
6
7
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?)
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)
1
2
3
4
5
6
7
8
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...
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?
Code (php)
1
2
3
4
5
6
7
8
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
-----
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.
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)
1
2
3
4
5
6
7
8
9
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...
------
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?
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.
Ik ben niet mee met je oplossing om deze te splitsen in aparte "threads"?
Iemand kan toch zowel koper als verkoper zijn? :/
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