Torsten: Durchsuchen einer Datenbank mit Perl mit Wildkarts

Hallo
ich habe ein Formular in dem ich einen Suchbegriff eingeben muß, die Daten werden an ein Perl-Script
übergeben, und dieses durchsucht eine Access-Datenbank, und gibt mir dann die Ergebnisse zurück, das
klappt auch wunderbar, nur ich muß immer den vollen Suchbegriff eingeben, und kann nicht nach "ähnlichen" Begriffen suchen, also z.B. in dieser Form:
Ich suche nach der Nummer 006660, und gebe diese als Suchbegriff ein, dann erhalte ich mit meinem Script das richtige Ergebnis, ich möchte jetzt aber alles finden was mit 006 anfängt, und will dazu
"006*" eingeben, also so wie in der Windows Suche nach Dateien oder Computer.
Kann mir bei diesem Problem jemand helfen, der vielleicht so einen Fall schon hatte, in dem Archiv habe
ich zumindest nichts gefunden.

Danke
Torsten

  1. Hallo,

    so wie sich das liest, verwendest du im WHERE ein "=". Versuchs mal mit "LIKE".

    Schönen Tag noch

    1. so wie sich das liest, verwendest du im WHERE ein "=". Versuchs mal mit "LIKE".

      Ich habe deinen Vorschlag mal mal angewendet, doch es funktioniert nicht.
      Ich habe im Formular jetzt 006* eingegeben.

      hier is nochmal mein Script:

      #!/perl/bin/perl.exe

      $os = "WINDOWS";

      read(STDIN, $input, $ENV{'CONTENT_LENGTH'});

      @pairs = split(/&/, $input);

      foreach $pair (@pairs) {
                ($name, $value) = split(/=/, $pair);
                
                $name =~ tr/+/ /;
                $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                $value =~ tr/+/ /;
                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

      $FORM{$name} = $value;
                        }

      $name=$FORM{"name"};
      $wert=$FORM{"wert"};

      $max_rows = 1000000;
      $rows = 0;
      use CGI;
      $cgi = new CGI;
      use Win32::ODBC;
      $DSN="stamm";
      $db=new Win32::ODBC("DSN=stamm");

      $sql_string = "SELECT * FROM Stellenplan WHERE $name LIKE '$wert'";  #Das "LIKE" war vorher "="

      @FelderNamen = $db->FieldNames();
      $spalten = @FelderNamen;

      if(! $db->Sql($sql_string)){
          @FelderNamen = $db->FieldNames();  # Feldnamen
          $spalten = @FelderNamen;           # Spaltenanzahl ermitteln
          #Ausgabe der Daten in den Browser (Tabelle)
          print        $cgi->header,

      $cgi->start_html('Ergebnis der SQL - Abfrage'),
                $cgi->h2('Ergebnis der SQL - Abfrage'),
                chop;
          print "<table border cellspacing=0 target="_blank"><tr>";
          print "<table border cellspacing=0 target="_blank"><tr>";
          for (@FelderNamen){
            print "<th>", $_, "</th>";
          }
          print "</tr><br>";
          # Und nun den Rest der Tabelle
          # FetchRow() gibt 0, wenn keine weiteren Daten anliegen
          while ($db->FetchRow() and $rows < $max_rows){
            print "<tr>";
            undef %Daten ;
            %Daten = $db->DataHash();
            $rows++;
            for ($i = 0; $i < $spalten; $i++){
              if ($Daten{$FelderNamen[$i]} gt ''){
                print "<td>", $Daten{$FelderNamen[$i]}, "</td>";
              }
              else{
                print "<td>-frei-</td>";
              }
            }
            print "</tr>";
          }
          print "</table>",
          $cgi->end_html;
          $db->Close() ;
        }
        else{
          print $cgi->header,
                $cgi->start_html('Fehler im SQL Statement'),
                $cgi->h2('Fehler im SQL Statement'),
                $cgi->p,
                $db->Error();
        }

      1. Hallo,

        na wenn Du schon das CGI.pm verwendest, dann nimms doch auch zum auslesen der Formulareingaben, siehe http://i-netlab.de/cgipm/cgi.htm...

        SQL: In der Like Klausel setze die wildCards z.B. so

        ... LIKE 'B%'

        siehe auch http://www.informatik.uni-hamburg.de/Frauen/Admina/Beitraege/DB+WWW/sql-tutor/tuto_c.htm

        Viele Grüße, Rolf

      2. Hi,

        nimm % statt * dann funkts.

        Schönen Tag

      3. Hi,
        Du kannst auch was mit Perl selber machen:

        while ($db->FetchRow() and $rows < $max_rows){
              undef %Daten ;
              %Daten = $db->DataHash();
             # insert starts here
              my($inhalte) = join(" ",values(%Daten)); # nur so als beispiel, wenn Du einen suchbegriff in allen feldern suchen willst
              next unless $inhalte =~ m/$such_argument/; # $such_argument ist dann eine regex, wenn das matching nicht funktionierte, dann wird der nächste Datensatz eingelesen
             # insert ends here
              $rows++;
              print "<tr>";
              # some modifications made here
              foreach my $feld (@FelderNamen)
                 {
                 $Daten{$feld} = "-frei-" if $Daten{$feld} eq '';
                 print "<TD> $Daten{$feld} </TD>";
                 }
              # modifications ends here
               }
              print "</tr>";
            }

        wenn Du eine Suche implementieren willst, die mit "irgendwas*" funktioniert, mußt Du das halt auf  "irgendwas.*" (beache den Punkt vrom Stern)  bringen, damit die regex richtig ist.
        ist sicherlich nihct so performat, wei eine LIKE-Abfrage, aber Du bist etwas flexibler.

        ach ja:
           @FelderNamen = $db->FieldNames();
           $spalten = @FelderNamen;
        vor dem
           if(! $db->Sql($sql_string)){
        ist nutzlos, weil Du es nachher sowieso nochmals machst, außederm funktionierts vorher sowieso nicht.

        Nur so ein Vorschlag

        Grüße
        Klaus

  2. hallo
    Es funktioniert,
    ich habe einfach aus dem * ein % gemacht,
    Danke an Harald,

    aber auch der tip von klaus is echt gut habe ich so übernommen

    das mit dem cgi habe ich so noch nicht ausprobiert, werde ich aber noch!!!

    Danke
    Torsten

  3. Seid gegruesst!

    Die wilden Karts sind los! Neulich wurde ich fast über fahren von so einem wilden Kart! (neue Rechtschreibung)
    Zum Glück kamen gerade noch die Wildcards vom 48ten (Space 2063) und knallten die Teile ab! Puh...
    Wilde Karts sollten ver boten werden - die sind fast so schlimm wie Kampf Hunde (neue Rechtschreibung).

    Ist die um sich greifende Falsch Schreibung von wilden Karts vielleicht Ergebnis der Sprach Verwirrung (neue Rechtschreibung), die die FAZ ver an staltet?
    Oder liegt es daran, dass die Leute zu selten Kart fahren und Wildcards benutzen?

    Besorgt,

    =~ /Lord Helmchen/