php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.12.2008, 21:45  
Neuer Benutzer
 
Registriert seit: 21.12.2008
Beiträge: 29
mygov befindet sich auf einem aufstrebenden Ast
Standard zwei while schleifen mit unterschiedlichen mysql tabellen

Hallo!
Ich habe hier ein kleines Problemchen. Und zwar habe ich hier eine while schleife die aus der mysql tabelle "work_articlearea" die gesamten daten anzeigt (id, titel, beschreibung und aufwand) die zweite while schleife soll aus der tabelle "work_articlestatus" den status des aktuell eingeloggten users ($username) auslesen. Nun habe ich aber das große Problem das diese zwei while schleifen überhaupt nicht miteinander harmonieren, wie kann ich das besser machen so das es funktioniert...

Hier mein code & die mysql tabellen:

work_articlearea
ID, TITEL, BESCHREIBUNG, AUFWAND
1, Testartikel 1, die beschreibung für Artikel 1, L
2, Testartikel 2, die beschreibung für Artikel 2, XXL

work_articlestatus
EVENTID, USERNAME, STATUS
2, benutzername1, wait
1, benutzername2, declined
1, benutzername1, accepted
2, benutzername2, wait

PHP-Code:
<?php
$sql 
mysql_query ("SELECT id, titel, beschreibung, aufwand, gebuchtvon, status FROM work_articlearea"); 
$sql1 mysql_query ("SELECT eventid, username, status FROM work_articlestatus");
?>
        <table width="787" border="0">
          <tr>
            <td width="39" align="center"><strong>ID</strong></td>
            <td width="113" align="center"><strong>Titel</strong></td>
            <td width="401" align="center"><strong>Beschreibung</strong></td>
            <td width="58" align="center"><strong>Aufwand</strong></td>
            <td width="95" align="center"><strong>Gebucht von</strong></td>
            <td width="55" align="center"><strong>Buchen?</strong></td>
          </tr><?php while ($adr mysql_fetch_array($sql)) { ?>
          <?php $dbarray $adr['status']; ?>
          <tr>
            <td align="left" bgcolor="#CCCCCC"><?=$adr['id']?></td>
            <td align="left" bgcolor="#CCCCCC"><strong><?=$adr['titel']?></strong></td>
            <td align="left" bgcolor="#CCCCCC"><?=$adr['beschreibung']?></td>
            <td bgcolor="#CCCCCC"><?=$adr['aufwand']?></td>
            <?php }?>
            <?php while ($adr1 mysql_fetch_array($sql1)) {?>
            <td bgcolor="#CCCCCC"><?php for($i=0$i count($dbarray); $i++) { echo $dbarray[$i] . "<br>"; } ?></td>
            <td bgcolor="#CCCCCC"><?php if (($adr1['status']) == "wait") { echo '<img src="img/adm/waiting.png" alt="assignment not confirmed yet" width="25" height="25" border="0" />'; } if (($adr1['status']) == "accepted") { echo '<img src="img/adm/accepted.png" alt="assignment confirmed" width="25" height="25" border="0" />'; } if (($adr1['status']) == "declined") { echo '<img src="img/adm/declined.png" alt="assignment was denied" width="25" height="25" border="0" />'; } if (empty($adr1['status'])) { echo "<a href=\"".$PHP_SELF."?action=add&amp;id=".$adr['id']."\"><img src=\"img/adm/booking.png\" alt=\"assignment possible\" width=\"25\" height=\"25\" border=\"0\" /></a>"; }?></td>
          </tr>
          <?php }?>

Bei den Icons unten habe ich auch das Problem, das er wenn kein status gesetzt ist <a href=\"".$PHP_SELF."?action=add&amp;id=".$adr['id']."\"><img src=\"img/adm/booking.png\" alt=\"assignment possible\" width=\"25\" height=\"25\" border=\"0\" /></a> anzeigen soll, doch $adr['id'] wird aber mit der ersten while schleife übergeben

Vielen dank für die Hilfe und ein ruten rutsch ins neue Jahr
mygov ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.12.2008, 21:49  
Erfahrener Benutzer
 
Registriert seit: 14.08.2008
Beiträge: 157
Hexe befindet sich auf einem aufstrebenden Ast
Standard

Das geht in einer Abfrage. Schau dir JOINs an.
Hexe ist offline  
Alt 27.12.2008, 22:26  
Neuer Benutzer
 
Registriert seit: 21.12.2008
Beiträge: 29
mygov befindet sich auf einem aufstrebenden Ast
Standard

hmm, wenn ich

select * from work_articlearea LEFT JOIN work_articlestatus ON work_articlearea.id=work_articlestatus.eventid

