Probleme bei DB-Tabellenabfrage mehrerer möglicher Variablen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme bei DB-Tabellenabfrage mehrerer möglicher Variablen

    hallo community,

    habe folgendes problem, wofür ich einfach keine lösung finde.

    habe eine tabelle (fdaten) angelegt, die spalten sind wie folgt betitelt.

    geraet varchar
    bestellnummer varchar
    hersteller varchar
    modell varchar
    chassis varchar
    fehler varchar
    loesung varchar
    name varchar

    über ein html-formular möchte ich den usern die
    möglichkeit geben daten in die datenbank einzutragen,
    was aucgh funktioniert und natürlich auch daten abzu-
    fragen was überhaupt nicht funzt.

    über formularfelder die die gleiche bezeichnung wie die tabellenspalten
    haben sende ich mittels
    <form action="db_ausgabe.php" method="post">
    die variablen an db_ausgabe.php

    geraet='".$_POST['geraet']."'
    bestellnummer='".$_POST['bestellnummer']."'
    hersteller = '".$_POST['hersteller']."'
    modell = '".$_POST['modell']."'
    chassis = '".$_POST['chassis']."'
    fehler = '".$_POST['fehler']."'
    loesung='".$_POST['loesung']."'
    name = '".$_POST['name']."'

    jetzt möchte ich mittels der übergebenen variablen in der db_ausgabe.php
    eine datenbankabfrage starten bei der einzelne, als auch mehrere oder alle
    formularfelder eingaben haben.

    leider werden auch die variablen interpretiert, die nur leerzeichen übergeben
    bekommen.

    wenn ich mittels AND-verknüpfung eine SELECT WHERE abfrage starte

    PHP-Code:
    <?  
    include("mysql_connect.php3");
    include("mysql_func.php3");

    $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, name, 
                          FROM $tabelle WHERE

    bestellnummer ' = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."'
    AND chassis = '".$_POST['chassis']."' name = '".$_POST['name']."'"


    If ($res=send_sql($db,$sql))  {
       echo "SQL-Kommando wurde ausgef&uuml;hrt<br>";
    }
    tab_out($res);
    funktioniert es zwar, der user muss aber alle formularfelder richtig ausfüllen um einen
    datensatz zu erhalten.

    wie erreiche ich es nun, dass die leeren formularfelder nicht zu einer nicht gewollten tabellenabfrage
    führen (bei OR-verknüfung) bzw. wir kann ich es erreichen, dass bei suche von
    geraet oder hersteller oder name .....
    als auch bei eingaben von geraet und hersteller als bei geraet herstelller und modell ...
    die richtigen datensätze ausgegeben werden ?

    über über jede hilfe dankbar

    gruss
    scarfe

    p.s. habe auch solchen blödsinn versucht
    PHP-Code:
    <?

    <?  // L183.php3
    include("mysql_connect.php3");
    include("mysql_func.php3");




    $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, fehler, loesung, spoint, name, email, datum
                          FROM $tabelle WHERE
    bestellnummer NOT '' = '".$_POST['bestellnummer']."'
    OR hersteller = '".$_POST['hersteller']."'
    OR modell = '".$_POST['modell']."'
    OR chassis = '".$_POST['chassis']."'
    OR spoint = '".$_POST['spoint']."'
    OR name = '".$_POST['name']."'

    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."'
    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."'
    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."'
    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."'
    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."'
    OR geraet = '".$_POST['geraet']."' AND bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."'
    OR bestellnummer = '".$_POST['bestellnummer']."' AND hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."'
    OR hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."'
    OR modell = '".$_POST['modell']."' AND chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."' NOT ''
    OR chassis = '".$_POST['chassis']."' AND spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."'
    OR spoint = '".$_POST['spoint']."' AND name = '".$_POST['name']."'
    ";

    If ($res=send_sql($db,$sql))  {
       echo "SQL-Kommando wurde ausgef&uuml;hrt<br>";
    }
    tab_out($res);
    ?>
    aber da kommt es dann auch zu ergebnissen bei leeren spalten, wenn leere formularfelder übergeben werden.

  • #2
    dann machst du halt für jeden übergeben wert ne abfrage

    wenn in $_POST['hersteller'] nicht nur leerzeichen dann
    $where[0]=" AND hersteller = '".$_POST['hersteller'];
    else
    $where[0]="";

    so machst du das für alle bedingungnen und fügst $where dann per explode zu einem string zusammen
    Signaturen sind Platzverschwendung!

    Kommentar


    • #3
      danke XAX
      für die schnelle antwort.
      kenne mich leider mit php und sql nicht so gut aus.
      kannst du es mir bitte etwas ausführlicher erklären.

      was meinstb du mit

      "so machst du das für alle bedingungnen und fügst $where dann per explode zu einem string zusammen"

      kann ich leider nichts mit anfanken.

      thx
      scarfe

      Kommentar


      • #4
        so machst du das für alle bedingungnen und fügst $where dann per explode zu einem string zusammen
        dann aber das AND erst beim implode dazu schreiben ....
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          hallo "derHund"

          auch dir vielen dank für deine antwort.
          allerdings brauche ich den lösungsansatz
          etwas ausführlicher, um ihn umsetzen zu können.

          wäre es euch möglich die DB - anfrage mit 1-2 bedingungen
          auszuformulieren ?

          ich wäre euch sehr dankbar.

          gruss scarfe

          Kommentar


          • #6
            PHP-Code:
            if(isset(trim($_POST['bestellnummer']))
              
            $where[0]="AND bestellnummer = '".$_POST['bestellnummer']."' ";
            else
              
            $where[0]="";

            if(isset(
            trim($_POST['hersteller']))
              
            $where[1]="AND hersteller = '".$_POST['hersteller']."' ";
            else
              
            $where[1]="";

            //usw. für die anderen bedingungen

            $str_where implode("",$where); 
            $str_where substr($str_where4); //das erste 'AND' wird entfernt
            $str_where 'WHERE '.$str_where;

            $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, name, 
                                  FROM 
            $tabelle $str_where"
            So müsste es gehen
            habs abe richt probiert
            Signaturen sind Platzverschwendung!

            Kommentar


            • #7
              vielen dank

              ich probiers mal aus.

              thx
              scarfe

              Kommentar


              • #8
                sorry XAX

                muss leider nochmals anfragen.
                bekomme bei folgendem script:
                PHP-Code:
                <?  // db_abfrage.php
                include("mysql_connect.php3");
                include("mysql_func.php3");


                if(isset(trim($_POST['bestellnummer']))
                  $where[0]="AND bestellnummer = '".$_POST['bestellnummer']."' ";
                else
                  $where[0]="";

                if(isset(trim($_POST['hersteller']))
                  $where[1]="AND hersteller = '".$_POST['hersteller']."' ";
                else
                  $where[1]="";

                if(isset(trim($_POST['modell']))
                  $where[2]="AND modell = '".$_POST['modell']."' ";
                else
                  $where[2]="";

                if(isset(trim($_POST['chassis']))
                  $where[3]="AND chassis = '".$_POST['chassis']."' ";
                else
                  $where[3]="";

                if(isset(trim($_POST['name']))
                  $where[4]="AND chassis = '".$_POST['name']."' ";
                else
                  $where[4]="";

                //usw. für die anderen bedingungen

                $str_where = implode("",$where);
                $str_where = substr($str_where, 4); //das erste 'AND' wird entfernt
                $str_where = 'WHERE '.$str_where;

                $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, name, datum
                                      FROM $tabelle $str_where";


                If ($res=send_sql($db,$sql))  {
                   echo "SQL-Kommando wurde ausgef&uuml;hrt<br>";
                }
                tab_out($res);
                ?>
                folgende fehlermeldung.

                "Parse error: parse error, expecting `T_VARIABLE' or `'$'' in meineseite/htdocs/datenbank/db_abfrage.php on line 6"

                was habe ich falsch gemacht ?
                habe ich irgendetwas übersehen ?

                gruss scarfe
                Zuletzt geändert von scarfe; 30.01.2004, 21:15.

                Kommentar


                • #9
                  darf ich nochmals nachfrage ?

                  unabhängig des "parse-fehlers" werden zwar mit dem
                  trim() befehl die leerzeichen entfernt.

                  wie findet aber folgendes beachtung, dass wenn kein
                  variablen-inhalt vom eingabe-formular übertragen wird,
                  (keine eingabe bei hersteller und/oder modell)
                  dies auch kein db-abfrage-kriterium ist ??

                  PHP-Code:
                  <?
                  hersteller = '".$_POST['hersteller']."' AND modell = '".$_POST['modell']."'
                  ?>
                  dürfte dann auch nicht in der WHERE verknüpfung vorkommen.

                  gruss
                  scarfe

                  Kommentar


                  • #10
                    PHP-Code:
                    if(isset(trim($_POST['bestellnummer'])) 
                    ist imho blödsinn^2, daher kommt imho again der parse error, isset wil ne var und keinen inhalt derselben ... wenn schon empty

                    ansonsten paßts fast, außer daß das AND aus der where raus muß oder du deine query mit WHERE 1 beginnen mußt ...

                    ich würde es so machen:
                    - jedes POST-feld auf existenz, inhalt und sinnvolligkeit prüfen
                    - und dann in des feld mitaufnehmen

                    PHP-Code:
                    if (isset($_POST['yours_here'])) {
                      if (
                    valide_eingabe)
                        
                    where[] = "spalte = '".$_POST['yours_here']."'";

                    und später vereinst du alle bed. mittels
                    PHP-Code:
                    implode(" AND "$where); 
                    Die Zeit hat ihre Kinder längst gefressen

                    Kommentar


                    • #11
                      thanks dir "derHund"
                      und sorry wenn ich nochmals rückfrage.

                      " ... wenn schon empty

                      ansonsten paßts fast, außer daß das AND aus der where raus muß oder du deine query mit WHERE 1 beginnen mußt ... "

                      habe das script entsprechend deinem vorschlag geändert.
                      bekomme aber immer noch parse-fehler gemeldet ?

                      "Parse error: parse error, expecting `T_VARIABLE' or `'$'' in ... meineseite/htdocs/datenbank/db_ausgabe.php on line 6 "

                      PHP-Code:
                      <?  // db_ausgabe.php
                      include("mysql_connect.php3");
                      include("mysql_func.php3");


                      if(empty(trim($_POST['bestellnummer']))    
                        $where[1]="AND bestellnummer = '".$_POST['bestellnummer']."' ";
                      else
                        $where[1]="";

                      if(empty(trim($_POST['hersteller']))
                        $where[2]="AND hersteller = '".$_POST['hersteller']."' ";
                      else
                        $where[2]="";

                      if(empty(trim($_POST['modell']))
                        $where[3]="AND modell = '".$_POST['modell']."' ";
                      else
                        $where[3]="";

                      if(empty(trim($_POST['chassis']))
                        $where[4]="AND chassis = '".$_POST['chassis']."' ";
                      else
                        $where[4]="";

                      if(empty(trim($_POST['name']))
                        $where[5]="AND chassis = '".$_POST['name']."' ";
                      else
                        $where[5]="";

                      //usw. für die anderen bedingungen

                      $str_where = implode("",$where);
                      $str_where = substr($str_where, 4); //das erste 'AND' wird entfernt
                      $str_where = 'WHERE '.$str_where;

                      $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, name, datum
                                            FROM $tabelle $str_where";


                      If ($res=send_sql($db,$sql))  {
                         echo "SQL-Kommando wurde ausgef&uuml;hrt<br>";
                      }
                      tab_out($res);
                      ?>
                      danke und gruss
                      scarfe

                      Kommentar


                      • #12
                        1. hast du zuwenig ")" in allen ifs
                        2. if(empty(trim($_POST['bestellnummer']))) dürfte auch bei richtiger klammersetzung einen parse-error auswerfen
                        besser:
                        $bla = trim($_POST['bestellnummer']);
                        if(empty($bla)) ...
                        3. wäre hier !empty() angesagt ... sonst fügst du wieder nur leere werte ein
                        4. solltest du dich mal mit schleifen (while, for, foreach) und assoziativen arrays beschäftigen ... damit kannst du soetwas eleganter lösen
                        Kissolino.com

                        Kommentar


                        • #13
                          @ Wurzel
                          vielen, vielen dank an alle.

                          mit folgenden code funktioniert es teilweise.
                          PHP-Code:
                          <?  // db_ausgabe.php
                          include("mysql_connect.php3");
                          include("mysql_func.php3");

                          $bla1 = trim($_POST['geraet']);
                          if(!empty($bla1))
                            $where[1]="AND geraet = '".$_POST['geraet']."' ";
                          else
                            $where[1]="";

                          $bla2 = trim($_POST['bestellnummer']);
                          if(!empty($bla2))
                            $where[2]="AND bestellnummer = '".$_POST['bestellnummer']."' ";
                          else
                            $where[2]="";

                          $bla3 = trim($_POST['hersteller']);
                          if(!empty($bla3))
                            $where[3]="AND hersteller = '".$_POST['hersteller']."' ";
                          else
                            $where[3]="";

                          $bla4 = trim($_POST['modell']);
                          if(!empty($bla4))
                            $where[4]="AND modell = '".$_POST['modell']."' ";
                          else
                            $where[4]="";

                          $bla5 = trim($_POST['chassis']);
                          if(!empty($bla5))
                            $where[5]="AND chassis = '".$_POST['chassis']."' ";
                          else
                            $where[5]="";

                          $bla6 = trim($_POST['name']);
                          if(!empty($bla6))
                            $where[6]="AND name = '".$_POST['name']."' ";
                          else
                            $where[6]="";


                          $str_where = implode("",$where);
                          $str_where = substr($str_where, 4); //das erste 'AND' wird entfernt
                          $str_where = 'WHERE '.$str_where;

                          $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, fehler, loesung, spoint, name, email, datum
                                                FROM $tabelle $str_where";


                          If ($res=send_sql($db,$sql))  {
                             echo "<h1>Die Datenabfrage der HF-Techniker-Datenbank wurde ausgef&uuml;hrt</h1><br><br><br>";
                          }
                          tab_out($res);
                          ?>
                          es treten aber noch folgende fehler auf.
                          1.) werden keine inhalte aus dem formular übergeben - kommt sql - syntax-fehler
                          alle anderen kombinationen aus einer, mehrerer oder aller übergebenen variablen funktioniert gut.
                          2.)wenn ich bei hersteller --> Schneider oder SCHNEIDER eingebe komme ich zur db-abfrage.

                          - leider finden leerzeichen immer noch beachtung S_C_H_N_E_I_D_E_R
                          oder s_c_h_n_e_i_d_e_r werden bei db-eintrag von Schneider nicht zugeordnet.

                          würde mich freuen diesbezüglich ebenfalls eure unterstützung zu bekommen.
                          jeder praktikable ansatz und weiteres ist mir recht.

                          nochmals herzlichen dank
                          scarfe

                          p.s. will nicht unverschämt erscheinen, aber gibt es auch eine möglichkeit der suche, dass man bei modell anstatt "TV17.1" auch nach "TV17" oder "TV17." suchen kann. (d.h. mit jokerzeichen)
                          Zuletzt geändert von scarfe; 31.01.2004, 10:52.

                          Kommentar


                          • #14
                            nur so am rande: trim() entfernt überflüssige zeichen am anfang und ende
                            einer zeichenkette, es verändert aber nicht die variable, deshalb ist das
                            PHP-Code:
                            $bla1 trim($_POST['geraet']);
                            if(!empty(
                            $bla1))
                              
                            $where[1]="AND geraet = '".$_POST['geraet']."' ";
                            ... 
                            blödsinn, weil $_POST[irgendwas] nach wie vor unerwünschte zeichen enthält


                            eingaben wie "s c h n e i d e r" kannst du nur mit str_replace() abfangen,
                            was aber bei einem begriff wie "bernd schneider" kontraproduktiv wäre


                            das "AND" kannst du weglassen und den else-zweig auch, ebenso die
                            indizierung bei $where.
                            PHP-Code:
                            $where[]='geraet='.$_POST['geraet']; 
                            reicht, dann kannst du es so machen


                            sind alle felder leer, ist auch $where empty ... also ein if um implode mit der
                            db-abfrage
                            PHP-Code:
                            $str_where ' WHERE ' implode(" AND ",$where); 

                            in mysql sind "%" "_" wildcardzeichen => manual
                            Kissolino.com

                            Kommentar


                            • #15
                              danke Wurzel,

                              bei
                              PHP-Code:
                              $where[]='geraet='.$_POST['geraet']; 
                              bekomme ich fehlermeldung : "Unknown column 'TV' in 'where clause' "

                              bei
                              PHP-Code:
                              $where[]=" geraet = '".$_POST['geraet']."' "
                              und kompletten code:
                              PHP-Code:
                              <?  // db_ausgabe.php
                              include("mysql_connect.php3");
                              include("mysql_func.php3");


                              $bla1 = trim($_POST['geraet']);
                              if(!empty($bla1))
                                $where[]=" geraet = '".$_POST['geraet']."' ";

                              $bla2 = trim($_POST['bestellnummer']);
                              if(!empty($bla2))
                                $where[]=" bestellnummer = '".$_POST['bestellnummer']."' ";

                              $bla3 = trim($_POST['hersteller']);
                              if(!empty($bla3))
                                $where[]=" hersteller = '".$_POST['hersteller']."' ";

                              $bla4 = trim($_POST['modell']);
                              if(!empty($bla4))
                                $where[]=" modell = '".$_POST['modell']."' ";

                              $bla5 = trim($_POST['chassis']);
                              if(!empty($bla5))
                                $where[]=" chassis = '".$_POST['chassis']."' ";

                              $bla6 = trim($_POST['name']);
                              if(!empty($bla6))
                                $where[]=" name = '".$_POST['name']."' ";



                              $str_where = ' WHERE ' . implode(" AND ",$where);


                              $sql="SELECT geraet, bestellnummer, hersteller, modell, chassis, fehler, loesung, spoint, name, email, datum
                                                    FROM $tabelle $str_where";


                              If ($res=send_sql($db,$sql))  {
                                 echo "<br><br><h1>Die Datenabfrage wurde ausgef&uuml;hrt</h1><br><br>";
                              }
                              tab_out($res);
                              ?>
                              funktionieren wieder alle abfragen.

                              kannst du mir bitte nochmals näher erläutern wie ich
                              1.) mit str_replace() eingaben wie "s c h n e i d e r" abfangen kann?
                              sprich keine leerzeichen -> alles aneinanderfügen und vielleicht keine
                              umlaute.

                              2.)sind alle felder leer, ist auch $where empty ... also ein if um implode mit
                              der db-abfrage.(?)

                              danke für deine hilfe
                              gruss scarfe
                              Zuletzt geändert von scarfe; 31.01.2004, 14:38.

                              Kommentar

                              Lädt...
                              X