Jonny F.: Generierte Tabelle wird verschben angezeigt

Hallo selfhtmler,

  
$countCO=0;  
 while($datenarray = mysql_fetch_array($meintableresult, MYSQL_ASSOC) or die (mysql_error())){  
 echo "<tr>";  
        foreach($_SESSION['tablecolallpc'] AS $cols){  
         switch($cols){  
	 case "Computername":  
                echo $tdmaintable.$datenarray['Computername']."<td>";  
                break;  
	 case "Benutzername":  
                echo $tdmaintable.$datenarray['User_ID']."<td>";  
                break;  
          case "Abteilung":  
                echo $tdmaintable.$datenarray['Abteilung']."<td>";  
                break;  
          case "Inventarnummer":  
                echo $tdmaintable.$datenarray['Inventarnummer']."<td>";  
                break;  
          case "Aktuelle Kostenstelle":  
                echo $tdmaintable.$datenarray['aktuelle_Kostenstelle'].<td>";  
                break;  
          case "Alte Kostenstelle":  
                echo $tdmaintable.$datenarray['alte_Kostenstelle']."<td>";  
                break;  
          case "Seriennummer":  
                echo $tdmaintable.$datenarray['SSN_change']."<td>";  
                break;  
          case "Anschaffungsdatum":  
                 echo $tdmaintable.$datenarray['Anschaffungsdatum']."<td>";  
                break;  
          case "letzte aenderung":  
                echo $tdmaintable.$datenarray['letzte_aenderung']."<td>";  
                break;  
          case "MAC Adresse":  
                 echo $tdmaintable.$datenarray['MAC_Adresse']."<td>";  
                break;  
          case "Netzwerkdose":  
                 echo $tdmaintable.$datenarray['Netzwerkdose']."<td>";  
                break;  
          case "Seriennummer OCs":  
                 echo $tdmaintable.$datenarray['SSN']."<td>";  
                break;  
          case "Telefondose":  
                 echo $tdmaintable.$datenarray['Telefondose']."<td>";  
                break;  
          case "Telefonverteiler":  
                 echo $tdmaintable.$datenarray['Telefonverteiler']."<td>";  
                break;  
          default:  echo $tdmaintable."Kein eintrag vorhanden<td>";  
          break;  
  
       }  
      }  
  
      echo "<td></td>";  
      echo "<td></td>";  
      echo "<td></td>";  
      echo "</tr>";  
      $countCO++;  
 }  

$_SESSION['tablecolallpc'] in diesem array sind die Spaltennamen enthalten die man sich über ein Listenfeld generieren kann.

So jetzt zu meiner Frage, weiß jemand von euch warum eine Spalte beschrieben ist und die darauffolgende leer bleibt. Ich blicke wirklich nicht warum.

Wenn ich nur die Oberen spalten generiere funktioniert es, also vermute ich dass es hieran liegen muss.

Ich hoffe mal jemand von euch fällt was auf.

