chaos: mit PHP eine datenbank durchsuchen

hallo,

ich hoffe mir kann hier jemand helfen, ich bin ziemlich neu bei PHP, das auslesen der daten ist kein problem, aber was ich benötige ist, eine suchfunktion, wo die user ihren suchbegriff eingeben und dann wird die datenbank durchsucht und das ergebnis schon in tabellen auf einer webseite wieder ausgegeben!

wie stell ich das an!

kann mir jemand vielleicht ein kleines testbeispiel zeigen?

hier ist mein einfaches script, dass die daten aus der datenbank ausliest!

<?
 $host = "localhost";     //Host der Datenbank
 $user = "kerstin";          // Benutzername
 $password = "090177";  //Passwort
 $datenbank = "Daten";       //Datenbankname

mysql_connect($host, $user, $password);  // Connect zur DB
 mysql_select_db($datenbank);             // Auswaehlen der DB

$sql = "SELECT Nachname, Vorname, Abteilung, Funktion, Vorwahl, Rufnummer, DW
              FROM  Mitarbeiter
       ORDER by Nachname";

$Mitarbeiter_query = mysql_query($sql) or
      die("Anfrage nicht erfolgreich");

?>

<table cellpadding="1" cellspacing="3" border="1">
<h2 align="center">Mitarbeiterliste Filialen</h2>
<TR>

<TD><B>Nachname:</B></TD>
<TD><B>Vorname:</B></TD>
<TD><B>Abteilung:</B></TD>
<TD><B>Funktion:</B></TD>
<TD><B>Vorwahl:</B></TD>
<TD><B>Rufnummer:</B></TD>
<TD><B>DW:</B></TD>
</TR>

<?php

$anzahl = mysql_num_rows($Mitarbeiter_query);

echo "Anzahl Mitarbeiter Denizbank: $anzahl";

while ($Mit = mysql_fetch_array($Mitarbeiter_query)){

?>

<tr>

<TD><?=$Mit['Nachname']?></TD>
 <TD><?=$Mit['Vorname']?></TD>
 <TD><?=$Mit['Abteilung']?></TD>
 <TD><?=$Mit['Funktion']?></TD>
 <TD><?=$Mit['Vorwahl']?></TD>
 <TD><?=$Mit['Rufnummer']?></TD>
 <TD><?=$Mit['DW']?></TD>
 </tr>

<?php

}

?>

