Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
  Druckansicht

  [PHP] while/if/for-schleifen
Autor Nachricht
    BeitragVerfasst: 16.09.2009 04:06 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Moins,

ich guck grad mal wieder wie "Schwein ins Uhrwerk"....

folgendes:
mein Script fragt eine Datenbank ab nach Jahr und Monat
Code:
$resultt = MYSQL_QUERY("SELECT monat, jahr, datum FROM $tabelle$dbuser WHERE ... ORDER BY ...");

dabei wird logischerweise nur das ausgegeben, was auch in der DB steht. Also wenn $monat vorhanden, dann wird er ausgegeben ($jahr is für mein problem aussen vor).

Code:
while(list($monatt, $jahrr, $datumm) = @mysql_fetch_row($resultt)) {
echo "<a href=\"totalegal\" class=green>".$monatt."</a> ";
}

Ausabge ist zB:
August September Oktober

Nun hätte ich aber gerne, dass die Lücken, also die Monate die nicht vorhanden sind, autom. aufgefüllt werden.

also so dann in der Ausgabe:
Januar Februar März April Mai Juni Juli August September Oktober November Dezember

Um das hin zu bekommen, dachte ich, wäre eine for-Schleife nicht schlecht (okay, basiert auf nem anderen Script ;) )
Also das gebastelt:
Code:
$mntcnt  = mysql_query("select COUNT(DISTINCT monat) FROM $tabelle$dbuser WHERE jahr='$jahr'"); //Zählen wieviele Monate für das $jahr eingetragen sind

list($mcnt) = mysql_fetch_row($mntcnt);

for($kmonat = $mcnt+1; $kmonat <= 12; $kmonat++) {

while(list($monatt, $jahrr, $datumm) = @mysql_fetch_row($resultt)) {
echo "<a href=\"totalegal\" class=green>".$monatt."</a> ";
}

echo strftime("%B", mktime(0, 0, 0, $kmonat, 1, $jahr))." ";
}

Das funktioniert auch prima, aber nur wenn brav der Januar Februar usw aus der DB kommt, dann wird der fehlende Rest hinten angefügt. Fehlt vorne was kommt zuerst was in der DB ist und dann der "Auffüller" (dann noch nicht mal richtig). Ich weiß, dass es an meinem $mcnt liegt. Ich dachte damit kann ich den Startpunkt der Schleife einfach setzen, aber wie gesagt, wenn vorne was fehlt, is das mist. Und ich weiß auch, dass es an der Reihenfolge liegt. Jede andere Konstellation brachte aber ein ähnlich unbefriedigendes Ergebnis. Die for-Schleife in die while-Schleife zu packen ist ne ganz blöde Idee. Genauso die while-Schleife weg zu lassen. Ich finde einfach keine Abgleichmöglichkeit :x

Hat da zufällig wer ne Idee, wie ich das simple abgleichen könnte? Mit If-Schleifen oder sowas?

Komplizierte Stunden-, Schicht- und Zulagenberechnung bekomme ich hin, aber so ne einfachen Sachen net :motz2:

greetz
JMD

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 16.09.2009 09:05 
Moderator
Moderator
Benutzeravatar
Offline

Beiträge: 1533
Registriert: 19.04.2002 01:01
Wohnort: Ulm
Sind die Einträge in der Datenbank denn chronologisch geordnet? Also etwa "Januar, Februar, August, Dezember"? Konnte das aus deiner Beschreibung irgendwie gerade nicht rauslesen ;-)

Wenn ja, wie wäre es dann, wenn du einfach ein "Kontroll-Array" erstellst mit Inhalt "Januar, Februar, März, usw."? Dann könntest du nämlich mit einem Marker immer mitzählen, was der letzte aufgeführte Monat war und wenn du dann einen neuen Datensatz ausliest kannst du mit einer while-Schleife solange "leere" Monate hinzufügen (und den Marker erhöhen), bis Kontroll-Array-Element und Datensatz übereinstimmen.

Keine Ahnung ob das so funktioniert und praktikabel ist - aber so früh am Morgen erscheint mir das sinnvoll :D

________________________
"Ich habe keinen Stil. Ich bin ich." - Helge Schneider


Nach oben
 Profil  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 17.09.2009 02:31 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Nun ja, die Monate werden idR zwar hintereinander eingeben, es kann aber auch sein, dass der März vor dem Januar eingetragen wird - sozusagen. Damit sind sie nicht chronologisch. Doch dem habe ich schon Abhilfe geschaffen. Das MySQL-Query is so aufgebaut, dass die Abfrage "richtig" (Jan, Feb ... ) ausgegeben wird.

Die Monate sind in der Datenbank als Zahl abgelegt (01 = Januar usw) und im Script gibt es ein Array, welches die Monatsnamen beinhaltet.
Code:
$monatzahl = array("01" => "Januar", "02" => "Februar", "03" => "März", "04" => "April", "05" => "Mai", "06" => "Juni", "07" => "Juli", "08" => "August", "09" => "September", "10" => "Oktober", "11" => "November", "12" => "Dezember");

Deiner Idee zufolge, wollte ich die beiden Arrays (das aus dem Script und das aus der DB (mysql_fetch_array();)) miteinander vergleichen array_diff(). Jedoch sind die wohl zu unterschiedlich aufgebaut, das funktioniert nicht.

