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:

    id  firstname        lastname        company
    1   user1_firstname  user1_lastname  company_user1
    2   user2_firstname  user2_lastname  company_user2


Tabel messages

    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

    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

    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:

<?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:

    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:

    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?
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.
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.
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 :-)

@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:


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.
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.
[code]
Hier HTML
<?php
// Hier PHP code
?>
// Hier nog wat HTML
[/code]

Resulteert in:

Hier HTML
<?php 
// Hier PHP code
?>
// Hier nog wat HTML

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...

[size=xsmall]Toevoeging op 21/12/2016 22:52:44:[/size]

HTML heb ik wel aangeduid in het begin met <!-- HTML code comments -->? Misschien is het dat?
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.
Thanks Ariën ;-)

[size=xsmall]Toevoeging op 22/12/2016 14:38:16:[/size]

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?


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:

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?

Reageren