Gruß Jonny F.

  1. Was in deinen Daten steht weiß ich ja nicht.
    Aber nachdem du das so schön farblich formatieren lassen hast, fällt mir auf dass da ab der Zeile
    case "Aktuelle Kostenstelle":
    was anders ist. Und zwar fehlt in der darauffolgenden Zeile das öffnende " vor <td>.
    Und irgendwie fehlt das schließende </td>. Müsste das nicht so aussehen?
    echo "<td>" . $tdmaintable.... ."</td>";

    1. Was in deinen Daten steht weiß ich ja nicht.
      Aber nachdem du das so schön farblich formatieren lassen hast, fällt mir auf dass da ab der Zeile
      case "Aktuelle Kostenstelle":
      was anders ist. Und zwar fehlt in der darauffolgenden Zeile das öffnende " vor <td>.
      Und irgendwie fehlt das schließende </td>. Müsste das nicht so aussehen?
      echo "<td>" . $tdmaintable.... ."</td>";

        
        case "Aktuelle Kostenstelle":  
                      echo $tdmaintable.$datenarray['aktuelle_Kostenstelle'].<td>";  
                      break;  
      
      

      hier hast du vollkommend recht, das " vor dem eigentlich schließenden </td> habe ich vergessen, dochin der variable $tdmaintable ist das öffnende td drinne :D

      hätte ich vielleicht erwähnen sollen

      Gruß Jonny F.

      1. hier hast du vollkommend recht, das " vor dem eigentlich schließenden </td> habe ich vergessen

        Dann greift vielleicht meine zweite Idee, dass das was du hier "schließendes </td>" nennst, bei dir ein öffnendes ist?

  2. Ich Blindfisch, habe jeweils nur vergessen die <td> tags zuzumachen.

    Gruß Jonny F.

  3. Hello Jonny,

    den gesuchten Fehler hast Du ja schon gefunden. Gut!

    Aber Dein Script weist noch ein paar andere Feherl auf. Wenn Du unbekannte Textinhalte, also solche, die irgendwie von Benutzern beeinflusst werden können, in einer HTML-Umgebung ausgeben willst, dann solltest Du sie auch auf diese Umgebung vorbereiten. Anderenfalls könnte auch in diesen Inhalten HTML, JavaScript oder sonstiges mit Steuerwirkung versteckt sein und dann Deine ganze Seite zerschießen.

    Lies Dir mal den Artikel http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/ durch.

    Außerdem würde ich Dir empfehlen, solange Du nicht an absoluter Speicherknappheit leidest, Deine Scripte zumindest nach dem EVA-Prinzip (als Verwandter vom MVC) aufzubauen.

    Eingabe:      Daten beschaffen, SQL-Abfrage
    Verarbeitung: Daten behandeln, berechnen, aufbereiten
    Ausgabe:      Daten ausgeben.

    Und die Schleife

    while($datenarray = mysql_fetch_array($meintableresult, MYSQL_ASSOC) or die (mysql_error()))
       {
       }

    ist äußerst ungesund aufgebaut. Sie endet immer mit dem Tode des Scriptes, obwohl doch hier überhaupt kein MySQL-Error mehr etwas zu suchen hat. Den MySQL-Error fragst Du direkt nach der Datenbaschaffung ab, also nach dem MySQL-Query.

    Hier wird die Ergebnismenge abgearbeitet, die von MySQL bereits an die API (PHP) übergeben wurde, allerdings noch sequentiell vorliegt, also noch nicht als PHP-Array.

    Das die() ist hier also fehlplaziert, zumal es sowieso keine sinnvolle Fehlerbehandlung für ein produktives Script darstellt. Was soll der User in seiner Ausgabe mit dem MySQL-Fehler anfangen? In einer Testumgebung oder für "quick and dirty" kann man es allerdings benutzen...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello Jonny,

      den gesuchten Fehler hast Du ja schon gefunden. Gut!

      Aber Dein Script weist noch ein paar andere Feherl auf. Wenn Du unbekannte Textinhalte, also solche, die irgendwie von Benutzern beeinflusst werden können, in einer HTML-Umgebung ausgeben willst, dann solltest Du sie auch auf diese Umgebung vorbereiten. Anderenfalls könnte auch in diesen Inhalten HTML, JavaScript oder sonstiges mit Steuerwirkung versteckt sein und dann Deine ganze Seite zerschießen.

      Lies Dir mal den Artikel http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/ durch.

      Obwohl es im Intranet ist und eher als steuer bzw. Verwaltungelement darhalten soll, habe ich mir es trotzdem mal Interessehalber angeschaut, danke für die Info gut zu wissen :D

      Außerdem würde ich Dir empfehlen, solange Du nicht an absoluter Speicherknappheit leidest, Deine Scripte zumindest nach dem EVA-Prinzip (als Verwandter vom MVC) aufzubauen.

      Eingabe:      Daten beschaffen, SQL-Abfrage
      Verarbeitung: Daten behandeln, berechnen, aufbereiten
      Ausgabe:      Daten ausgeben.

      Und die Schleife

      while($datenarray = mysql_fetch_array($meintableresult, MYSQL_ASSOC) or die (mysql_error()))
         {
         }

      ist äußerst ungesund aufgebaut. Sie endet immer mit dem Tode des Scriptes, obwohl doch hier überhaupt kein MySQL-Error mehr etwas zu suchen hat. Den MySQL-Error fragst Du direkt nach der Datenbaschaffung ab, also nach dem MySQL-Query.

      Okey mit der Fehlerbehandlung habe ich es wohl noch nicht so drauf :D

      Hier wird die Ergebnismenge abgearbeitet, die von MySQL bereits an die API (PHP) übergeben wurde, allerdings noch sequentiell vorliegt, also noch nicht als PHP-Array.

      Das die() ist hier also fehlplaziert, zumal es sowieso keine sinnvolle Fehlerbehandlung für ein produktives Script darstellt. Was soll der User in seiner Ausgabe mit dem MySQL-Fehler anfangen? In einer Testumgebung oder für "quick and dirty" kann man es allerdings benutzen...

      Ja ich denke mal jetzt zum Coden alles drauf was geht, dann wenn es benutzt wird nur das nötigste oder hab ich da was falsches ausgewertet :D

      Gruß Jonny F.

      1. Hello,

        Die Schleife

        while($datenarray = mysql_fetch_array($meintableresult, MYSQL_ASSOC) or die (mysql_error()))
           {
           }

        ist äußerst ungesund aufgebaut. Sie endet immer mit dem Tode des Scriptes, obwohl doch hier überhaupt kein MySQL-Error mehr etwas zu suchen hat. Den MySQL-Error fragst Du direkt nach der Datenbaschaffung ab, also nach dem MySQL-Query.

        Okey mit der Fehlerbehandlung habe ich es wohl noch nicht so drauf :D

        Ja ich denke mal jetzt zum Coden alles drauf was geht, dann wenn es benutzt wird nur das nötigste oder hab ich da was falsches ausgewertet :D

        Ja, das 'or die()' ist nach einer Schleife, nach deren Ende das Programm doch weiterlaufen soll, vollkommen fehl am Platze.

        $_liste = array();
           while ($_satz = mysql_fetch_assoc($meintableresult))
           {
              $_liste[] = $_satz;
           }
           mysql_free_result($meintableresult);

        wäre vollkommen hinreichend. Hier würden alle Datensätze der Ergebnismenge aus dem sequentiellen Puffer der API in ein PHP-Array überführt, in dem dann wahlfrei auf jedes Element zugegriffen wrden kann. Anschließend wird der Abfragepuffer freigegeben, was man der Ordnung halber tun sollte, es aber in den meisten Fällen nicht einmal selber machen muss.

        Die Schleife arbeitet solange, wie im Abfragepuffer noch Datensätze vorhanden sind. Der interne Satzzeiger im Puffer wird dabei automatisch bei jedem AUfruf von mysql_fetch_assoc() um eine Position weitergestellt. Wenn er hinter dem letzten Satz angekommen ist, liefert mysql_fetch_assoc() ein 'false' zurück und die Schliefe endet _bestimmungsgemäß_. Das die() wäre jetzt also ganz falsch, weil das Enden der Schleife ja eine positiv vorgesehene Verhaltensweise des Programmes darstellt.

        Das Array $_liste, das nun "zweidimesional" aufgebaut ist, kannst Du dann deiner Ausgabefunktion übergeben, die daraus einen HTML-String mit der Tabelle generiert. Auch dieser String muss nicht sofort ausgegeben werden, sondern kann erst einmal im Speicher vor sich hin gammeln, bis die Ausgabe nach dem EVA-Prinzip generell an der Reihe ist.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. Hi!

        Lies Dir mal den Artikel http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/ durch.
        Obwohl es im Intranet ist und eher als steuer bzw. Verwaltungelement darhalten soll, habe ich mir es trotzdem mal Interessehalber angeschaut, danke für die Info gut zu wissen :D

        Ein Intranet kann kein Freibrief dein, sich Lücken in seinen Anwendungen zu erlauben, denn der "Feind" ist nicht immer nur draußen und kommt garantiert nicht rein.

        Und nicht immer ist es Vorsatz, der Probleme bereitet. Auch das harmlose Verwenden von Zeichen, die in einem anderen Kontext eine Sonderbedeutung haben, und nicht richtig behandelt wurden, kann Fehler verursachen.

        Lo!

        1. Und nicht immer ist es Vorsatz, der Probleme bereitet. Auch das harmlose Verwenden von Zeichen, die in einem anderen Kontext eine Sonderbedeutung haben, und nicht richtig behandelt wurden, kann Fehler verursachen.

          Die Mutter des kleinen Bobby Tables weiss warum.

        2. Und nicht immer ist es Vorsatz, der Probleme bereitet. Auch das harmlose Verwenden von Zeichen, die in einem anderen Kontext eine Sonderbedeutung haben, und nicht richtig behandelt wurden, kann Fehler verursachen.

          Da muss ich dir aber recht geben, wenn man was macht dann gescheit.

          Danke für den Link

          Gruß Jonny F.

  4.   
    $countHl++;  
      echo "<tr".($countHl%2==1?" style='background-color:#F1F5FC;'":"")." onMouseOver=\"this.bgColor='#6E9CE6'\" onMouseOut=\"this.bgColor='".($countHl%2==1?" style='background-color:#F1F5FC;'":"")."'\">";  
    
    

    kann mir jemand sagen warum der fetz nicht funktioniert.
    Dieses Konstrukt ist in einer while-Schleife, es soll die generierten Zeilen abwechselnd farbig hinterlegen. Nebenbei soll es aber auch noch bei einen Mouse-Over die Hintergrundfarbe ändern und beim verlassen wieder zurück setzten.

    Wenn die farbe von einer Zeile einen Farbwert bekommt funktioniert das mosouver auch, nur bei der anderen Zeile der ich keinen Wert zugeweisen habe funktioniert es nicht, auch mit wert hat es nicht funktioniert.

    Ich hoffe ihr ertragt mich noch :D

    Gruß Jonny F.

    1. kann mir jemand sagen warum der fetz nicht funktioniert.

      Weil die Bedingung niemals zutreffen kann.

      X Modulo 2 wird bei der Annahme X sei eine Ganzzahl niemals 1 ergeben.

      btw: von CSS hast du aber schon mal etwas gehört, oder?

      1. Hallo,

        X Modulo 2 wird bei der Annahme X sei eine Ganzzahl niemals 1 ergeben.

        ach, wirklich nicht?

        0 % 2 = 0
           1 % 2 = 1
           2 % 2 = 0
           3 % 2 = 1
             ...

        Ich sehe da einige Fälle, wo x % 2 = 1 ist, nämlich für alle ungeraden Werte von x. Oder woran dachtest du?

        btw: von CSS hast du aber schon mal etwas gehört, oder?

        ;-)

        So long,
         Martin

        --
        "Hier steht, deutsche Wissenschaftler hätten es im Experiment geschafft, die Lichtgeschwindigkeit auf wenige Zentimeter pro Sekunde zu verringern." - "Toll. Steht da auch, wie sie es gemacht haben?" - "Sie haben den Lichtstrahl durch eine Behörde geleitet."
        1. Ich sehe da einige Fälle, wo x % 2 = 1 ist, nämlich für alle ungeraden Werte von x. Oder woran dachtest du?

          Denkfehler, nvm :p

      2. btw: von CSS hast du aber schon mal etwas gehört, oder?

        Natürlich, ohne CSS geht da gar nix mehr, aber bin noch dabei mich 100% rein zu arbeiten.

        Gruß Jonny F.

    2. Mahlzeit Jonny F.,

      $countHl++;
        echo "<tr".($countHl%2==1?" style='background-color:#F1F5FC;'":"")." onMouseOver="this.bgColor='#6E9CE6'" onMouseOut="this.bgColor='".($countHl%2==1?" style='background-color:#F1F5FC;'":"")."'">";

      
      > kann mir jemand sagen warum der fetz nicht funktioniert.  
        
      "Funktioniert nicht" [funktioniert nicht](http://forum.de.selfhtml.org/hilfe/charta.htm#tipps-fuer-fragende).  
        
        
      
      > Dieses Konstrukt ist in einer while-Schleife, es soll die generierten Zeilen abwechselnd farbig hinterlegen.  
        
      Und wenn sich die Farben ändern, dann willst Du Dich jedesmal durch den Programmcode quälen und die x Stellen ändern?  
        
      Sinnvollerweise solltest Du einfach den [ungeraden](http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=on&chinese=both&pinyin=diacritic&search=ungerade&relink=on) Zeilen eine entsprechende semantisch passende Klasse verpassen - den Rest macht CSS dann für Dich:  
        
      ~~~css
      tr.odd {  
        background-color: #F1F5FC;  
      }
      

      Nebenbei soll es aber auch noch bei einen Mouse-Over die Hintergrundfarbe ändern und beim verlassen wieder zurück setzten.

      Vernünftige Browser kennen dafür die Pseudoklasse http://de.selfhtml.org/css/eigenschaften/pseudoformate.htm#link_visited_focus_hover_active@title=:hover, so dass ein simples ...

      tr:hover {  
        background-color: #6E9CE6;  
      }
      

      ... vollkommen ausreicht.

      IrgendEinem Browser musst Du in der Tat mit passenden Javascript-Events auf die Sprünge helfen - aber auch da wäre es erheblich sinnvoller, eine entsprechende http://de.selfhtml.org/javascript/objekte/htmlelemente.htm#universaleigenschaften@title=Klasse zu http://de.selfhtml.org/javascript/sprache/operatoren.htm#zeichenkettenverknuepfung@title=setzen bzw. zu http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=entfernen. Wenn Du dann noch Dein CSS entsprechend erweiterst ...

      tr:hover,  
      tr.hover {  
        background-color: #6E9CE6;  
      }
      

      ... steht einem Browser-übergreifenden Funktionieren nichts mehr im Wege.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|