als mysql abfrage nehme, dann listet er mir aber alle artikel zwei mal auf (ingesammte anzahl der eingetragenen user), dies will ich aber nicht er soll den artikel nur einmal auflisten und bei Gebucht von die jenigen anzeigen die den status "accepted" haben...


Titel Beschreibung Aufwand Gebucht von Buchen?
1 testartikel 1 blablanr1 XXL w assignment possible
1 testartikel 1 blablanr1 XXL w assignment possible
2 testartikel 2 blablanr2 L w assignment possible
2 testartikel 2 blablanr2 L w assignment possible
mygov ist offline  
Alt 27.12.2008, 22:44  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

siehe Gruppenbruch (Standardverfahren - PHP.de Wiki)
Im Forum wurde auch schon eine Lösung mit GROUP_CONCAT() vorgeschlagen. Wenn Du das verwenden willst, achte unbedingt auf die Beschreibung der Wirkung von group_concat_max_len und max_allowed_packet.
David ist offline  
Alt 28.12.2008, 17:37  
Neuer Benutzer
 
Registriert seit: 21.12.2008
Beiträge: 29
mygov befindet sich auf einem aufstrebenden Ast
Standard

hi, so nun habe ich

SELECT * FROM work_articlearea LEFT JOIN work_articlestatus ON work_articlearea.id=work_articlestatus.eventid GROUP BY eventid

daraus gemacht

d.h. nun sieht es so aus (in der mysql ausgabe ist folgendes)

id titel beschreibung aufwand gebuchtvon stat eventid username status
1 testartikel 1 Blablab lbd klaj dbnksdfjsdbo ijhdskjfhsfd XXL mygov,test,abc,asdf,rofl,lol,puff,tuff,mau 1 test wait
2 testartikel 2 das ist die zweite beschreibung die es gibt und es... L 2 mygov wait
3 Testartikel 3 Blabla usw... b labla asdjadhf XXL 3 mygov wait


hier sieht man schon das er nicht alle user auflistet die eigl. für das jeweilige event eingetragen sind...

Wenn ich aber
SELECT * FROM work_articlearea LEFT JOIN work_articlestatus ON work_articlearea.id=work_articlestatus.eventid GROUP BY eventid,username,status

nehme zeigt er mir

id titel beschreibung aufwand gebuchtvon stat eventid username status
1 testartikel 1 Blablab lbd klaj dbnksdfjsdbo ijhdskjfhsfd XXL mygov,test,abc,asdf,rofl,lol,puff,tuff,mau 1 manu wait
1 testartikel 1 Blablab lbd klaj dbnksdfjsdbo ijhdskjfhsfd XXL mygov,test,abc,asdf,rofl,lol,puff,tuff,mau 1 mygov wait
1 testartikel 1 Blablab lbd klaj dbnksdfjsdbo ijhdskjfhsfd XXL mygov,test,abc,asdf,rofl,lol,puff,tuff,mau 1 test wait
2 testartikel 2 das ist die zweite beschreibung die es gibt und es... L 2 mygov wait
2 testartikel 2 das ist die zweite beschreibung die es gibt und es... L 2 test wait
3 Testartikel 3 Blabla usw... b labla asdjadhf XXL 3 mygov wait

an, hier werden zwar alle user aufgelistet, nur unten würde er dann auch wieder die artikel halt zwei mal hinschreiben (die anzahl der eingetragenen user)...

Ein teufelskreis

PHP-Code:
 <?php
$sql 
mysql_query ("SELECT * FROM work_articlearea LEFT JOIN work_articlestatus ON work_articlearea.id=work_articlestatus.eventid GROUP BY eventid");
?>
        <table width="787" border="0">
          <tr>
            <td width="39" align="center"><strong>ID</strong></td>
            <td width="113" align="center"><strong>Titel</strong></td>
            <td width="401" align="center"><strong>Beschreibung</strong></td>
            <td width="58" align="center"><strong>Aufwand</strong></td>
            <td width="95" align="center"><strong>Gebucht von</strong></td>
            <td width="55" align="center"><strong>Buchen?</strong></td>
          </tr>
          <?php while ($adr mysql_fetch_array($sql)) { ?>
          <?php $dbarray $adr['username'];?>
          <tr>
            <td align="left" bgcolor="#CCCCCC"><?=$adr['id']?></td>
            <td align="left" bgcolor="#CCCCCC"><strong><?=$adr['titel']?></strong></td>
            <td align="left" bgcolor="#CCCCCC"><?=$adr['beschreibung']?></td>
            <td bgcolor="#CCCCCC"><?=$adr['aufwand']?></td>
            <td bgcolor="#CCCCCC">[color="Red"]<?=$adr['username']?>[/color]</td>
            <td bgcolor="#CCCCCC">[color="Lime"]<?php if (($adr['status']) == "wait") { echo '<img src="img/adm/waiting.png" alt="assignment not confirmed yet" width="25" height="25" border="0" />'; } if (($adr['status']) == "accepted") { echo '<img src="img/adm/accepted.png" alt="assignment confirmed" width="25" height="25" border="0" />'; } if (($adr['status']) == "declined") { echo '<img src="img/adm/declined.png" alt="assignment was denied" width="25" height="25" border="0" />'; } if (empty($adr['status'])) { echo "<a href=\"".$PHP_SELF."?action=add&amp;id=".$adr['id']."\"><img src=\"img/adm/booking.png\" alt=\"assignment possible\" width=\"25\" height=\"25\" border=\"0\" /></a>"; }?>[/color]</td>
          </tr>
          <?php }?>
        </table>
