DanielQ: Schleife innerhalb Schleife, PHP mysql

Hallo,
ich benötige bitte einmal eure Hilfe. Ich habe eine Tabelle in meiner mysql mit Statistiken. Diese möchte ich nun ausgeben. Im Beispiel hat ein User zwei IDs. Diese gebe ich in einer Schleife aus. Innerhalb der Schleife möchte ich nach Monaten gruppiert die Hits ausgeben.
Das klappt auch soweit. Nur möchte ich für die Monate in denen keine Hits sind einen DIV mit der Zahl "0" anzeigen. Das bekomme ich nicht hin.

  
$query = mysqli_query($db,"SELECT `id`, MONTH(`date`) AS `month`, COUNT(*) AS `quant`  
FROM `statistic` WHERE YEAR(`date`) = '2014' && `k_id` = '12345' group by `id`, `month`");  
  
while($xyz = mysqli_fetch_object($query)) {  
if($old != $xyz->id) {  
if($old=='') {  
    echo '<div class="statistic“>‘.“\n“;  
}  
else {  
    echo '</div>'."\n";  
    echo '<div class="statistic“>‘.“\n“;  
}  
$old = $xyz->id;  
}  
echo '<div class="'.$xyz->month.’“>’.$xyz-> quant.'</div>'."\n";  
}  
  
# Das Ergebnis erhalte ich  
<div class="statistic">  
<div class="month6">11</div>  
<div class="month7">6</div>  
<div class="month8">20</div>  
</div>  
<div class="statistic">  
<div class="month7">1</div>  
<div class="month8">8</div>  
</div>  
  
# So möchte ich es gerne haben  
<div class="statistic">  
<div class="month1">0</div>  
<div class="month2">0</div>  
<div class="month3">0</div>  
<div class="month4">0</div>  
<div class="month5">0</div>  
<div class="month6">11</div>  
<div class="month7">6</div>  
<div class="month8">20</div>  
<div class="month9">0</div>  
<div class="month10">0</div>  
<div class="month11">0</div>  
<div class="month12">0</div>  
</div>  
  
<div class="statistic">  
<div class="month1">0</div>  
<div class="month2">0</div>  
<div class="month3">0</div>  
<div class="month4">0</div>  
<div class="month5">0</div>  
<div class="month6">0</div>  
<div class="month7">1</div>  
<div class="month8">8</div>  
<div class="month9">0</div>  
<div class="month10">0</div>  
<div class="month11">0</div>  
<div class="month12">0</div>  
</div>  

Danke für Tipps

  1. Tach!

    Nur möchte ich für die Monate in denen keine Hits sind einen DIV mit der Zahl "0" anzeigen.

    Wenn keine Daten existieren, ergibt eine Abfrage auch keinen Datensatz dafür. Über nicht vorhandene Datensätze kann man nicht iterieren und dafür was tun. Ohne mir jetzt deinen Code genauer anzuschauen hier ein Vorschlag. Erstell ein Array mit den Monatszahlen als Keys und leerem Inhalt oder der Zahl 0 oder was auch immer du brauchst, um die Ausgabe für nicht vorhandenes zu generieren. Dann kommt deine Datenbankabfrage und überschreibt für die Monate mit existierenden Daten die jeweiligen Einträge im Array. Anschließend kannst du zwecks Ausgabe über das Array laufen und hast für jeden Monat entweder den Defaultwert oder den abgefragten.

    dedlfix.

    1. Tach auch,

      danke, das ist beriete ein sehr guter Tipp. Habe das eingebaut und bekomme aber nur den "ersten" Monat ausgegeben.

        
      $monate = array(1=>1,2=>2,3=>3,4=>4,5=>5,6=>6,7=>7,8=>8,9=>9,10=>10,11=>11,12=>12);  
        
      while($xyz = mysqli_fetch_object($query)) {  
      if($old != $xyz->id) {  
      if($old=='') {  
          echo '<div class="statistic“>‘.“\n“;  
      }  
      else {  
          echo '</div>'."\n";  
          echo '<div class="statistic“>‘.“\n“;  
      }  
      foreach($monate as $monat)  
        
      if($xyz->monat==$monat) {echo '<div class="month'.$xyz->monat.'">'.$xyz-> quant.'</div>'."\n";}  
      else {echo '<div class="month'.$monat.'">0</div>'."\n";}  
        
      $old = $xyz->id;  
      }  
      }  
      
      
        
      <div class="statistic">  
      <div class="month1">0</div>  
      <div class="month2">0</div>  
      <div class="month3">0</div>  
      <div class="month4">0</div>  
      <div class="month5">0</div>  
      <div class="month6">11</div>  
      <div class="month7">0</div>  
      <div class="month8">0</div>  
      <div class="month9">0</div>  
      <div class="month10">0</div>  
      <div class="month11">0</div>  
      <div class="month12">0</div>  
      </div>  
      <div class="statistic">  
      <div class="month1">0</div>  
      <div class="month2">0</div>  
      <div class="month3">0</div>  
      <div class="month4">0</div>  
      <div class="month5">0</div>  
      <div class="month6">0</div>  
      <div class="month7">1</div>  
      <div class="month8">0</div>  
      <div class="month9">0</div>  
      <div class="month10">0</div>  
      <div class="month11">0</div>  
      <div class="month12">0</div>  
      </div>  
      
      
      1. Tach!

        danke, das ist beriete ein sehr guter Tipp. Habe das eingebaut und bekomme aber nur den "ersten" Monat ausgegeben.

        Wende das EVA-Prinzip an. Eingabe, Verarbeitung, Ausgabe - in der Reihenfolge. In deiner Schleife zur Datenbankabfrage legst du lediglich die dort kommenden Daten in dem Monate-Array ab. Das ist der V-Teil. Im A-Teil läufst du dann über das Monats-Array und schreibst deine Ausgabe.

        dedlfix.

    2. Hallo dedlfix,

      ich sitze nun den ganzen Tag um deinen Tipp umzusetzen-leider erfolglos.
      Ich bekomme einfach die Daten nicht so in eine "Schleife" das ich sie ausgeben kann.

      Freue mich über jeden Ansatz...

      grüße

      Daniel

  2. Lieber DanielQ,

    unabhängig von Deiner PHP-Logik willst Du doch sicherlich keine divitis bekommen, oder? Dein Code schreit geradezu nach einer Liste! Schaue einmal selbst:

    So möchte ich es gerne haben

    <div class="statistic">
    <div class="month1">0</div>
    <div class="month2">0</div>
    <div class="month3">0</div>
    <div class="month4">0</div>
    <div class="month5">0</div>
    <div class="month6">11</div>
    <div class="month7">6</div>
    <div class="month8">20</div>
    <div class="month9">0</div>
    <div class="month10">0</div>
    <div class="month11">0</div>
    <div class="month12">0</div>
    </div>

    <div class="statistic">
    <div class="month1">0</div>
    <div class="month2">0</div>
    <div class="month3">0</div>
    <div class="month4">0</div>
    <div class="month5">0</div>
    <div class="month6">0</div>
    <div class="month7">1</div>
    <div class="month8">8</div>
    <div class="month9">0</div>
    <div class="month10">0</div>
    <div class="month11">0</div>
    <div class="month12">0</div>
    </div>

      
    Also zwei Listen mit "statistic" als Klasse...?  
      
    ~~~html
    <ul class="statistic">  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>11</li>  
        <li>6</li>  
        <li>20</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
    </ul>  
      
    <ul class="statistic">  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>1</li>  
        <li>8</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
        <li>0</li>  
    </ul>
    

    Das Aussehen der jeweiligen <li>-Elemente (es sind offensichtlich immer 12 wegen der 12 Monate eines Jahres, nicht?) kann man mit :nth-child(n) steuern, da braucht es nicht für jeden Monat eine Klasse.

    Danke für Tipps

    Hoffentlich beherzigst Du sie auch.

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Hallo Felix Riesterer,

      vielen Dank für die Tipps. Ob die Ausgabe als Liste oder wie auch immer dargestellt wird spielt keine Rolle. Wichtig ist, dass die Daten ausgegeben werden. Übrigens sind für meinen Fall DIV die sinnvollere Lösung (Statistische Grafiken in unterschiedlicher Höhe).

      Grüße

      Daniel

      1. Lieber DanielQ,

        Ob die Ausgabe als Liste oder wie auch immer dargestellt wird spielt keine Rolle.

        das stimmt nicht. Aus mehreren Gründen. Aber Schüler wissen das ja immer besser...

        Wichtig ist, dass die Daten ausgegeben werden.

        Was eine Binsenweisheit... welchen Sinn sollte sonst das Dokument haben?

        Übrigens sind für meinen Fall DIV die sinnvollere Lösung (Statistische Grafiken in unterschiedlicher Höhe).

        Du irrst. Für die Darstellung ist es völlig Schnuppe, welche Elemente Du wählst. Aus Sicht der Semantik ist es allerdings sehr wesentlich. Ist Dir der Unterschied zwischen Markup (HTML/XHTML) und Darstellung (CSS) bekannt?

        Liebe Grüße,

        Felix Riesterer.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. Lieber Felix Riesterer,

          bitte sei mir -falls du es kannst- doch einfach behilflich und kümmere dich nicht um die Semantik meiner Ausgabe. Ich versichere dir, dass diese im fertigen Script fachlich und sachlich korrekt ist.

          Wichtig ist mir in diesem Post nur die Funktion.

          Viele Grüße

          Daniel

          1. Lieber DanielQ,

            bitte sei mir -falls du es kannst- doch einfach behilflich und kümmere dich nicht um die Semantik meiner Ausgabe.

            woher willst Du so sicher wissen, dass ich Dir in Sachen Semantik nicht behilflich bin und dass Du dort so überhaupt keine Hilfe benötigst? Bist Du dermaßen voll der Über-Checker, der die HTML5-Spec mitgeschrieben hat, dass Du das so sicher sagen kannst?

            Es ist hier gute alte Tradition Leute auf handwerkliche Mängel hinzuweisen, wenn man glaubt, welche gefunden zu haben.

            Ich versichere dir, dass diese im fertigen Script fachlich und sachlich korrekt ist.

            Hmm, warum hast Du dann in Deinem OP eine fachlich mangelhafte Semantik benutzt? Ich unterstelle Dir, dass Du auf Semantik einfach keinen Wert legst, sonst hättest Du auf meinen Einwand völlig anders reagiert...

            Wichtig ist mir in diesem Post nur die Funktion.

            Sicherlich nicht nur in diesem Post. Dir geht es wie den allermeisten Schülern nur darum, dass es "funzt" und chic aussieht. Daher diagnostiziere ich weiterhin divitis acutis.

            Werde glücklich.

            Liebe Grüße,

            Felix Riesterer.

            --
            "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)