</table>

  1. Moin,

    hallo,

    ich hoffe mir kann hier jemand helfen, ich bin ziemlich neu bei PHP, das auslesen der daten ist kein problem, aber was ich benötige ist, eine suchfunktion, wo die user ihren suchbegriff eingeben und dann wird die datenbank durchsucht und das ergebnis schon in tabellen auf einer webseite wieder ausgegeben!

    wie stell ich das an!

    Wo liegt Dein Problem?
    Bei der Suche oder beim ausgeben?
    Für die Volltextsuche guckst Du hier:
    http://www.php-faq.de/q/q-scripte-volltextsuche.html

    Viele Grüße TomIRL

  2. Hi,
    Du brauchst auf jeden fall mal ein Feld wo der User die Suchkriterien eingeben kann:

    Bsp::

    1. Site zum Eingeben des Suchtextes

    <form action="search.php" method="post">
    <input type="text" name="searchstring">
    <input type="submit value="suchen">
    </form>

    2. Darstellung und auslesen der Daten aus mysql in search.php

    $searchstring=$HTTP_POST_VARS["$searchstring"];
    $Result=mysql_db_query("Datenbankname","SELECT Feld1,Feld2,Feld3 FROM Tabellenname WHERE Feldsowieso LIKE '%searchstring%'");

    1. Moin,

      $searchstring=$HTTP_POST_VARS["$searchstring"];

      No, jene Darstellung ist veraltet.
      Nutze stattdessen: $_POST['var'] und $_GET['var'] u.sw.
      http://de2.php.net/manual/de/language.variables.predefined.php

    2. Hi andi,

      $searchstring=$HTTP_POST_VARS["$searchstring"];

      Wie TomIRL dir ja schon sagte, du solltest $_POST verwenden, und dann solltest du auch noch das zweite $ weglassen, sonst dürfte es da Probleme geben:

      $searchstring = $_POST['searchstring'];

      $Result=mysql_db_query("Datenbankname","SELECT Feld1,Feld2,Feld3 FROM Tabellenname WHERE Feldsowieso LIKE '%searchstring%'");

      Und wenn ich dir jetzt in $_POST['searchstring'] folgendes übermittle:
        %'; DELETE FROM tabelle;

      Du solltest das noch durch addslashes() durchschicken, zur Sicherheit:

      $searchstring = addslashes($_POST['searchstring']);

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
      Zufällige Hinweise:
      ------------------------
      Interessiert in Modellbahn?
      Wie wärs mit http://www.go-modellbahn.de?
      1. Mojn

        Nein vergiss adslashes, das ist die falsche Funktion, weil kommandos wie Now und Or nicht maskiert werden.
        Benutze stattdessen:
        http://de3.php.net/manual/de/function.mysql-escape-string.php
        oder auch:
        http://de3.php.net/manual/de/function.mysql-real-escape-string.php

        TomIRL

        1. Hi TomIRL,

          Nein vergiss adslashes, das ist die falsche Funktion, weil kommandos wie Now und Or nicht maskiert werden.

          Gut, da jast du natürlich Recht, aber andererseits, was bewirkt schon ein OR in '' eingeschlossen?

          WHERE
            foo = 'bar OR'

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
          Zufällige Hinweise:
          ------------------------
          Sinnvolles Zitieren: Man zitiert nur Teilsätze des Vorposters
          auf die man sich bezieht! Nicht einfach alles.
          1. Moin,

            Hi TomIRL,

            Nein vergiss adslashes, das ist die falsche Funktion, weil kommandos wie Now und Or nicht maskiert werden.

            Gut, da jast du natürlich Recht, aber andererseits, was bewirkt schon ein OR in '' eingeschlossen?

            Na dann denk noch mal nach...
            addslashes macht slashes also so etwas "" und keine ''.
            Und dann denke mal ein bischen nach vor ca. Monat hat hier einer (Wahsaga?) mal sehr treffend beschrieben wie man eine Mysqlinjektion mit OR baut.
            ich finde den Thread nur auf die schnelle nicht.
            TomIRL

            1. Hi TomIRL,

              Gut, da jast du natürlich Recht, aber andererseits, was bewirkt schon ein OR in '' eingeschlossen?

              Na dann denk noch mal nach...
              addslashes macht slashes also so etwas "" und keine ''.
              Und dann denke mal ein bischen nach vor ca. Monat hat hier einer (Wahsaga?) mal sehr treffend beschrieben wie man eine Mysqlinjektion mit OR baut.

              Ja, es war wahsage, ich hatte das damals auch gelesen: http://forum.de.selfhtml.org/archiv/2004/10/t91350/#m549394

              Jetzt aber noch mal zum eigentlichen Problem, angenomen, wir haben folgenden Teil eines SQL Querys, wo die $variable von einem Formular kommt:

              WHERE bla = '$variable'

              enthält $variable jetzt "blah' OR 1#", dann wird daraus:

              WHERE bla = 'blah' OR 1#'

              womit die WHERE Bedingung immer zutreffen würde.

              Jetzt jagen wir das ganze mal durch addslashes():

              $sql = "WHERE bla = '" . addslashes($variable) . "'";

              Dann würde da rauskommen:

              WHERE bla = 'blah' OR 1#'

              Und das dürfte doch eigentlich keine ungewünschten Effekte mehr auslösen, oder sehe ich dass jetzt falsch? Denn ein OR in '' eingeschlossen dürfte eigentlich nicht berücksichtigt werden.

              Ich weiß allerdings nicht genau, wie das mit der Raute ist. Wenn diese nicht berücksichtigt wird, dann dürfte es auch hier keinen Fehler geben, wenn sie berücksichtigt wird, sollte

              mysql_query($sql) OR die(mysql_error());

              dann einen Fehler ausliefern.

              Ich hab irgendwie das Gefühl einer von uns ist auf dem Holzpfad - oder wir reden aneinander vorbei ;-), so far,

              MfG, Dennis.

              --
              Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
              Zufällige Hinweise:
              ------------------------
              Antworten per E-Mail gibts hier nicht!
              1. Hi TomIRL,

                Hab ich dich jetzt überzeugt?
                Oder warum kommt da keine Antwort mehr? ;-)

                MfG, Dennis.

                --
                Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                Zufällige Hinweise:
                ------------------------
                Sinnvolles Zitieren: Man zitiert nur Teilsätze des Vorposters
                auf die man sich bezieht! Nicht einfach alles.
                1. Hi TomIRL,

                  Hab ich dich jetzt überzeugt?
                  Oder warum kommt da keine Antwort mehr? ;-)

                  Nein.. Ich verwende die Funktion die dafür vorgesehen ist.
                  Ich habe nicht jede einzelne Abfrage im Kopf kann es also nicht beurteilen welche Möglichkeit der Störung möglich ist.
                  Fakt ist adslashes ist die ältere Funktion, es gibt also triftige Gründe für die Einführung von mysql_escape_string ().
                  Übertragen will ich sagen: Warum willst Du mit einem Fiat Panda zur Arbeit fahren wenn es mit einem Mercedes schneller und sicherer geht.
                  Zumal Du ja die Wahl hast.
                  TomIRL

                  1. Hi TomIRL,

                    Ich habe nicht jede einzelne Abfrage im Kopf kann es also nicht beurteilen welche Möglichkeit der Störung möglich ist.

                    Fakt ist adslashes

                    (mit zwei dd, von add *g*)

                    ist die ältere Funktion, es gibt also triftige Gründe für die Einführung von mysql_escape_string ().

                    Nun, ich hab es halt noch von meinem ersten PHP Tutorial damals mit addslashes gelernt, was aber nicht heißen soll, dass ich mich weigere mysql_escape_string() zu benutzen ;-)

                    Ich hab mir das übrigens gerade noch mal im PHP Manual angeschauen. Da wurde bei der deutschen Übersetung ein Satz ausgelassen:

                    Note:  This function has been deprecated since PHP 4.3.0. Do not use this function. Use http://de.php.net/manual/de/function.mysql-real-escape-string.php@mysql_real_escape_string()  instead.

                    Aber auch bei dieser Funktion unterscheidet sich die Deutsche Seite von der Englischen, in welches steht:

                    mysql_real_escape_string() calls MySQL's library function mysql_escape_string, which prepends backslashes to the following characters: NULL, \x00, \n, \r, , ', " and \x1a.

                    Wenn ich das richtig sehe, kümmert sich auch diese Funktion in keinster Weise um Werte wir 'OR', 'AND' usw. Also bietet diese Funktion nicht einen allzugroßen Mehrwert gegenüber addslashes(), zu dem im Manual steht:

                    An example use of addslashes() is when you're entering data into a database. For example, to insert the name O'reilly into a database, you will need to escape it. Most databases do this with a \ which would mean O'reilly. This would only be to get the data into the database, the extra \ will not be inserted. Having the PHP directive  magic_quotes_sybase set to on will mean ' is instead escaped with another '.

                    (Auch hier ist die dt. Übersetzung mal wieder nicht so richtig zu gebrauchen.)

                    Zusamenfassed möchte ich meinen, dass für einen XSS Schutz die Funktion addslashes() durchaus ausreichen dürfte und die schlimmsten Angriffe blocken sollte.

                    Natürlich kann es trotzdem nicht schaden, mysql_real_escape_string() zu nutzen - werde ich in Zukunft vermutlich auch machen ;-)

                    Übertragen will ich sagen: Warum willst Du mit einem Fiat Panda zur Arbeit fahren wenn es mit einem Mercedes schneller und sicherer geht.
                    Zumal Du ja die Wahl hast.

                    Es gibt auch Leute, die bevorzugen "Oldtimer" ;-))

                    MfG, Dennis.

                    --
                    Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                    Zufällige Hinweise:
                    ------------------------
                    Sinnvolles Zitieren: Man zitiert nur Teilsätze des Vorposters
                    auf die man sich bezieht! Nicht einfach alles.