Jetzt werden die Artikel, richtig aufgelistet nur wie kann ich nun bei der tabelle "gebucht von" (rot markiert [color="Red"] ) nun alle die in der tabelle mit der eventid (1 oder 2 oder 3 ...) haben anzeigen? Er zeigt immer nur jeweils einen an.

Meine zweite Frage ist wie ich das status icon richtig anzeigen soll(grün markiert [color="Lime"]), er soll den status ja jeweils vom "status" Feld auslesen und für den Wert wait = grauen punkt, accepted = grünen Punkt und wenn kein status gesetzt dann soll der pfeil kommen den man anklicken kann um sich ins event reinzuschreiben (if (empty($adr['status'])) { echo "<a href=\"".$PHP_SELF."?action=add&amp;id=".$adr['id']."\"><img src=\"img/adm/booking.png\" alt=\"assignment possible\" width=\"25\" height=\"25\" border=\"0\" />)
Nun zeigt er z.b. wenn sich der user1 eingetragen hat und sich der user2 einloggt trotzdem den status wait an obwohl ja user2 garnicht eingetragen ist...

So sieht es quasi nun aus

1 testartikel 1 Blablab lbd klaj dbnksdfjsdbo ijhdskjfhsfd XXL test assignment not confirmed yet(status=wait)
2 testartikel 2 das ist die zweite beschreibung die es gibt und es wird so ein das die laufzeit der computer total �berlaufen ist usw... L mygov assignment not confirmed yet(status=wait)
3 Testartikel 3 Blabla usw... b labla asdjadhf XXL mygov assignment not confirmed yet(status=wait)

er zeigt komischerweise auch bei dem dritten Artikel (Testartikel 3) den status wait an obwohl der user nicht eingetragen ist...


THX!
mygov ist offline  
Alt 28.12.2008, 18:58  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Mal sehen, ob ich das Ziel überhaupt richtig verstanden habe.

Zu jedem Eintrag in work_articlearea kann es in work_articlestatus
  1. für (potentiell) jeden Benutzer genau einen Datensatz geben
  2. beliebig viele (max. siehe #1) Einträge mit status=wait oder status=declined geben
  3. genau einen Eintrag mit status=accepted geben. Dann haben alle anderen zugehörigen Einträge (für die anderen Nutzer) status=declined
Du willst für einen bestimmten Benutzer alle Einträge aus work_articlearea anzeigen mit dem jeweiligen Status für den Benutzer.
Für Deine Beispieldaten
Zitat:
work_articlearea
ID, TITEL, BESCHREIBUNG, AUFWAND
1, Testartikel 1, die beschreibung für Artikel 1, L
2, Testartikel 2, die beschreibung für Artikel 2, XXL

work_articlestatus
EVENTID, USERNAME, STATUS
2, benutzername1, wait
1, benutzername2, declined
1, benutzername1, accepted
2, benutzername2, wait
ergibt sich für benutzername2 und Testartikel1 die Ausgabe
Testartikel 1, gebucht von benutzername1, declined

Stimmt das so?
David ist offline  
Alt 28.12.2008, 19:46  
Neuer Benutzer
 
Registriert seit: 21.12.2008
Beiträge: 29
mygov befindet sich auf einem aufstrebenden Ast
Standard

Genau so. Es gibt unterschiedliche user, diese können sich zu events einschreiben, dies wird in der tabelle work_articlestatus gespeichert also der artikel in den er sich einschreiben möchte/der jeweilige Benutzername und der status (immer status wait, ein admin kann den status auf accepted setzen) dann wird er bei gebucht von: angezeigt.

Es sollen sich auch mehrere user zu einem event eintragen und es können auch mehrere accepted werden.

Der status des jeweiligen users soll jeweils mit dem icon angezeigt werden (wait,accepted,declined oder er kann sich halt eintragen wenn er möchte).

in work_articlearea werden die jeweiligen artikel gespeichert und sollen dann aufgelistet werden, so wie du geschrieben hattest.
mygov ist offline  
Alt 28.12.2008, 22:53  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Ah, also doch nicht "genau so".
Das
Zitat:
Zitat von David
genau einen Eintrag mit status=accepted geben. Dann haben alle anderen zugehörigen Einträge (für die anderen Nutzer) status=declined
passt nicht zu
Zitat:
Zitat von mygov
und es können auch mehrere accepted werden.
.
Was genau willst Du dann in der Spalte Gebucht von anzeigen?
David ist offline  
Alt 29.12.2008, 00:04  
Neuer Benutzer
 
Registriert seit: 21.12.2008
Beiträge: 29
mygov befindet sich auf einem aufstrebenden Ast
Standard

Das gebuchtvon, war mal eine temporäre geschichte. Im Prinzip sollte es so sein das er schaut ob man selbst (eingeloggter user) den Status accepted hat, wenn ja soll er bei gebucht von erscheinen (so das auch alle anderen user das sehen). Dies natürlich mit allen eingetragenen Artikeln...

Die zweite Geschichte ist das mit dem icon, das er den richtigen Status des users für die jeweiligen Artikel ermittelt und halt den passenden Status in Form des icons wiederspiegelt. Wobei ich auch erstmal froh währe wenn er den richtigen Status ausgeben würde

Währe für jeden Ansatz dankbar!
mygov ist offline  
Alt 29.12.2008, 00:39  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Eine mögliche Lösung mit MySQL ist
Code:
SELECT
  a.ID, a.TITEL, a.BESCHREIBUNG, a.AUFWAND,
  (
    SELECT
      GROUP_CONCAT(accepted.USERNAME)
    FROM
      work_articlestatus as accepted
    WHERE
      a.ID = accepted.EVENTID
      AND accepted.STATUS = 'accepted'
  ) as accepted_users,
  (
    SELECT
      s.STATUS
    FROM
      work_articlestatus as s
    WHERE
      a.ID = S.EVENTID
      AND s.USERNAME = 'benutzername2'
  ) as user_status
FROM
  work_articlearea as a
GROUP BY
  a.ID
Dazu muss Deine MySQL Version Subqueries unterstützen (Version >= 4.1.x) und Du solltest Dir die Beschreibung der Wirkung von group_concat_max_len und max_allowed_packet unter MySQL :: MySQL 5.1 Reference Manual :: 11.12.1 GROUP BY (Aggregate) Functions durchlesen.
Außerdem solltest Du Dir mit EXPLAIN anschauen, ob MySQL passende Indizes findet.

edit: benutzername2 musst Du natürlich durch den entsprechenden Namen ersetzen.

Geändert von David (29.12.2008 um 03:37 Uhr).
David ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySql Suche über verschiedene Tabellen - Ergebnis dabei reduzieren padrone Datenbanken 0 04.11.2008 18:43
[Erledigt] If in einer While schleifen RedDragon PHP Tipps 2008 16 20.07.2008 20:02
PHP Array in MYSQL Tabellen schreiben Matt Datenbanken 1 26.02.2008 19:43
von mysql tabellen die größe in bytes von bestimmten zeilen Blank Datenbanken 5 07.08.2006 15:40
HTML und while schleifen. vale PHP Tipps 2006 1 17.06.2006 21:08
[Erledigt] MYSQL Tabellen konvertieren. Datenbanken 1 11.04.2006 08:16
MySQL Server startet nicht mehr richtig... Datenbanken 16 03.03.2006 19:40
[Erledigt] MySQL Abfrage über mehrere Tabellen [Erledigt] Datenbanken 2 14.10.2005 13:37
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
While Schleifen Problem PHP Tipps 2005 9 22.05.2005 22:35
[Erledigt] MySQL Abfrage aus mehreren Tabellen Datenbanken 1 12.04.2005 17:53
mehrere mySql tabellen freitz PHP Tipps 2005 1 02.02.2005 18:08
while schleifen ($dsatz=mysql_fetch_assoc($abfrage1) stefan-miti PHP Tipps 2004 5 23.09.2004 20:46
Über PHP Script 2 MySQL Tabellen abgleichen PHP Tipps 2004 0 20.09.2004 09:32
MySQL DB Tabellen Kommentar abfragen Datenbanken 3 13.06.2004 22:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql while schleife, mysql schleifen, while mysql, mysql while, http://www.php.de/php-einsteiger/50126-zwei-while-schleifen-mit-unterschiedlichen-mysql-tabellen.html, php mysql zwei while schleifen, whileschleife in whileschleife, mysql, 2 while schleifen php mysql, while schleife für mysql abfrage php, mysql select in for schleife, php zwei schleifen while, mssql tablelle schleifen, mysql tabelle in while schleife, mehrere while, php mysql while in while schleife, mysql select in while schleife, php mysql select in while schleife, mysql 2 while schleifen, while schleife mysql, aufwand while schleife

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum