PHP-Neuling: Suchmaschine in DB

Hallo Zusammen,

euer Erfolg und Engagement spricht leider für euch. Daher bin ich schon wieder hier mit einer blöden Frage.

Ich betreibe eine Website mit anhängender Datenbank. Die DB hat gut 80 Columns mit den verschiedensten Einträgen und Werten (strings, integer für checkboxen und radio's)

Nun bin ich - wie der Name verrät - schon Ur-Happy das ich über mysqli die DB aufbauen konnte, die Abfragen geregelt bekomme, usw usf.

Als nächsten Schritt sollte es eine Suchmaschine werden, über die bestimmte Kriterien gesucht werden können

In Absprache handelt es sich um 24 mögliche und abzufragende Felder.

Im Kopf hatte ich das schon ganz easy bedacht. Aber als ich mich dann ran gesetzt habe fing es an zu wuchern ...

Standartverhalten wäre ja ein Query alá

SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE NAME LIKE $Name OR STRASSE LIKE $STRASSE ....

Aber wenn ich jetzt 24 mögliche inputs, also 24 mögliche Columns habe, wird das ja ein riesiger Befehl der sicher auch irgendwie schief läuft.

Kann ich (in richtung isset) vorher prüfen lassen, dass das gewählte Feld auch tatsächlich gefüllt worden ist? Und nur die Felder suchen lassen, die auch tatsächlich gesetzt worden sind ?

Und vor allem, wie könnte ein solcher SELECT Befehl aussehen? Vielleicht könnte man ein array() bauen? Aber daran bin ich bislang gescheitert :-/

hat jemand evtl (schon wieder) einen Tipp für mich ?

Viele Grüße

  1. Hi,

    bau dir zuerst ein Formular für die Suchbegriffe, dass dann mit Buttons (Einzelfeldsuche) oder Radios (Formularsuche)

    • nicht suchen
    • ist gleich
    • beginnt mit
    • enthält
    • endet mit

    oder bei numerischen Feldern

    • nicht suchen
    • ist gleich
    • ist größer/gleich als
    • ist größer als
    • ist kleiner/ gleich als
    • ist kleiner als

    und vielleicht noch die Varianten für "ist zwischen"
    und was Dir sonst noch so einfällt für andere Typen.

    Wie das dann auf dem Server umzusetzen ist, überlegst Du dir danach :-)

    LG
    Mitleser

  2. Hallo PHP-Neuling,

    die Grundsatzfrage ist natürlich: Ist deine DB für diese Anfrage richtig strukturiert? Eine Tabelle mit 80 Spalten hat schon leichte Normalisierungs-Smells, aber um zu wissen ob das deine Tabelle ist, die da müffelt, oder doch die Kartoffeln hinter mir im Homeoffice-Keller, dazu müsstest Du uns deine Datenstruktur offenlegen 😉

    Die nächste Frage ist: Wenn der Anwender mehr als ein Suchfeld ausfüllt, ist das dann eine UND- oder eine ODER-Suche?

    Und die dritte Frage: Warum überhaupt mehrere Suchfelder? Google sucht ja auch nicht über Suchfelder, sondern es sucht Freitext. Eine Freitextsuche ist natürlich nicht so einfach gebaut, und sie sollte auch nicht 1:1 auf die Datenbank gehen, sondern auf einen Suchindex, also eine dafür optimierte Tabelle.

    Bleiben wir für den Anfang mal bei den 80 Spalten, von denen Du 24 durchsuchen willst, und 24 zugehörige Eingabefelder. Du hast in deinem Beispiel-SQL OR geschrieben, also soll es wohl eine ODER Verknüpfung werden.

    In solchen Fällen baut man den SQL Befehl dynamisch zusammen. Du hast einen Rumpfbefehl

    $sql = "SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE ";

    und baust nun für jedes ausgefüllte Suchfeld den entsprechenden Teil der WHERE Klausel auf. mysqli_real_escape_string nicht vergessen!

    $bedingungen = ARRAY();
    
    if (isset($_POST['STRASSE'])) {
       $bedingungen[] = "STRASSE LIKE '" 
                      . mysqli_real_escape_string($db, $_POST['STRASSE'])
                      . "%'";
    }
    // etc etc etc
    
    // Und zum Schluss klebst Du alles mit OR zusammen und hängst es an's SQL an:
    $sql .= implode(" OR ", $bedingungen);
    

    Und die Query jagst Du dann auf die DB. Ich habe es jetzt so aufgeschrieben, dass ich an jede Eingabe ein % anhänge. Da musst Du gucken wie Du es haben willst. Soll der Anwender die Wildcards selbst eingeben, möchtest Du auf der Oberfläche einen Schalter für "ist gleich" und "enthält" haben - danach richtet sich die Aufbereitung des Feldinhaltes für die DB Suche.

    Das SQL prüft dann nur die Spalten, für die auch was eingegeben wurde. Bei vielen Rows kann es aber trotzdem etwas dauern, die DB macht hier einen Table Scan.

    Rolf

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

      Die nächste Frage ist: Wenn der Anwender mehr als ein Suchfeld ausfüllt, ist das dann eine UND- oder eine ODER-Suche?

      oder beides? Professionelle Such-Engines wie etwa Google listen bei mehreren Suchbegriffen die Treffer zuerst, die möglichst viele der Suchbegriffe enthalten, und weiter hinten diejenigen, die nur noch einen Teil der Suchbegriffe enthalten.

      Und die dritte Frage: Warum überhaupt mehrere Suchfelder? Google sucht ja auch nicht über Suchfelder, sondern es sucht Freitext. Eine Freitextsuche ist natürlich nicht so einfach gebaut, und sie sollte auch nicht 1:1 auf die Datenbank gehen, sondern auf einen Suchindex, also eine dafür optimierte Tabelle.

      Trotzdem sollte die Suche immer noch spezifisch genug sein. Wenn ich nach einer Postleitzahl suche, interessiert es mich nicht, dass dieselbe Ziffernfolge auch in einigen Telefonnummern vorkommt. Daher sind mehrere Suchfelder vermutlich schon sinnvoll - oder Keywords im Suchausdruck, wie es die SELFHTML-Suche ja auch macht.

      Du hast in deinem Beispiel-SQL OR geschrieben, also soll es wohl eine ODER Verknüpfung werden.

      Vielleicht war das auch nur ein willkürliches Beispiel. Ich bin eigentlich gewöhnt, dass die Ergebnismenge kleiner wird, je mehr Kriterien ich angebe - das riecht eher nach einer UND-Verknüpfung.
      Sowohl UND als auch ODER kann sinnvoll sein - je nach Anwendungsfall.

      $sql = "SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE ";

      POPO?? 😀

      Live long and pros healthy,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Hi,

        $sql = "SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE ";

        POPO?? 😀

        Die Straße ist am Arsch der Welt 😉

        cu,
        Andreas a/k/a MudGuard

        1. Hi,

          $sql = "SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE ";

          POPO?? 😀

          Die Straße ist am Arsch der Welt 😉

          Du sollst nicht solche Begriffe benutzen, sonst wirst Du gelöscht ;-P

          1. Hi,

            Die Straße ist am Arsch der Welt 😉

            Du sollst nicht solche Begriffe benutzen, sonst wirst Du gelöscht ;-P

            Ok, ich werde mich bemühen, zukünftig das Wort Welt hier zu vermeiden 😉

            cu,
            Andreas a/k/a MudGuard

            1. Hallo MudGuard,

              Die Straße ist am Arsch der Welt 😉

              Du sollst nicht solche Begriffe benutzen, sonst wirst Du gelöscht ;-P

              Ok, ich werde mich bemühen, zukünftig das Wort Welt hier zu vermeiden 😉

              Straße wärs gewesen. Illegales Glücksspiel.

              Bis demnächst
              Matthias

              --
              Du kannst das Projekt SELFHTML unterstützen,
              indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
              1. Hi,

                Straße wärs gewesen. Illegales Glücksspiel.

                Ne, Straße kann's nicht gewesen sein, sonst wär's ja schon bei dem Posting angemeckert worden, auf das ich geantwortet habe, da stand ja auch schon Straße drin. 😉

                cu,
                Andreas a/k/a MudGuard

                1. @@MudGuard

                  Straße wärs gewesen. Illegales Glücksspiel.

                  Ne, Straße kann's nicht gewesen sein, sonst wär's ja schon bei dem Posting angemeckert worden, auf das ich geantwortet habe, da stand ja auch schon Straße drin. 😉

                  Ich tippe auf „ist“. Von mir werden ja desöfteren Postings angemeckert, auch wenn sie nicht „Straße“ enthalten. Und wenn’s nicht wegen „ist“ ist, dann ist’s „der“ oder „die“.

                  🖖 Stay hard! Stay hungry! Stay alive! Stay home!

                  --
                  Home Office ist so frustierend, weil man jetzt noch viel stärker bemerkt mit wievielen Menschen man zu tun hat, die nicht sinnerfassend lesen können. (@Grantscheam)
      2. Hallo Martin,

        PHP-Neuling

        vs

        Professionelle Such-Engines

        passt nicht zusammen. Googles MapReduce baut man nicht eben in einem SQL Statement nach. Man könnte natürlich etwas konstruieren, das die Treffer pro Row zählt und das Ergebnis nach der Anzahl sortieren. Das ist ein guter Vorschlag.

        SELECT id, name, strasse, popo
               , IF (name like ..., 1, 0) 
                 + IF (strasse like ..., 1, 0) 
                 + IF (popo like ..., 1, 0) as HitCount
        FROM Tabelle
        ORDER BY 5 DESC
        

        Das wird schön aus Bausteinen zusammengesetzt. Die IFs nehmen wir in die erste Spalte, damit keine magische Zahl hinter dem ORDER BY nötig ist (ein ORDER BY HitCount ist kein Standard-SQL, würde in MySQL aber gehen soweit ich weiß).

        $ifListe = ARRAY();
        
        if (isset($_POST['STRASSE'])) {
           $ifListe[] = "IF (STRASSE LIKE '" 
                      . mysqli_real_escape_string($db, $_POST['STRASSE'])
                      . "%', 1, 0)";
        }
        if (isset($_POST['NAME'])) {
           $ifListe[] = "IF (NAME LIKE '" 
                      . mysqli_real_escape_string($db, $_POST['NAME'])
                      . "%', 1, 0)";
        }
        $ifs = implode("+ ", $ifListe);
        
        $sql = <<<END
           SELECT $ifs as HitCount, ID, name, strasse, popo
           FROM Tabelle
           ORDER BY 1 desc
        END;
        

        So. Die Gewichte in den IFs kann man auch anders als 1 und 0 wählen, wenn z.B. ein Treffer in der Straße höher zählen soll als ein Treffer am Popo.

        Das SQL ist ungetestet, da sollte man genau auf Fehlermeldungen achten. Möglicherweise fehlen da ein paar Klammern oder so.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo,

          PHP-Neuling

          vs

          Professionelle Such-Engines

          passt nicht zusammen.

          vielleicht nicht direkt. Vielleicht muss es aber doch. Es kommt drauf an, was für eine Klientel der OP bedienen möchte. Sind es auch eher weniger erfahrene Nutzer, die auch mit einfachen Lösungen zufrieden sind? Oder sind es Leute, die schon "alles" gesehen und erlebt haben und daher verwöhnt sind? Davon hängt es ab, wie hoch man seine eigenen Ziele stecken sollte (mit der Konsequenz, ein bisschen oder sogar sehr viel dafür und dabei zu lernen).
          Man wächst mit seinen Herausforderungen.[1]

          Googles MapReduce baut man nicht eben in einem SQL Statement nach.

          Nein, sicher nicht. Aber man kann sich von einigen Features inspirieren lassen und versuchen, "sowas in der Art" nachzubauen.

          Live long and pros healthy,
           Martin

          --
          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

          1. Oder wie Hirschhausen es formuliert: Die Leber wächst mit ihren Aufgaben. ↩︎

          1. Hallo Martin,

            man kann natürlich auch die Google Appliance kaufen. Mit nur wenigen 100 K€ ist man dabei. Wenn das Ding denn nicht eingestellt worden wäre...

            Rolf

            --
            sumpsi - posui - obstruxi
    2. danke Rolf. Ich versuche das mal nachzuvollziehen und zu verarbeiten

      Vielen vielen Dank

      1. ... irgendwas habe ich wohl übersehen, oder einfach vergessen. Habe mir auch meinen 1200 Seiten Schmöker nochmal nahe gelegt, aber ich komme nicht auf die Lösung. Es muss aber ganz einfach sein ...

        Denn, als ich alles so hergerichtet habe wie empfohlen, passiert einfach nichts nachdem ich das Formular abschicke

        Ich habe die isset Abfragen für alle notwendigen inputs erstellt

        IF(isset($_POST['iKern_FELD1'])) { $selectvar[] = "KERN_FELD1 LIKE '" . mysqli_real_escape_string($db, $_POST['iKern_FELD1']) . "% '"; }
        
        
        
        

        nun besagt für mein Verständnis diese Abfrage folgendes

        WENN input **iKern_FELD1 **gesetzt ist, dann füge dem array $selectvar[] den Eintrag

        KERN_FELD1 LIKE '

        hinzu, und setze dort dran ( . ) über escapestring den Inhalt vom input iKern_FELD1. Zusätzlich fügen wir ( . ) noch ein % als wildcard an und schließen dann ab " ' "

        Was aber das $db für den Aufbau zur Datenbank dort zu suchen hat habe ich noch nicht verinnerlicht. Ich will doch hier nur aus dem input auslesen, und nichts aus der DB?

        Mein SELECT sieht dann so aus

        $SUCHE = $db->query("SELECT ID, KERN_FELD1, ..... WHERE ");
        $SUCHE .= implode("OR ", $selectvar);
        

        Das implode setzt zwischen den Einträgen des arrays jeweils ein "OR "

        Am Ende habe ich ein input zum testen gebasteln, welches in einem WHILE liegt

        //<?php IF ($Gesucht =='ja') { ?>
        <?php while ($Ergebnis = $SUCHE->fetch_object()) { ?>
        <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
        <?php } ?>
        //<? } ?>
        **Das auskommentierte IF ist nicht mehr Bestandteil des quelltextes zwecks Fehlersuche
        

        Mein Formular schicke ich dann ab

        <input type="hidden" name="aktion" value="Suchen">
        <input id="savebutton" type="submit" value="Suchen" onclick="submit">
        

        Vor der ganzen Zuweiserei wird das dann geprüft

        if (isset($_POST['aktion']) and $_POST['aktion']=='Suchen') {
        	$selectvar = array();
        $Gesucht = 'ja';
        

        Soweit so gut. Dachte ich. Aber nach dem Auswählen oder Eintragen in eines der Input Felder

        <input type="text" name="iKern_FELD1" value="">
        

        Und dem anschließenden absenden des Formulars passiert genau gar nichts. Also, es wird geladen aber nichts angezeigt / ausgelesen

        Irgend nen dusselfehler muss ich wohl dort verrammscht haben :-/

        1. ich habe mir nun mal über print_r($SUCHE) den wert auslesen lassen dort steht jetzt tatsächlich nur drin

          KERN_FELD1 LIKE 'WERT AUS FELD 1'
          

          Aber müsste der mir nicht auch den ganzen SELECT krams mit raushauen ?

          Dafür haben wir doch den . in

          $SUCHE .= implode
          
          1. das Problem waren die wildcards "%" ich habe diese jetzt entfernt und der befehl wird ausgeführt :)

          2. Hallo PHP-Neuling,

            $SUCHE = $db->query("SELECT ID, KERN_FELD1, ..... WHERE ");
            $SUCHE .= implode("OR ", $selectvar);
            

            Herzlich willkommen beim Juggler Of Death - PHP. Mutmaßlich gab's da eine Runtime-Warning oder Notice, keine Ahnung, hab ich jetzt nicht ausprobiert. Jedenfalls liefert $db->query(...) ein mysqli_statement mysqli_result Objekt zurück. Und offensichtlich ist der String-Wert dieses Objekts ein Leerstring. Das kann einfach am Objekt liegen, oder liegt daran, dass Du ein WHERE ohne Bedingung hingeschrieben hast, was ein SQL Fehler ist. Die query-Methode liefert dann FALSE an Stelle eines Objekts Ergebnisses.

            Deshalb steht nach der Verkettung nur noch die Like-Bedingung da. Du musst erst verketten und dann das Statement-Objekt erzeugen. Und Du musst prüfen, ob Dir die Query-Methode FALSE geliefert hat.

            $sql = "SELECT ID, KERN_FELD1, ..... WHERE " . implode("OR ", $selectvar);
            $SUCHE = $db->query($sql);
            if ($SUCHE === FALSE) {
               // Fehlerbehandlung, Query-Aufruf ist gescheitert, 
               // weitere Operationen mit $SUCHE schlagen fehl
            }
            

            Was aber das $db für den Aufbau zur Datenbank dort zu suchen hat habe ich noch nicht verinnerlicht.

            mysqli_real_escape_string braucht das mysqli-Objekt, das in $db steht, weil es nur eine Hülle um den Methodenaufruf auf dem Objekt ist, und weil im Objekt auch Optionen sind, die das escape-Verhalten beeinflussen. Du kannst statt des Funktions-Wrappers auch direkt die Methode verwenden, und das "real" ist ein Relikt aus mysql-Zeiten. Unter mysqli sind escape_string und real_escape_string synonym.

            $selectvar[] = "KERN_FELD1 LIKE '" 
                         . $db->escape_string($_POST['iKern_FELD1']) 
                         . "% '";
            

            Aber: Das ist immer noch nicht korrekt. Die Operatoren = und LIKE haben in SQL eine bestimmte Semantik, die insbesondere bei Columns mit fester Länge von Bedeutung ist. Der Operator = ignoriert abschließende Leerstellen, in beiden Operanden. Der Operator LIKE tut das nicht, für ihn ist jedes Leerzeichen signifikant. Eine Suche nach 'foo% ' erwartet also einen Spalteninhalt, der explizit auf eine Leerstelle endet. Bei VARCHAR-Spalten ist das aber zumeist nicht der Fall. Die Leerstelle hinter dem % muss weg.

            //<?php IF ($Gesucht =='ja') { ?>
            <?php while ($Ergebnis = $SUCHE->fetch_object()) { ?>
            <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
            <?php } ?>
            //<? } ?>
            

            Zwei Hinweise: Wenn Du <?= ... ?> verwendest, dann setze kein Semikolon. Es schadet nicht, soweit ich das erkennen kann, aber es braucht da auch nicht hin. In einem <?= ?> Block steht ein Wert (ein Ausdruck), kein Statement.

            Wenn man intensiv zwischen Code und HTML hin- und herwechselt, sollte man eher die alternative Syntax für Kontrollstrukturen verwenden. Die geschweiften Klammern gehen im Gewusel gerne unter.

            // Kommentare außerhalb von PHP funktionieren übrigens nicht, das // würde zum Client geschickt. Du musst innerhalb des PHP Blocks auskommentieren.

            <?php // IF ($Gesucht =='ja'): ?>
              <?php while ($Ergebnis = $SUCHE->fetch_object()): ?>
            <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1?>">
              <?php endwhile; ?>
            <?php // endif; ?>
            

            Also, es wird geladen aber nichts angezeigt / ausgelesen

            Debugging, debugging, debugging. Den Code anzustarren hilft oft nicht weit genug.

            Ohne Debugger muss man den Code mit echos spicken, und dafür sorgen, dass PHP alle Meldungen ausgibt (error_reporting und display_errors, aber das hatten wir doch eigentlich schon).

            Rolf

            --
            sumpsi - posui - obstruxi
            1. hy, okay das mit dem Leerzeichen teste ich nochmal nach. In der Tat war mir das noch nicht bewusst. Auch für mich zum besseren Verständnis (und dass ist ja das, man muss es erst einmal verstehen ... ) habe ich den Query nochmal umgebaut

              $SUCHEN = implode(" OR ", $selectvar);
              $SUCHE = $db->query("SELECT * FROM ausschreibungskalender WHERE ($SUCHEN)");
              

              Das "*" tausche ich wieder gegen die nur notwendigen Daten aus. aber zum debuggen war es so übersichtlicher

              Somit packe ich mir meine gesetzten inputs in die Variable $SUCHEN, um diese dann im query $SUCHE beim WHERE zu benutzen.

              Das funktioniert, sogar recht flott.

              Ich werde jetzt die alternative Syntax nochmal durch gehen und meinen code entsprechend anpassen. Das PHP auch sowas kann, war mir wieder mal nicht klar. Ich danke aber herzlichst dafür, da dies meinen quelltext deutlich übersichtlicher macht

              1. Hallo,

                $SUCHEN = implode(" OR ", $selectvar);
                $SUCHE = $db->query("SELECT * FROM ausschreibungskalender WHERE ($SUCHEN)");
                

                kleiner Tipp am Rande: Es ist sehr ungewöhnlich, Bezeichner für Variablen durchgehend groß zu schreiben. Großschreibung ist eher typisch für Konstanten.

                Bezeichner in Großschreibung sind meist auch schlechter lesbar (ist eine Sache der Gewohnheit).

                Live long and pros healthy,
                 Martin

                --
                Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                1. Hi Martin,

                  danke für den Hinweis. Ich werde mal sehen woran ich mich am besten gewöhnen kann ;)

                  grüße

        2. Hallo

          Ich habe die isset Abfragen für alle notwendigen inputs erstellt

          IF(isset($_POST['iKern_FELD1'])) {
              $selectvar[] = "KERN_FELD1 LIKE '" . mysqli_real_escape_string($db, $_POST['iKern_FELD1']) . "% '";
          }
          

          Heraus kommt KERN_FELD1 LIKE 'irgendeinwert% '. Ich bin nicht sicher, ob das Leerzeichen hinter dem Platzhalter (%) zu Problemen führen kann. Das kannst du aber eins zwei fix ausprobieren.

          Was aber das $db für den Aufbau zur Datenbank dort zu suchen hat habe ich noch nicht verinnerlicht. Ich will doch hier nur aus dem input auslesen, und nichts aus der DB?

          Zur Ausführung der Funktion mysqli_real_escape_string brauchst du die Verbindungskennung. genauer gesagt brauchst du die zur Ausführung fadt jeder Funktion der MySQLi Bibliothek.

          Mein SELECT sieht dann so aus

          $SUCHE = $db->query("SELECT ID, KERN_FELD1, ..... WHERE ");
          $SUCHE .= implode("OR ", $selectvar);
          

          Das implode setzt zwischen den Einträgen des arrays jeweils ein "OR "

          Das ist schön. Nur erfolgt das zur Unzeit. Du hast den Query mit $db->query() ja schon vorher ausgeführt.

          Am Ende habe ich ein input zum testen gebasteln, welches in einem WHILE liegt

          //<?php IF ($Gesucht =='ja') { ?>
          <?php while ($Ergebnis = $SUCHE->fetch_object()) { ?>
          <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
          <?php } ?>
          //<? } ?>
          **Das auskommentierte IF ist nicht mehr Bestandteil des quelltextes zwecks Fehlersuche
          

          Nichts gegen Kontextwechsel, da, wo sie sinnvoll sind. Hier sind sie es an mehreren Stellen ganz offensichtlich nicht [1]. Es erfüllt so überhaupt keinen Sinn, aus PHP herauszuspringen, nur um wieder hineinzuspringen. Oder steht dort im Quelltext zwischen den ?> und den <$php noch etwas anderes?

          //<?php IF ($Gesucht =='ja') {
            while ($Ergebnis = $SUCHE->fetch_object()) { ?>
          <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
            <?php }
          //} 
          ?>
          

          Davon abgesehen muss das Input einen Namen haben, bei dir ist das name-Attribut aber leer. Ohne Name wird sein Inhalt beim abschicken des Formulars nicht übertragen. Damit springen deine Prüfungen a la IF(isset($_POST['iKern_FELD1'])) auch nicht an.

          Tschö, Auge

          --
          Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
          Hohle Köpfe von Terry Pratchett

          1. Ausnahme ist der Sprung in den HTML-Kontext für das Input-Element. ↩︎

          1. Hallo Auge,

            Du hast den Query (....) ja schon vorher ausgeführt.

            Uuups - stimmt, query führt sofort aus. Habe mal schnell mein Posting oben gefixt.

            Aber echt jetzt - der Query? Ist das auch so ein Multigenus-Wort wie Modem oder Gelee?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo,

              Aber echt jetzt - der Query?

              kommt mir auch merkwürdig vor, aber ich habe noch nie darüber nachgedacht. Gefühlsmäßig eher die.

              Ist das auch so ein Multigenus-Wort wie Modem oder Gelee?

              Äh? Die kenne ich beide nur als Neutrum.

              Live long and pros healthy,
               Martin

              --
              Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
            2. Hallo

              Aber echt jetzt - der Query? Ist das auch so ein Multigenus-Wort wie Modem oder Gelee?

              Für mich ist der Query der Query, auch wenn (übersetzt) die Anfrage die Anfrage ist.

              Solange der gemeine Westdeutsche™️ alles, was man auch nur irgendwie am Körper tragen könnte, anzieht (was mir wiederum regelmäßig die Fußnägel aufrollt), nehme ich mir das raus.

              Tschö, Auge

              --
              Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
              Hohle Köpfe von Terry Pratchett
              1. Hallo,

                Solange der gemeine Westdeutsche™️

                Da tue ich direkt mal so, als fühlte ich mich angesprochen.

                alles, was man auch nur irgendwie am Körper tragen könnte, anzieht

                meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                (was mir wiederum regelmäßig die Fußnägel aufrollt), nehme ich mir das raus.

                Was genau möchtest du uns damit sagen?

                Gruß
                Kalk

                1. Moin,

                  meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                  ich kenne die Brille anziehen bisher nur von den Schwaben (manchmal auch mei Brill' uffzieha). Das ist aber neben Schmuck das einzige Accessoire, das mir auf die Schnelle einfällt, bei dem auch mir das "Anziehen" irgendiwe quer geht.

                  (was mir wiederum regelmäßig die Fußnägel aufrollt), nehme ich mir das raus.

                  Was genau möchtest du uns damit sagen?

                  Vielleicht noch zwei, drei Beispiele?

                  Live long and pros healthy,
                   Martin

                  --
                  Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                  1. Hallo

                    meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                    ich kenne die Brille anziehen bisher nur von den Schwaben (manchmal auch mei Brill' uffzieha).

                    Ich kenne das auch von Menschen, die im Ruhrpott oder im Rheinland aufgewachsen sind. Es sind nicht allein die Schwaben, die sich so (für mich krude) ausdrücken. Ich kenne aber niemanden aus der Ehemaligen, die oder der sich jemals mir gegenüber so „komisch“ ausgedrückt hätte (deshalb „der gemeine Westdeutsche™️“ [1]).

                    Das ist aber neben Schmuck das einzige Accessoire, das mir auf die Schnelle einfällt, bei dem auch mir das "Anziehen" irgendiwe quer geht.

                    Oh, da wird die Brille angezogen, aber auch der Hut, der Schlips, die Armbanduhr, der Ring, (wie gesagt) quasi alles, was man am Körper tragen könnte (außer der Einkaufstüte). Dabei könnte man das alles aufsetzen, (um)binden oder was auch immer passt.

                    Tschö, Auge

                    --
                    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                    Hohle Köpfe von Terry Pratchett

                    1. im Sinne des verallgemeinernden „der Westdeutsche als solcher“ ↩︎

                2. Hallo

                  Solange der gemeine Westdeutsche™️

                  Da tue ich direkt mal so, als fühlte ich mich angesprochen.

                  Mit „gemein“ oder mit „Westdeutscher“? 😉

                  alles, was man auch nur irgendwie am Körper tragen könnte, anzieht

                  meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                  Und wie bringst du sie dorthin, wo du sie trägst? Ich setze die meine auf, andere ziehen sie halt an, was mich halt (gelinde gesagt) umtreibt.

                  (was mir wiederum regelmäßig die Fußnägel aufrollt), nehme ich mir das raus.

                  Was genau möchtest du uns damit sagen?

                  Dass ich jedesmal, wenn jemand davon spricht, dass sie/er eine Brille, eine Armbanduhr oder einen Hut anzieht, Bauchkrämpfe, Schüttelfrost und kaputte Schuhe kriege [1]. Alles auf, an und in mir sträubt sich gegen diese Formulierung. Und solange ich unter den Konsequenzen dieser Formulierung leiden muss (quasi wohl den Rest meines Lebens), nehme ich mir heraus „der Query“ zu sagen.

                  Tschö, Auge

                  --
                  Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                  Hohle Köpfe von Terry Pratchett

                  1. In genau dieser Reihenfolge und natürlich stark übertrieben. 😉 ↩︎

                  1. Hi,

                    meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                    Und wie bringst du sie dorthin, wo du sie trägst? Ich setze die meine auf, andere ziehen sie halt an, was mich halt (gelinde gesagt) umtreibt.

                    ich setze meine Brille auch auf (oder ab), habe aber mit dem Anziehen auch kein Problem, wenn ich das irgendwo höre. Es fällt mir auf, es hört sich falsch an, aber es stört mich nicht so sehr, dass ich mich dagegen wehren würde.

                    Was genau möchtest du uns damit sagen?

                    Dass ich jedesmal, wenn jemand davon spricht, dass sie/er eine Brille, eine Armbanduhr oder einen Hut anzieht, Bauchkrämpfe, Schüttelfrost und kaputte Schuhe kriege. Alles auf, an und in mir sträubt sich gegen diese Formulierung.

                    Viel mehr stört mich, wenn manche Leute nicht von Kleidung oder Klamotten reden (je nach sozialem Umfeld), sondern von Anziehsachen. Da bin ich dann geschüttelt, aber nicht gerührt.

                    Ähnlich geht es mir bei falschen Floskeln wie meines Wissens nach oder aufgehangen.

                    Live long and pros healthy,
                     Martin

                    --
                    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                    1. Hallo Der Martin,

                      Ähnlich geht es mir bei falschen Floskeln wie meines Wissens nach oder aufgehangen.

                      Hier wird sehr häufig von gehongen gesprochen.

                      Bis demnächst
                      Matthias

                      --
                      Du kannst das Projekt SELFHTML unterstützen,
                      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
                  2. Hallo,

                    Da tue ich direkt mal so, als fühlte ich mich angesprochen.

                    Mit „gemein“ oder mit „Westdeutscher“? 😉

                    Das tue ich einfach mal offenlassen…

                    meine Brille trage ich am Kopf, den ich zum Körper dazuzähle, ohne sie angezogen zu haben.

                    Und wie bringst du sie dorthin, wo du sie trägst?

                    So wie meinen Hut natürlich durch Aufsetzen.

                    Dass ich jedesmal, wenn jemand davon spricht, dass sie/er eine Brille, eine Armbanduhr oder einen Hut anzieht,

                    Das hab ich noch nie bewusst erlebt.

                    Und solange ich unter den Konsequenzen dieser Formulierung leiden muss (quasi wohl den Rest meines Lebens), nehme ich mir heraus „der Query“ zu sagen.

                    Weil also andere sich fehlverhalten, darf ich das auch?

                    Gruß
                    Kalk

                    1. Hallo

                      Da tue ich direkt mal so, als fühlte ich mich angesprochen.

                      Mit „gemein“ oder mit „Westdeutscher“? 😉

                      Das tue ich einfach mal offenlassen…

                      Tu das mal. 😀

                      Und solange ich unter den Konsequenzen dieser Formulierung leiden muss (quasi wohl den Rest meines Lebens), nehme ich mir heraus „der Query“ zu sagen.

                      Weil also andere sich fehlverhalten, darf ich das auch?

                      Da das erste kein Fehlverhalten sondern eine landsmannschaftliche sprachliche Eigenheit (die mich in den Wahnsinn treibt) ist, ja.

                      Tschö, Auge

                      --
                      Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                      Hohle Köpfe von Terry Pratchett
          2. @@Auge

            Es erfüllt so überhaupt keinen Sinn, aus PHP herauszuspringen, nur um wieder hineinzuspringen. Oder steht dort im Quelltext zwischen den ?> und den <$php noch etwas anderes?

            //<?php IF ($Gesucht =='ja') {
              while ($Ergebnis = $SUCHE->fetch_object()) { ?>
            <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
              <?php }
            //} 
            ?>
            

            Ich sehe } ?> und <?php } ?> im Code als Fehler an.

            <?php if ($Gesucht =='ja'): ?>
              <?php while ($Ergebnis = $SUCHE->fetch_object()): ?>
                <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
              <?php endwhile; ?>
            <?php endif; ?>
            

            Das nicht nötige Raus- und Reinspringen finde ich hier nicht so schlimm, wenn’s der Lesbarkeit des Codes dient. Aber natürlich geht auch

            <?php
            if ($Gesucht =='ja'):
              while ($Ergebnis = $SUCHE->fetch_object()):
            ?>
                <input type="text" name="" value="<?= $Ergebnis->KERN_FELD1;?>">
            <?php
              endwhile;
            endif;
            ?>
            

            🖖 Stay hard! Stay hungry! Stay alive! Stay home!

            --
            Home Office ist so frustierend, weil man jetzt noch viel stärker bemerkt mit wievielen Menschen man zu tun hat, die nicht sinnerfassend lesen können. (@Grantscheam)
        3. Hallo PHP-Neuling,

          <input type="hidden" name="aktion" value="Suchen">
          <input id="savebutton" type="submit" value="Suchen" onclick="submit">
          

          Das Markup ist fehlerhaft, weil beim Klick mittels onclick-Attribut das ungültige JavaScript submit ausgeführt wird, sollte weggelassen werden. Außerdem lässt sich das gezeigte Markup bei gleicher Funktion kürzer und eleganter schreiben:

          <button name="aktion" value="Suchen">Suchen</button>
          

          Weil die Beschriftung eines button-Elements in seinem Inneren steht (und somit auch HTML enthalten kann!), kann man mittels name- und value-Attribut die Aktion kodiert werden. Falls du eine andere Aktion mit dem gleichen Formular anbieten möchtest, müsstest du nur einen weiteren, angepassten Button hinzufügen; toll, oder?

          Gruß
          Julius