Dann habe ich es mit einer recht viel versprechenden while-/foreach-Schleifenkombination und meinem Monats-Array probiert
Code:
while ($row = mysql_fetch_array($resultt)) {
foreach ($monatzahl as $key => $val) {
if($row[monat]<=$key) { echo "<font color=#ff0000><i>$row[monat]</i></font> "; } else { echo "$key ";
} }

Das war schonmal gar net so schlecht, jedoch hat er immer das komplette Monatsarray ausgegeben, bis auf den Eintrag der übereinstimmte, diesen dann aber so oft wiederholt bis "12" erreicht war und dann wieder von vorne. Bsp:

DB-Ausgabe hat geschrieben:
01 02 03 04 05 06 07 08 09 10 10 10 01 02 03 04 05 06 07 08 09 10 11 11 01 02 03 04 05 06 07 08 09 10 11 12

In diesem Bsp sind die Monate 10, 11, 12 in der DB enthalten, der Rest nicht.

Hast du vielleicht einen code-snip-beispiel-ansatz für mich?

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 17.09.2009 08:47 
Moderator
Moderator
Benutzeravatar
Offline

Beiträge: 1533
Registriert: 19.04.2002 01:01
Wohnort: Ulm
Mir fällt gerade ein, dass es eigentlich sogar noch einfacher gehen müsste, als ich ursprünglich dachte. Man könnte ja einfach von 1 bis 12 zählen und bei jedem Monat prüfen, ob ein passender Datenbank-Eintrag verfügbar ist. In etwa so:

Code:
$row = mysql_fetch_array($resultt)); // Ersten Datensatz auslesen
for($i=1; $i <= 12; $i++) {
  if($i == $row[monat]){
    echo "<a href=\"totalegal\" class=green>".$row[monat]."</a> ";
    if(! $row = mysql_fetch_array($resultt)) { // Versuche, neuen Eintrag aus DB zu lesen
      $row[monat] = 42; // zeigt an, dass kein weiterer DB-Eintrag exisitiert
    }
  }
  else {
  echo "<span class=red>".$i."</a> ";
  }
}


Habe schon ne Weile nicht mehr richtig in PHP programmiert - gebe also keine Gewähr ob das so funktioniert ;-)

________________________
"Ich habe keinen Stil. Ich bin ich." - Helge Schneider


Nach oben
 Profil  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 17.09.2009 21:47 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Tausend Dank!!! :supi:

greetz
JMD

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 17.09.2009 23:21 
Moderator
Moderator
Benutzeravatar
Offline

Beiträge: 1533
Registriert: 19.04.2002 01:01
Wohnort: Ulm
Bitteschön :)

Nur aus Interesse: Hat es genau so geklappt oder hab ich dich nur zu ner anderen Lösung inspiriert?

________________________
"Ich habe keinen Stil. Ich bin ich." - Helge Schneider


Nach oben
 Profil  
 

  Re: [PHP] while/if/for-schleifen
    BeitragVerfasst: 18.09.2009 04:51 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Hat eigentlich genau so geklappt. Ich hab die Sachen in der Schleife nur noch entsprechend erweitert
Code:
$rowmon = mysql_fetch_array($resultt); // Ersten Datensatz auslesen
for($ki=1; $ki <= 12; $ki++) {
  if($_GET[jahr]) $yearrr = "&jahr=".$_GET[jahr];
   if($_GET[user]) $userrr = "&user=".$_GET[user];
   if($amode) { $amodee = "&amode=view"; $seid = "&sid=".session_id(); }
  if($ki == $rowmon[monat]){
     $kabgl = "$rowmon[monat] $jahr";
     if($kabgl==strftime("%m",mktime(0,0,0,$monat1,1,$jahr))) { $htmlb = "<b>"; $htmlbb = "</b>"; } else { $htmlb = ""; $htmlbb = ""; }
    echo "$htmlb<a href=\"?mon=".$rowmon[monat].$yearrr.$userrr.$amodee.$seid."\">".$monatzahl[$rowmon[monat]]."</a>$htmlbb ";
    if(! $rowmon = mysql_fetch_array($resultt)) { // Versuche, neuen Eintrag aus DB zu lesen
      $rowmon[monat] = 42; // zeigt an, dass kein weiterer DB-Eintrag exisitiert
    }
  }
  else {
  $kmi = str_pad($ki,2,"0",STR_PAD_LEFT);
  $kabgl = "$kmi $jahr";
  if($kabgl==strftime("%m %Y",mktime(0,0,0,$monat1,1))) { $htmlb = "<b>"; $htmlbb = "</b>"; } else { $htmlb = ""; $htmlbb = ""; }
  if($logedin AND $_SESSION['dbsuperuser']==1) { echo "<a class=\"monatunset\" href=\"?doit=neuermonat&mon=".$kmi.$yearrr.$userrr."&sid=".session_id()."\">".$htmlb.$monatzahl[$kmi].$htmlbb."</a> "; }
  else { echo "".$htmlb.$monatzahl[$kmi].$htmlbb." "; }
   }


nochmals besten Dank. An dieser Kleinigkeit habe ich mich ewig aufgehalten :roll:

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


  Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
RSS-Feed
Impressum und Kontakt
Style created by phpBB3 styles , ziola alveo akuna
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Optimized by SEO phpBB
Deutsche Übersetzung durch phpBB.de