Ankündigung

Einklappen
Keine Ankündigung bisher.

Suchfunktion

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Suchfunktion

    Hi,
    Ersteinmal frohe Ostern und vor allem GESUNDHEIT...

    Auch ich bastel gerade an einer Suchfunktion.
    Leider habe ich folgendes Problem.

    Wie kann ich erreichen, dass nur die Datensätze von z.B. ' CreativPur' ausgegeben werden ?
    Den Firmenname findet man in meiner Tabelle unter "von_firma".

    Hier mein Versuch, der leider nicht funktioniert..

    Das Formular:

    HTML-Code:
     <form action="test.php?artikel_suchen_liste" method="post">    
    suchen nach:    
    <input type="hidden" name="firmenname" value="<?php echo $kunde['firmenname'] ?>">    
    <input type="text" name="seach" id="seach">    
    <input type="submit" value="suchen">
    </form>
    Hier die Select-Ausgabe:

    PHP-Code:
       if(isset($_GET['artikel_suchen_liste'])) {                        
    $error false;
    $seach $_POST['seach'];                        
    $firmenname $_POST['firmenname'];                        
    $sql "SELECT * FROM artikel WHERE von_firma LIKE '%$firmenname%'                        
    LIKE '%
    $seach%' OR artikelnummer                        
    LIKE '%
    $seach%' OR artikelname                          
    LIKE '%
    $seach%' OR artikelbezeichnung                        
    LIKE '%
    $seach%' OR herstellername                          
    LIKE '%
    $seach%'  
    "
    ;                        
    foreach (
    $pdo->query($sql) as $artikel) {  

    Tabelle ausgäbe.....  

    } } 
    Mein Problem besteht darin, dass immer alle Datensätze ausgegeben werden. Selbst diejenigen, die nicht "CreativPur" heißen.
    Es kommt nicht darauf an, wie lange man wartet, sondern auf WAS !!

  • #2
    Erst ein mal solltest du nicht SELECT * schreiben, siehe https://php-de.github.io/jumpto/faq/#select-star

    Dann ist dein SQL Statement falsch, du solltest dir die Fehler ausgeben lassen, die Mysql erzeugt: https://www.php.net/manual/en/mysqli.error.php

    PDO Fehler einschalten.

    Code:
    WHERE von_firma LIKE '%$firmenname%' LIKE '%$seach%' OR artikelnummer 
    Das ist falsch weil da ein AND oder OR Operator fehlt.
    Zudem wenn der Firmenname bekannt ist, kommt ja aus einem hidden Feld als gegeben, dann solltest du nicht like verwenden sondern das Gleichheitszeichen.
    2. Wenn du Parameter in dein SQL einfügst, dann sollten diese maskiert werden und vorab natürlich überrüft werden ob sie denn dem richtigen Typ entsprechen und nicht etwa leer sind.

    Wenn du PDO verwendest, nimm gleich prepared statments.

    Angesichts der vielen Anfängerfehler solltest du besser erst mal ein Tutorial durcharbeiten.

    Kommentar


    • #3
      Zitat von Creativpur Beitrag anzeigen
      Mein Problem besteht darin, dass immer alle Datensätze ausgegeben werden.
      Nein, zumindest mit diesem Code werden nicht alle Datensätze ausgegeben da du einen Syntaxfehler drin hast: »WHERE von_firma LIKE '%…%' LIKE '%…%'« - das zweite LIKE ist falsch.

      Außerdem:
      - verwende nicht »SELECT *« sondern gib immer alle Spalten an die du haben möchtest
      - baue *niemals* Daten ungeprüft in einen Query ein, du musst *immer* den Kontextwechsel behandeln!

      Kommentar


      • #4
        Ich habe es jetzt folgend überarbeitet.
        Leider funktioniert es nicht,

        HTML-Code:
        <form action="test.php?artikel_suchen_liste" method="post">
            suchen nach:
            <input type="hidden" name="firmenname" value="<?php echo $kunde['firmenname'] ?>">
            <input type="text" name="seach" id="seach">
            <input type="submit" value="suchen">
        </form>
        <hr class="hr_color_blue" />
        
                    <table class="table table-hover" style="font-size: 12px;">
                                <thead style="background-color: cornsilk">
                                    <td>
                                        Pos:
                                    </td>
                                    <td>
                                        Artikelnummer:
                                    </td>
                                    <td>
                                        Artikelname
                                    </td>
                                    <td>
                                        Bezeichnung:
                                    </td>
                                    <td>
                                        Hersteller:
                                    </td>
                                </thead>
                                <?php
        
                                if(isset($_GET['artikel_suchen_liste'])) {
                                $error = false;
                                $seach = $_POST['seach'];
                                $firmenname = $_POST['firmenname'];
                                echo $firmenname;
                                $sql = "SELECT 
                                artikelnummer, 
                                artikelname, 
                                artikelbezeichnung, 
                                herstellername 
                                FROM artikel WHERE von_firma = '$firmenname' AND
                                LIKE '%$seach%' OR artikelnummer
                                LIKE '%$seach%' OR artikelname
                                LIKE '%$seach%' OR artikelbezeichnung
                                LIKE '%$seach%' OR herstellername  
                                ";
                                foreach ($pdo->query($sql) as $artikelausgabe) {
                                ?>
                                <tbody>
                                    <td>
                                        Pos:
                                    </td>
                                    <td>
                                        <?php echo $artikelausgabe['artikelnummer'] ?>
                                    </td>
                                    <td>
                                        <?php echo $$artikelausgabe['artikelname'] ?>
                                    </td>
                                    <td>
                                        <?php echo $$artikelausgabe['artikelbezeichnung'] ?>
                                    </td>
                                    <td>
                                        <?php echo $$artikelausgabe['herstellername'] ?>
                                    </td>
        
                                </tbody>
                                <?php 
                                    } 
                                } 
                                ?>
                            </table>
        Es kommt nicht darauf an, wie lange man wartet, sondern auf WAS !!

        Kommentar


        • #5
          1. Datenbankabfragen haben in der HTML-Ausgabe nichts verloren. Die gehören vor die Ausgabe.

          2. Werte dürfen nicht direkt in SQL-Code eingefügt werden. Das wurde dir bereits gesagt, hast du aber offenbar überlesen oder ignoriert.

          3. AND und OR werden in einer bestimmten Reihenfolge abgearbeitet Dies muss nicht unbedingt der gewünschten Reihenfolge entsprechen. Es empfiehlt sich generell auch wegen der besseren Lesbarkeit die Reihenfolge mit Klammern zu bestimmen. Siehe: https://dev.mysql.com/doc/refman/8.0...recedence.html

          Zum Beispiel liefert
          Code:
          WHERE Farbe = 'rot' AND Marke = 'Audi' OR Marke = 'Ford' OR Marke = 'Toyota'
          ein anderes Ergebnis als
          Code:
          WHERE Farbe = 'rot' AND ( Marke = 'Audi' OR Marke = 'Ford' OR Marke = 'Toyota' )
          Nummer 1 liefert rote Audis, alle Fords und alle Toyotas. Nummer 2 liefert rote Audis, rote Fords und rote Toyotas. Man sollte der Datenbank immer explizit sagen, was man haben will, und nicht hoffen, dass eine Datenbank Gedanken lesen kann. Denn die macht einfach nur stur was man ihr sagt, auch wenn das Blödsinn ist, was man ihr sagt.

          Kommentar


          • #6
            Das SQL ist halt immer noch falsch. "von_firma = '$firmenname' AND LIKE '%$seach%'"

            Weiter fehlen dir so wie ich das sehe ein paar Klammern. Es hilft immer sich das SQL Statement als Satz aufzuschreiben, dann sieht man direkt was falsch läuft.
            "Suche alle Einträge wo der Firmen Name $firma lautet und das Suchwort $seach drin vorkommt. Oder wo das Suchwort in der Artikellnummer vorkommt oder usw...."


            Kommentar


            • #7
              Zitat von Creativpur Beitrag anzeigen
              Ich habe es jetzt folgend überarbeitet.
              Leider funktioniert es nicht,
              Die Behandlung des Kontextwechsels fehlt immer noch, "funktioniert […] nicht" ist keine Fehlerbeschreibung und du hast immernoch einen Syntaxfehler drin: auch »WHERE von_firma = '…' AND LIKE '%…%'« ist genauso falsch wie ohne »AND«. Wofür ist das LIKE an der Stelle überhaupt? Was in von_firma stehen soll ist doch bekannt, das mit dem Inhalt von $search vergleichen zu wollen wenig sinnvoll …

              btw: in deinem HTML-Code bei der Ausgabe der Ergebnisse ist zuviel Geld im Spiel, zudem fehlt auch hier die Behandlung des Kontextwechsels.

              Kommentar


              • #8

                HTML-Code:
                <form action="test.php?artikel_suchen_liste" method="post">
                verwende mal get anstatt post, das hat zwar mit deinem Problem nichts zu tun ist aber die normalerweise genutzte Anfrageform bei Suchanfragen.
                Und dann schau dir die URL an, die sieht auch merkwürdig aus.

                Kommentar


                • #9
                  Wie ich diese Crossposter liebe Siehe https://www.tutorials.de/threads/suchfunktion.408968/
                  Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

                  Kommentar


                  • #10
                    [MOD: geschlossen, CrossPost]
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar

                    Lädt...
                    X