Rick: php: Ternärer Operator gibt immer dasselbe Ergebnis aus

Hallo,

ich habe in einem Tabellekopf eine ternäre Bedingung eingebaut, um diese zu lernen.

echo ("<table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'>
<thead>
<tr>
<td class='head" . ($_SESSION[$db_id]['order'] == 'ID' ? ($_SESSION[$db_id]['ascDESC'] == 'asc' ? ' asc' : ' desc') : '') . ">
usw.

Soll bedeuten, dass in dieser Spalte, falls sie sortiert wurde (dann liegt eine Sessionvariable mit Inhalt Spaltenname vor) eine Klasse asc oder desc angehängt wird, je nachdem, ob asc oder desc Inhalt einer weiteren Sessionvariablen ist.

Das Sortieren funktioniert auch, aber ich erhalten dennoch immer die Klasse 'desc' angehängt.

Was habe ich im ternären Ausdruck falsch gemacht?

Ich weiß, dass man th anstelle td nutzt, sowie html-code nicht in php notieren sollte. Daher meine Bitte, das jetzt mal außen vor zu lassen. Für alle anderen Korrekturen oder Verbesserungsvorschläge bin ich aber offen.

Zusatzfrage:

Wie muss mein css lauten, um ein kleines weißes Dreieck in die sortierte Spalte einizufügen? Hier nur mal einer von unzähligen Versuchen, wie es bei mir nicht geklappt hat.

/* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
.mytable thead .asc:after {
  content: '▲';
}
.mytable thead .desc:after {
  content: '▼';
}

Rick

  1. @@Rick

    echo ("<table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'>
    

    Was hat width='100%' border='0' cellpadding='4' cellspacing='1' im Markup zu suchen? Weg damit! Für die Darstellung ist CSS da.

    <td class='head" . ($_SESSION[$db_id]['order'] == 'ID' ? ($_SESSION[$db_id]['ascDESC'] == 'asc' ? ' asc' : ' desc') : '') . ">
    usw.
    

    Das Sortieren funktioniert auch, aber ich erhalten dennoch immer die Klasse 'desc' angehängt.

    Was habe ich im ternären Ausdruck falsch gemacht?

    Nichts, was zu sehen wäre. Was steht denn in $_SESSION[$db_id]['ascDESC'] drin?

    Ich weiß, dass man th anstelle td nutzt, sowie html-code nicht in php notieren sollte. Daher meine Bitte, das jetzt mal außen vor zu lassen.

    Warum machst du es dann nicht richtig?

    Die Sortierung solltest du mittels aria-sort-Attribut am th(!!)-Element angeben. Eine Klasse brauchst du dann nicht; die Information kannst du auch zum Stylen, d.h. für die Pfeile nutzen.

    Hier nur mal einer von unzähligen Versuchen, wie es bei mir nicht geklappt hat.

    /* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
    .mytable thead .asc:after {
      content: '▲';
    }
    .mytable thead .desc:after {
      content: '▼';
    }
    

    Unzählige Versuche, das mittels Entwicklertool im Browser herauszufinden, hast du aber nicht angestellt? Du hättest darauf kommen können, dass du keine Elemente mit den Klassen asc und desc hast.

    Übrigens schreibt man Pseudoelemente wie ::after mit 2 Doppelpunkten, um sie von Pseudoklassen (mit 1 Doppelpunkt) unterscheiden zu können. (Aus Gründen der Abwärtskompatibilität wird :after weiterhin interpretiert, aber schreiben sollte man das nicht mehr.)

    🖖 Живіть довго і процвітайте

    --
    „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
    1. Hallo Gunnar,

      Was habe ich im ternären Ausdruck falsch gemacht?

      Nichts was zu sehen wäre. Was steht denn in $_SESSION[$db_id]['ascDESC'] drin?

      Gut, dass Du nachfragst.
      Die ist jedesmal korrekt mit 'ASC' oder 'DESC' gefüllt. Grmpf, ich habe nicht auf Gross- und Kleinschreibung geachtet!

      Unzählige Versuche, das mittels Entwicklertool im Browser herauszufinden, hast du aber nicht angestellt? Du hättest darauf kommen können, dass du keine Elemente mit den Klassen asc und desc hast.

      Darauf bin ich gekommen.
      Die Klasse "desc" wurde immer angehängt.

      Übrigens schreibt man Pseudoelemente wie ::after mit 2 Doppelpunkten, um sie von Pseudoklassen (mit 1 Doppelpunkt) unterscheiden zu können. (Aus Gründen der Abwärtskompatibilität wird :after weiterhin interpretiert, aber schreiben sollte man das nicht mehr.)

      Gut zu wissen.

      /* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
      .eingangsRG thead .asc::after {
        content: ' up';
      }
      .eingangsRG thead .desc::after {
        content: ' down';
      }
      

      So wird jetzt korrekt entweder 'up' oder 'down' dahinter geschrieben, aber ich hätte ansich gerne diese Dreiecke gehabt, nur wird daraus bei mir ein Fragezeichen, da ich kein utf-8 nutze.
      Kann ich auch eine Vectorgrafik nutzen?

      Das aria-element schau ich mir auch noch an.

      Rick

  2. Hallo Rick,

    Edit Rolf B: Unsinn ab hier

    Was habe ich im ternären Ausdruck falsch gemacht?

    https://www.php.net/manual/en/language.operators.precedence.php

    . hat höhere Prio als ?: - deswegen lautet deine Bedingung:

    "<table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'> <thead> <tr> <td class='head" . ($_SESSION[$db_id]['order'] == 'ID'

    Nicht ganz das, was Du möchtest.
    Edit Rolf B: Unsinn Ende

    Ich weiß, dass man … html-code nicht in php notieren sollte.

    Ja. Aber hättest Du Dein Wissen angewendet, wäre Dir der Fehler ganz selbstverständlich nicht passiert. Ein monströser Echo wie dieser ist nicht nur für Anfänger ein Enthaarungsmittel (weil Du sie Dir stundenlang gerauft hast).

    Gerade wenn man das Feature X lernen möchte, dann sollte man es erstmal isoliert behandeln. Sprich: Das Ergebnis des doppelternären Ausdrucks erstmal in eine Variable zimmern und dann ins HTML einbauen. Also ich hätte das so gemacht. Und ich habe in meinem Leben schon einige Megazeilen Code produziert, glaube ich. Also - Mega wie in Millionen Zeilen. Aber ok, ein paar Megazeilen (wie in "Millionen Zeichen lang" könnten auch dabei gewesen sein)

    Dann wäre Dir mutmaßlich auch aufgefallen, dass Du für die td-Klasse ein ' mit einem " gepaart hast.

    <?php
    ...
    $cellClass = $_SESSION[$db_id]['order'] == 'ID'
                  ? ($_SESSION[$db_id]['ascDESC'] == 'asc' ? ' asc' : ' desc')
                  : '';
    ?>
    <table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'>
    <thead>
    <tr>
    <td class='head$cellClass">
    <?php
    ...
    
    

    Der größte Vorteil von ?> ... <?php statt echo "..." ist, dass Du von einem anständigen Editor ein Code-Highlighting des HTML bekommst. Und keine einfarbige Textwurst.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hi,

      . hat höhere Prio als ?: - deswegen lautet deine Bedingung:

      "<table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'> <thead> <tr> <td class='head" . ($_SESSION[$db_id]['order'] == 'ID'

      Nein. Klammern[1] haben viel höhere Priorität als . oder ?: oder die meisten Operatoren[1:1].

      Sonst ergäbe 2 * (1 + 3) ja auch 5 statt 8.

      cu,
      Andreas a/k/a MudGuard


      1. oder muß es Klammer*innen bzw. Operator*innen heißen? 😉 ↩︎ ↩︎

      1. Hallo MudGuard,

        mann, dieser Thread wird nicht mehr mein Freund. Diese Klammer hatte ich falsch zugeordnet. Du hast natürlich recht.

        Zu meiner Aussage mit ?> ... <?php und einer Variablen zwecks besserer Lesbarkeit stehe ich aber!

        Rolf

        --
        sumpsi - posui - obstruxi
  3. Hallo Rick,

    Wie muss mein css lauten, um ein kleines weißes Dreieck in die sortierte Spalte einizufügen?

    Einizufügen? Ein Bayer, wie? 😉

    Also UTF-8 ist jedem Webseitenquellcode wärmstens anzuraten, das spart viel Mühe. Eine CSS Datei könntest Du unabhängig vom PHP Quellcode als UTF8 mit BOM speichern. Ich müsste es jetzt selbst ausprobieren, ob der Browser es erkennt oder ob er vom Webserver unbedingt einen Content-Type mit charset-Angabe haben will.

    Bei einer <style>-Abteilung in der HTML Seite ist es was anderes, da bist Du auf's Encoding der Seite angewiesen.

    Aber es ist so - Dein Browser agiert im Unicode. Dass deine Seite mit Latin-1 oder sonstwas angeliefert wird, das ist für ihn ein Ärgernis, aber er übersetzt es in Unicode. Meine ich jedenfalls... Das heißt: Zeichen wie ▲ (U+25B2 BLACK UP-POINTING TRIANGLE), die Du nicht per Latin-1 schicken kannst, kannst Du im HTML als numerische HTML Entität senden (&#x25B2;), und im CSS als Escape-Sequenz. Einfach ein \ und die Hex-Ziffern: \25B2. Dann muss aber ein Zeichen folgen, das keine Hex-Ziffer ist, sonst weiß er nicht, dass die Sequenz vorbei ist. Wenn Du unbedingt ▲42 ausgeben willst, müsstest Du die Escape-Sequenz sechsstellig machen: \0025B242 - das würde funktionieren.

    ▼ ist übrigens \25BC

    https://www.fileformat.info/info/unicode/block/geometric_shapes/list.htm

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf B

      Dann muss aber ein Zeichen folgen, das keine Hex-Ziffer ist, sonst weiß er nicht, dass die Sequenz vorbei ist. Wenn Du unbedingt ▲42 ausgeben willst, müsstest Du die Escape-Sequenz sechsstellig machen: \0025B242

      Nö. Das Endzeichen für ein Escape in CSS ist das Leerzeichen. (Wer auch immer sich den Blödsinn ausgedacht hat.) Nach 6 Hex-Ziffern ist aber Schluss, sodass man bei sechsstelligen Escapes das Leerzeichen auch weglassen kann. Aber IMHO nicht sollte; genausowenig wie man das ; in HTML u.U. weglassen könnte, aber nicht sollte.

      .\34 2 selektiert also was? Die Antwort ist class="42".

      ☞ Using character escapes in markup and CSS
      (Ui, ich muss meine Übersetzung dieses Artikels mal rauskramen und aktualisieren.)

      🖖 Живіть довго і процвітайте

      --
      „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
      1. Hallo Gunnar,

        ich bitte um Entschuldigung, dass ich mit meinen vorherigen Aussagen für Verwirrung gesorgt habe. Sie haben natürlich Recht, dass das Leerzeichen als Terminatorsymbol für Escape-Sequenzen in JavaScript dient.

        Ich fühl mich wie ChatGPT…

        Rolf

        --
        sumpsi - posui - obstruxi
      2. @@Gunnar Bittersmann

        .\34 2 selektiert also was? Die Antwort ist class="42".

        Symbolbild

        🖖 Живіть довго і процвітайте

        --
        „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
      3. @@Gunnar Bittersmann

        .\34 2 selektiert also was? Die Antwort ist class="42".

        S.a. Präsentation TIL ab. CSS escapes (Teil ab Folie 25) und zugehöriges Codebeispiel.

        ☞ Using character escapes in markup and CSS
        (Ui, ich muss meine Übersetzung dieses Artikels mal rauskramen und aktualisieren.)

        Hm, damals gab’s meine Übersetzung noch (mit gelbem Kasten).

        🖖 Живіть довго і процвітайте

        --
        „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
        1. Hallo Gunnar Bittersmann,

          wenn ich alles wüsste, was unser Wiki weiß...

          Ich hatte auch einen anderen Artikel erstellt, der mehr auf die Aspekte von Namen eingeht und wo ich Escape-Sequenzen auch beschrieben hatte. Nur eben nicht richtig, was das Leerzeichen angeht. Ich verlinke von dort jetzt auf den ersten Artikel. Der Lindwurm hat es 2011 schon richtig gewusst…

          Rolf

          --
          sumpsi - posui - obstruxi
  4. Lieber Rick,

    echo "[...] <td class='head" . (...) . ">[...]";
    

    Also sieht das Ergebnis so aus:

    <td class="headdesc">
    oder
    <td class="headasc">
    

    Dazu nun Dein CSS:

    .mytable thead .asc:after {...}
    .mytable thead .desc:after {...}
    

    Deine Selektoren erwarten ein <thead> mit einem Kindelement (welcher Art auch immer), welches seinerseits eine Klasse desc oder asc hat. Wie @Gunnar Bittersmann schon schrieb, gibt es das aber nicht (siehe HTML oben).

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      Also sieht das Ergebnis so aus:

      <td class="headdesc">
      oder
      <td class="headasc">
      

      Nein, so:

      class="head desc"
      

      Dazu nun Dein CSS:

      .mytable thead .asc:after {...}
      .mytable thead .desc:after {...}
      

      Mein css:

      /* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
      .eingangsRG thead .asc::after {
        content: '';
        display: inline-block;
        width: 0;
        height: 0;
        border-style: solid;
        border-width: 0 5px 8px 5px;
        border-color: transparent transparent #fff transparent;
        background-image: url('./icons/icons.svg#up');
        background-repeat: no-repeat;
        background-position: right center;
        background-size: contain; /* Hintergrundbild auf die Größe des Elements skalieren */
        float: right; /* Element rechts ausrichten */
      }
      
      .eingangsRG thead .desc::after {
        content: '';
        display: inline-block;
        width: 0;
        height: 0;
        border-style: solid;
        border-width: 8px 5px 0 5px;
        border-color: #fff transparent transparent transparent;
        background-image: url('./icons/icons.svg#down');
        background-repeat: no-repeat;
        background-position: right center;
        background-size: contain; /* Hintergrundbild auf die Größe des Elements skalieren */
        float: right; /* Element rechts ausrichten */
      }
      

      So funktioniert es gut.

      Anders habe ich die Dreiecke nicht hinbekommen, ich habe alle Varianten aus Rolfs Link ausprobiert.

      Rick

      1. Hallo Rick,

        Anders habe ich die Dreiecke nicht hinbekommen, ich habe alle Varianten aus Rolfs Link ausprobiert.

        Hättest Du mal einen der Fehlversuche vorgezeigt…

        .eingangsRG thead .asc::after {
          content: '\25B2';
          ...
        }
        

        funktioniert nicht?!?!

        Rolf

        --
        sumpsi - posui - obstruxi
        1. .eingangsRG thead .asc::after {
            content: '\25B2';
            ...
          }
          

          funktioniert nicht?!?!

          Nein, da wurde bei mir B2 angezeigt.

          1. Nein, da wurde bei mir B2 angezeigt.

            Zusätzlicher Hinweis:

            Mein HTML beginnt so:

            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
            <HTML>
            <HEAD>
            <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
            
            1. @@Rick

              Mein HTML beginnt so:

              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
              

              Aus welchem Museum hast du dieses Exponat entwendet? Verwende HTML (früher bekannt als HTML5).

              <HTML>
              

              Fehler: Die Angabe der Sprache des Inhalts fehlt.

              Für eine deutschsprachige Seite muss <html lang="de"> angegeben werden.

              🖖 Живіть довго і процвітайте

              --
              „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
              1. Verwende HTML (früher bekannt als HTML5).

                <HTML>
                

                Fehler: Die Angabe der Sprache des Inhalts fehlt.

                Für eine deutschsprachige Seite muss <html lang="de"> angegeben werden.

                Beides umgesetzt, danke.

                Rick

            2. Hallo Rick,

              mal abgesehen von dem, was Gunnar anmerkte - ich habe dein Museum mal nachgebaut und als Datei mit Windows-Encoding gespeichert.

              <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
              <HTML>
              <HEAD>
              <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
              <style>
              .test::after {
                 content: "\25b2";
              }
              </style>
              <link rel="stylesheet" href="test2.css" />
              </HEAD>
              <BODY>
              <P class="test">Foo &#x25b2; - </P>
              <P class="arrow">Bar &#x25b2; - </P>
              </BODY>
              </HTML>
              

              Die test2.css sieht so aus, ebenfalls im Windows-Encoding gespeichert:

              .arrow::after {
                  content: "(\25B2)";
              }
              

              Ich sehe Pfeile. Sowohl als HTML Entity wie auch als ::after-Elemente. Ich habe es von file:/// getestet und via Server mit einer MIME-Einstellung "text/html; charset=iso-8859-1" für .html Dateien.

              Welchen Browser in welcher Version auf welchem Betriebssystem hast Du verwendet?

              Rolf

              --
              sumpsi - posui - obstruxi
              1. Hallo Rolf,

                Ich sehe Pfeile. Sowohl als HTML Entity wie auch als ::after-Elemente. Ich habe es von file:/// getestet und via Server mit einer MIME-Einstellung "text/html; charset=iso-8859-1" für .html Dateien.

                Welchen Browser in welcher Version auf welchem Betriebssystem hast Du verwendet?

                FF 108.0b9 (64-Bit)
                Win 10

                Habe gerade dein HTML nachgebaut und sehe auch Pfeile.

                Baue ich es aber in meine Anwendung ein, dann schaut es so aus:

                /* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
                .eingangsRG thead .asc::after {
                content: '\25b2';
                }
                

                Rick

                1. Hallo Rick,

                  nein, das kann gar nicht sein™️. Das kommt so im Browser niemals nicht an. Was sieht man im Inspektor?

                  Hast Du einen Link auf diese Seite?

                  Eine Überlegung wäre auch noch: Wird das, was Du da zeigst, PHP-seitig verarbeitet? Ist da vielleicht ein echo, der diese CSS Regel ausgibt und das \ ermordet?

                  Rolf

                  --
                  sumpsi - posui - obstruxi
                  1. Hallo Rolf,

                    nein, das kann gar nicht sein™️. Das kommt so im Browser niemals nicht an. Was sieht man im Inspektor?

                    Müsste ich morgen mal prüfen, habe jetzt schon wieder alles auf svg-vectoren umgebaut.

                    Hast Du einen Link auf diese Seite?

                    Hast Du Dir die Überschriften mal durchgelesen?
                    Das sollte die Frage beantworten. 😉

                    Eine Überlegung wäre auch noch: Wird das, was Du da zeigst, PHP-seitig verarbeitet? Ist da vielleicht ein echo, der diese CSS Regel ausgibt und das \ ermordet?

                    Ja, es wird php-seitig verarbeitet.
                    Und es fällt mir auch keine andere Idee ein, als dass das hier das Problem ist, denn dein HTML Konstrukt hat bei mir ja auch Pfeile erzeugt.

                    Rick

                    1. Hallo Rick,

                      Und es fällt mir auch keine andere Idee ein, als dass das hier das Problem ist

                      Bei PHP wird in jedem String, der in doppelten Anführungszeichen steht, das \ als Escapezeichen erkannt.

                      echo "Hall\25b2 o";
                      

                      Hier würde PHP die Sequenz \25 als oktale Escapesequenz auffassen, d.h. ein Zeichen mit dem Code 2×8+5=21 generieren. Wie diese dann bei ISO-8859-1 über die Leitung geht - keine Ahnung.

                      Ist das so? Gibst Du diese CSS Regel mit einem PHP echo aus und der ge-echo-te String steht in doppelten Anführungszeichen? Muss das sein? Es gibt Alternativen - eine ist das vorübergehende Verlassen des PHP Modus mit ?> <?php, eine andere ist ein Echo mit einfachen Anführungszeichen (worin dann aber auch keine Variablen mehr ersetzt werden), die dritte wäre ein Nowdoc-String (Nowdoc verhält sich zu Heredoc wie '...' zu "...") ⇒ Handbuch.

                      Und natürlich könnte man im echo auch \\ statt \ schreiben, also das Escapezeichen für CSS in PHP escapen. Aber das artet dann schnell in \\\\\\\-Orgien aus… Deswegen: Aus PHP heraus sollte man HTML nach aller Möglichkeit nicht mit echo ausgeben.

                      Rolf

                      --
                      sumpsi - posui - obstruxi
                      1. Hallo Rolf,

                        Ist das so? Gibst Du diese CSS Regel mit einem PHP echo aus und der ge-echo-te String steht in doppelten Anführungszeichen? Muss das sein?

                        Ja, mein css wird nicht über eine externe datei eingelesen, sondern "oldscool" in den Headbereich der HTML geschrieben.

                        Hintergrund:

                        Die Anwender haben einige Optionen bzgl. verschiedener Darstellungen, die ich entweder in der DB abspeichere oder in einer Sessionvariablen.

                        Aus diesen Informationen wird für den Anwender dann eine eigene css dynamisch generiert. Meine css.php sieht also quasi so aus:

                        $css="
                        <style type=\"text/css\">
                        body {
                        background-color:#FFFFFF;
                        usw.
                        ";
                        
                        if ( ...) {
                        $css .= "
                        ...
                        ";
                        } else {
                        $css .= "
                        ...
                        ";
                        }
                        
                        $css=str_replace(array("\r","\n","  "),array("",""," "),$css);
                        echo trim($css);
                        

                        Diese css.php wird dann in der Headerdatei meiner Anwendung includiert, damit ist das css definiert.

                        Rick

                        1. Hallo Rick,

                          ah ja. Damit ist dann erklärt, warum die CSS Escapesequenz als \25b2 nicht funktioniert.

                          Lösungsalternativen hatte ich ja schon gelistet.

                          Rolf

                          --
                          sumpsi - posui - obstruxi
    2. Hallo Felix Riesterer,

      Also sieht das Ergebnis so aus:

      <td class="headdesc">
      oder
      <td class="headasc">
      

      Brauchst Du mein Brillenputztuch? Dieser Thread hat ein paar Stellen hinterlassen, die noch nicht durchgerubbelt sind…

      Sein Code sieht so aus

      ... == 'asc' ? ' asc' : ' desc')
      

      Da ist es, das böse kleine Space.

      Ja, das Space wäre besser im konstanten Teil des Echo-Klopses aufgehoben…

      Rolf

      --
      sumpsi - posui - obstruxi
      1. @@Rolf B

        <td class="headdesc">
        oder
        <td class="headasc">
        

        Brauchst Du mein Brillenputztuch?

        Me too.

        Ja, das Space wäre besser im konstanten Teil des Echo-Klopses aufgehoben…

        Durchaus.

        🖖 Живіть довго і процвітайте

        --
        „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
  5. ich habe in einem Tabellekopf eine ternäre Bedingung eingebaut, um diese zu lernen.

    echo ("<table class='eingangsRG' width='100%' border='0' cellpadding='4' cellspacing='1'>
    <thead>
    <tr>
    <td class='head" . ($_SESSION[$db_id]['order'] == 'ID' ? ($_SESSION[$db_id]['ascDESC'] == 'asc' ? ' asc' : ' desc') : '') . ">
    usw.
    

    Dein Code hat viel mit meinen Kastensätzen gemein 😀

    Ich hoffe, Du hast also gelernt, dass es aus Entwicklersicht keinen Sinn macht, überlange und tief verschachtelte Ausrücke zusammenzubauen, durch deren Logik man selbst kaum noch oder nicht mehr durchblickt, die einem also „den Kopf weghauen“ und „ein Brett vor diesen nageln“ - so dass man die eigentlichen Fehler (hier z.B. die hineingeratenen Leerzeichen) nicht mehr wahrnimmt.

    Und falls Du meinst, ich würde „schimpfen wie ein Rohrspatz“: Überlege mal, was passiert, wenn Du Jahre später diese Codestellen wieder „anfassen“ musst. Dann musst Du das Zeug quasi dekompilieren und ich kann Dir (aus Erfahrung mit meinem eigenem Zeug) sagen, was Du machen wirst: Du wirst das komplett neu schreiben, weil Du der Logik Deines eigenen Codes nicht mehr folgen kannst oder das aus Zeitgründen nicht willst.

    Mach es (Dir) einfach einfacher!

    Hier nur mal einer von unzähligen Versuchen, wie es bei mir nicht geklappt hat.

    /* Pseudo-Elemente für die aufsteigende/descendig Dreiecke */
    .mytable thead .asc:after {
      content: '▲';
    }
    .mytable thead .desc:after {
      content: '▼';
    }
    

    Anno 2023 sollten neue Projekte stets in UTF-8 geschrieben werden (und deren Daten darauf beruhen), bei größeren Veränderungen sollten bestehende Projekte auch darauf umgestellt werden. Das betrifft dann auch die Umstellung auf HTML 5 - und, wenn Du schon mal dabei bist: aktuellste Versionen von PHP und Datenbank.

    Argumente wie „Das macht zu viel Aufwand“ sind im Hinblick auf den obigen, schwer verschachtelten, komplizierten (ergo notlos hirnaufweichenden) und zeitfressenden Ausdruck, nur Ausreden.

    1. Hallo Willi,

      Dein Code hat viel mit meinen Kastensätzen gemein 😀

      Ich hoffe, Du hast also gelernt, dass es aus Entwicklersicht keinen Sinn macht, überlange und tief verschachtelte Ausrücke zusammenzubauen, durch deren Logik man selbst kaum noch oder nicht mehr durchblickt, die einem also „den Kopf weghauen“ und „ein Brett vor diesen nageln“ - so dass man die eigentlichen Fehler (hier z.B. die hineingeratenen Leerzeichen) nicht mehr wahrnimmt.

      Nein, hier waren es nicht die Leerzeichen, die ein Problem waren (jedenfalls nicht für mich ;) ), mein Problem war, dass ich nicht case-sensitiv unterwegs war. Das aber wäre vermutlich auch in normalen if-Anweisungen passiert.

      Anno 2023 sollten neue Projekte stets in UTF-8 geschrieben werden (und deren Daten darauf beruhen), bei größeren Veränderungen sollten bestehende Projekte auch darauf umgestellt werden. Das betrifft dann auch die Umstellung auf HTML 5 - und, wenn Du schon mal dabei bist: aktuellste Versionen von PHP und Datenbank.

      Ich wünschte, ich könnte auf UTF-8 umsteigen, ich würds sofort machen.
      Aber ich nutze fpdf und dort habe ich über die Jahre hinweg etliche Scripte geschrieben und hierfür auch Addons genutzt und teils umgeschrieben, teils sogar mit fpdi und TCPDF verknüpft, usw., usw. Da ist richtig viel Hirnschmalz hinein geflossen, da kommen mal schnell viele, viele Monate zusammen.
      Die kann ich jetzt nichmal eben schnell (und auch nicht langsam, sondern eher gar nicht) auf TCPDF oder andere utf-8 PDF-Klassen umschreiben.

      Argumente wie „Das macht zu viel Aufwand“ sind im Hinblick auf den obigen, schwer verschachtelten, komplizierten (ergo notlos hirnaufweichenden) und zeitfressenden Ausdruck, nur Ausreden.

      Weiß nicht, ich finde, das ist Gewohnheitssache.

      Mal als Beispiel: Rolf hat darauf hingewiesen, dass es viel einfacher zu lesen sei, HTML nicht in php als echo-Anweisung ausgeben zu lassen.
      Ich mache das seit 20 Jahren so und kann das viel besser lesen, als immer wieder durch <?php und ?> unterbrochenen Code, selbst wenn mich mein Editor dann farblich unterstützen würde. Ich sag, ja, Gewohnheit.
      Was dazu kommt, ist, dass ich meinen Code einigermaßen einheitlich halten will. Meine Anwendung hat aber locker ca. 150 php-Scripte mit teils mehreren 1000 Zeilen Code. Wenn ich jetzt damit anfange, teils mit echo HTML-Code ausegebn zu lassen und teils mit <?php ?> unterbrochenen Code schreibe, habe ich Sorge, nachher sehr uneinheitliochen Code zu haben.

      Wie siehst Du (oder Rolf, Gunnar, usw.) dieses Problem?

      Rick

      1. Hallo,

        Anno 2023 sollten neue Projekte stets in UTF-8 geschrieben werden

        Ich mache das seit 20 Jahren so

        Also hast du etwa 10 Jahre nach Einführung von Unicode begonnen und selbiges einfach ignoriert!?

        Stell! das! um!

        Gruß
        Kalk

        1. Also hast du etwa 10 Jahre nach Einführung von Unicode begonnen und selbiges einfach ignoriert!?

          Ob ich das "einfach" gemacht habe, weiß ich nicht mehr.
          Aber als ich begann, hatte ich sicher ganz andere Baustellen, soviel steht fest. 😜

          Stell! das! um!

          Du hast gelesen, warum ich das nicht möchte und "ignorierst selbiges einfach"? 😉 Ist immer ganz einfach, so von außen betrachtet.
          Ganz ehrlich: charset=ISO-8859-1 und latin1 machen mir selten Probleme und wenn, dann kann ich sie bisher immer umschiffen (wie in diesem Fall).
          Die Umstellunmg auf UTF-8, so gerne ich sie eigentlich hätte, würde ganz sicher viele Probleme mit sich bringen.
          Aber vielleicht sollte ich auch charset=ISO-8859-15 umstellen.

          Rick

          1. Nun, es ist wirklich einfach, immer wieder neue Gründe zu finden um an alten Fehlern fest zu halten. Nur sind diese „Gründe“ manchmal eben keine:

            • Vorliegend gibt es aber iconv

            → Du kannst also Daten von Unicode zu ISO-8859-1 umcodieren bevor Du diese fpdf zu „fressen“ gibst.

            • Noch viel bequemer und besser als als dieses ganze PHP-PDF-Gewurste ist es übrigens, sich eine LaTeX-Vorlage mit Platzhaltern zu machen (Libre-Office → speichern unter) und diese von pdflatex zu PDFs backen zu lassen. Das braucht aber einen eigenen Server. Damit meine ich einen, auf dem Du das Zeug auch installieren darfst.
            1. Hallo Willi,

              • Vorliegend gibt es aber iconv

              → Du kannst also Daten von Unicode zu ISO-8859-1 umcodieren bevor Du diese fpdf zu „fressen“ gibst.

              Darüber habe ich noch gar nicht nachgedacht.
              Wäre aber tatsächlich eine Möglichkeit.

              Edit: Aber ich sollte es mir gut überlegen, wie ich gerade nachlese.

              Woran müsste ich alles denken?

              • Ausgabe in HTML auf UTF-8 stellen
              • Datenbanken von latin1 auf utf-8 umstellen
              • Script durchforsten, ob ich irgendwo utf8_decode() verwende
              • Script durchforsten, ob ich irgendwo iconv() verwende
              • Scripte durchforsten, welcher Inhalt für fpdf über iconv auf ISO-8859-1 konvertiert werden muss
              • Scripte durchforsten, ob ich irgendwo HTML Entities verwende (oder ist das unnötig?)
              • Alle Scripte in utf-8 abspeichern?
              • Kommunikation mit dem DBMS auf utf-8 umstellen

              Habe ich in meiner Aufzählung etwas vergessen oder gibt es weitere Fallstricke, die ich beachten muss?

              • Noch viel bequemer und besser als als dieses ganze PHP-PDF-Gewurste ist es übrigens, sich eine LaTeX-Vorlage mit Platzhaltern zu machen (Libre-Office → speichern unter) und diese von pdflatex zu PDFs backen zu lassen. Das braucht aber einen eigenen Server. Damit meine ich einen, auf dem Du das Zeug auch installieren darfst.

              Den habe ich leider (oder zum Glück - je nach Problem) nicht.

              Rick

              1. Hallo Rick,

                Habe ich in meiner Aufzählung etwas vergessen oder gibt es weitere Fallstricke, die ich beachten muss?

                • PHP Default-Encoding in der php.ini umstellen. Bzw. prüfen, ob es nicht vielleicht schon utf-8 ist. Verwende nicht die Encoding-Optionen mit iconv-Präfix. Es sei denn, du machst es schlimmer als Linuchs und läufst mit PHP 5.5

                • Bei jeder Stringfunktion drüber nachdenken, ob sie noch funktioniert.

                $name = "Rüdiger";
                echo substr($name, 1, 1);
                

                Ausgabe mit ISO-8859-1: ü
                Ausgabe mit UTF-8: � - denn ein ü in UTF-8 sind 2 Bytes und substr setzt Bytes und Zeichen gleich. In UTF-8 funktioniert das nicht mehr

                Es gibt die mb_-Funktionen, und ein paar Helper gibt's auch bei iconv.

                • Drölfhundert Stunden für den Test einplanen…

                Rolf

                --
                sumpsi - posui - obstruxi
                1. Hallo Rolf,

                  • Drölfhundert Stunden für den Test einplanen…

                  Ich habe entschieden, ich bleibe vorerst bei Iso/latin1.

                  Vielleicht ändere ich meine Meinung nochmal, wenns irgendwann wieder lange Winterabende gibt und es früh dunkel wird.

                  So investiere ich meine Zeit jetzt dann doch lieber ins Womo, da hab ich grad mehr von, als eine derzeit völlig problemlos laufende Software auf biegen und brechen zu UTF-8 zu zwingen, während ich dann zugleich wieder in iso konvertiere, wenns um die Ausdrucke geht.

                  Rick

                  1. Hallo Rick,

                    derzeit völlig problemlos

                    🤣

                    Offenbar ja nicht.

                    Aber das Tilgen technischer Schulden ist eine kostspielige Sache, da hast Du schon recht.

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                    1. @Rolf,

                      Offenbar ja nicht.

                      Was denn?
                      Weil ich die Dreiecke als SVG einbinden muss?
                      Naja, wenn das das einzige Problem ist, dann läuft alles gut. 😉

                      Wie gesagt, das ist was für lange Winterabende, aber nicht für Frühjahr oder Sommer, dda habe ich besseres zu tun.😇

                      Rick

      2. @@Rick

        mein Problem war, dass ich nicht case-sensitiv unterwegs war.

        Oder dass du es warst, wo du es nicht hättest sein sollen.

        Das Problem lässt sich durch konsequente Kleinschreibung umgehen: Elementbezeichner, Attributbezeichner, Attributwerte (wenn nicht camelCase für bessere Lesbarkeit sinnvoll ist).

        Ich wünschte, ich könnte auf UTF-8 umsteigen, ich würds sofort machen.
        Aber ich nutze fpdf und dort habe ich über die Jahre hinweg etliche Scripte geschrieben

        Öhm, was verwendest du für Zeichen in Programmcode? Eine Datei, die ausschließlich ASCII-Zeichen (U+0009, U+000A, U+000D, U+0020 bis U+007E) enthält, ist auch UTF-8.

        Umcodieren müsstest du nur Textinhalte mit Umlauten, Gedankenstrichen, Anführungszeichen usw.

        🖖 Живіть довго і процвітайте

        --
        „Ukončete, prosím, výstup a nástup, dveře se zavírají.“
        1. Hallo Gunnar,

          Umcodieren müsstest du nur Textinhalte mit Umlauten, Gedankenstrichen, Anführungszeichen usw.

          Eigentlich nur Inhalte für fpdf.
          Im Programmcode selber nutze ich natürlich keine Umlaute o.ä.

          Rick

          1. Hallo Rick,

            Im Programmcode selber nutze ich natürlich keine Umlaute o.ä.

            Auch sowas nicht?

            echo "Böser Fehler!";
            echo "Betrag: {$wert}€";
            

            Okay, € ist in ISO-8859-1 eh nicht drin und du würdest &euro; verwenden müssen. Und da wäre eh ein NumberFormatter besser…

            Nicht zu vergessen Texte in Datenbanken, die dort als "schwedisch" gespeichert sind, was der MySQL Default ist. Das könnte man aber mit einem Connection-Parameter lösen, was Du ja auch schon in deiner Liste hattest.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo

              Nicht zu vergessen Texte in Datenbanken, die dort als "schwedisch" gespeichert sind, was der MySQL Default ist.

              Das ist schon lange nicht mehr so, wie ich auch schon schrieb. Rick müsste schon eine asbachuralte Datenbank auf einer asbachuralten Dantenbankserverinstallation betreiben, damit das zutrifft.

              Das könnte man aber mit einem Connection-Parameter lösen, was Du ja auch schon in deiner Liste hattest.

              Das sollte man immer und sowieso machen.

              Tschö, Auge

              --
              „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde
              1. Hallo Auge,

                Das ist schon lange nicht mehr so, wie ich auch schon schrieb.

                Ups, das hatte ich tatsächlich überlesen. Danke!

                Rolf

                --
                sumpsi - posui - obstruxi