adrinator: suchfunktion funktioniert nicht

Bei folgenden Code tritt ein Fehler auf:

<?php
mysql_connect("localhost","root","") or die
("Keine Verbindung zur Datenbank hergestellt. Wenden Sie sich bitte an den Administrator!");
mysql_select_db("filme") or die
("Die Datenbank existiert nicht. Wenden Sie sich bitte an den Administrator!");

if ($suchwort != "")
{
 //MySQL-Abfrage\
 $abfrage = "SELECT * FROM filme ORDER BY titel ASC WHERE titel = '".$_POST["suchwort"]."';";
  $ergebnis = mysql_query($abfrage);
  //Kopf der Tabelle\
  echo "<table border='1'>\n<tr><th>Titel</th><th>Genre</th><th>Bewertung</th><th>Kommentar</th><th>Standort</th></tr>\n";
  //Tabelleninhalt schreiben\
  while($row = mysql_fetch_assoc($ergebnis))
  {
   echo "<tr><td>".$row["titel"]."</td><td>".$row["genre"]."</td><td>".$row["bewertung"]."</td><td>".$row["kommentar"]."</td><td>".$row["standort"]."</td></tr>\n";
 }
 //Tabellenende\
 echo "</table>\n";

//Tabellenende\
 echo "</table>\n";
 }

else
{
?>

Der Fehler sieht so aus:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\DVD\suchen.php on line 44

Wieso ist das so?

mfg
adrian

  1. Hello,

    *meiohmei*

    Bei folgenden Code tritt ein Fehler auf:

    Nur einer?

    <?php
    mysql_connect("localhost","root","") or die

    Wo lässt Du das Ergebnis der Funktion?

    $con = > mysql_connect("localhost","root","");  ## Das die() ist eine Unverschämtheit für den Benutzer!

    mysql_select_db("filme") or die
    ("Die Datenbank existiert nicht. Wenden Sie sich bitte an den Administrator!");

    if ($con)
      {
        $db = mysql_select_db("filme", $con);
      }
      else
      {
        ## qualifiziete Fehlerbehandlung
      }

    if ($suchwort != "")

    woher kommt denn das jetzt?

    {
    //MySQL-Abfrage\
    $abfrage = "SELECT * FROM filme ORDER BY titel ASC WHERE titel = '".$_POST["suchwort"]."';";

    aha, ein Post-Parameter...
    der noch nicht einmal escaped wird, vevor er in das Query eingebaut wird

    Lies Dir mal verschiedene Dinge durch:

    http://de3.php.net/manual/en/security.globals.php
    http://de.wikipedia.org/wiki/SQL-Injektion

    Ein harzliches Glückauf

    Tom vom Berg

    http://bergpost.annerschbarrich.de
    .

    --
    Nur selber lernen macht schlau
  2. Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:

    error_reporting(E_ALL);

    PHP schreit nach Hilfe du hörst aber nicht zu.

    Bei MYSQL abfragen verwendet man immer or die(mysql_error()); Während der Entwicklung.

    Wenn das Skript das macht was man möchte, dann gilt, alle Fehler ausgaben rauszunehmen.
    Also PHP Fehler und ganz wichtig MYSQL Fehler.
    Fehlermeldungen machen es dem event. Angreifer einfacher deine Datenbank Struktur zu verstehen.

    Alle Meldungen/ Fehler usw sollten beseitigt werden.

    Prüfe alle eingaben eines Users auf Logik und escape diese.

    Man schreibt niemals SELECT * FROM ...

    Sondern selectiere die Felder die du haben möchtest.

    Das erhöht die Lesbarkeit und die Performance wenn man nicht wirklich alle Spalten haben möchte.

    1. Hello,

      Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:

      error_reporting(E_ALL);

      Aber nur zum Debuggen...

      Sonst schreibt man das möglichst nicht rein.
      Wenn man darf, schreibt man die passenden Direktiven in die Host-Konfiguration, dort, wo man sie für jeden Host (Virtual Host) einzeln ändern kann.
      In einer .htaccess-Datei kann man dann z.B. diese generellen, für den produktiven Einsatz bestimmten Direktiven wieder ändern für den Testeinsatz.

      Ersatzweise kann man die Direktive auch an eine Variable oder einen Environment-Parameter koppeln

      if (isset ($_SERVER['DEBUG'])) error_reporting (E_ALL);

      oder

      if (isset ($_GET['debug']) and ) $_GET['debug'] = 'password') error_reporting (E_ALL);

      für einen Billig-Account bei "Werbe-Fritz"

      Ein harzliches Glückauf

      Tom vom Berg

      http://bergpost.annerschbarrich.de
      .

      --
      Nur selber lernen macht schlau
      1. Hello,

        *ach mann*

        if (isset ($_GET['debug']) and ) $_GET['debug'] == 'password') error_reporting (E_ALL);
                                                           ----

        für einen Billig-Account bei "Werbe-Fritz"

        Ein harzliches Glückauf

        Tom vom Berg

        http://bergpost.annerschbarrich.de

        --
        Nur selber lernen macht schlau
      2. error_reporting(E_ALL);

        Aber nur zum Debuggen...

        Hatte ich doch auch so geschrieben.

        In meinem Projekt werden MYSQL Fehler in einer Log Datei geschrieben während des Liveeinsatzes.

        So sehe ich zumindest ob jemand was versucht oder nicht.

        Und kann mein Skript immer weiter anpassen. Und event. vergessene Lücken sofort schliessen.
        Macht aber auch nur Sinn bei größeren Projekten.

        Wenn  man nix davon mitbekommt wird es schwer.

        MfG

        Thorsten

        1. Hello,

          error_reporting(E_ALL);

          Aber nur zum Debuggen...

          Hatte ich doch auch so geschrieben.

          In meinem Projekt werden MYSQL Fehler in einer Log Datei geschrieben während des Liveeinsatzes.

          So sehe ich zumindest ob jemand was versucht oder nicht.

          Und kann mein Skript immer weiter anpassen. Und event. vergessene Lücken sofort schliessen.
          Macht aber auch nur Sinn bei größeren Projekten.

          Wenn  man nix davon mitbekommt wird es schwer.

          Ja, da hast Du Recht.
          Das totale Ignorieren der Notices und Fehlermeldungen ist tödlich.
          Ich wollte auch nur klar machen, dass man nicht generell "E_ALL" festschreibt für eine Script, sondern die Meldungen differenziern muss zwischen solchen für die Laufzeit und solchen für die Testzeit.

          Laufzeitmeldungen zum Frontend sollten für den Programm-Betreuer der Seite vollends unwichtig sein, denn die sollten immer einen erwarteten Zustand dokumentieren. Und diejenigen, die das Backend regististriert für den Betreuer sollten für den Besucher immer verborgen bleiben.

          Aber dieses große Thema wächst hier im Forum auch erst heran. Dedlfix wollte schon länger mal eine Artikel verfassen und ich würde das sicherlich auch gerne unterstützten...

          Vielleicht finden sich ja noch zwei, drei Coautoren, um auch Screenshots beisteuern zu können usw.

          Erfahrung aus der Praxis ist schließlich das, was die meisten Fragensteller hier suchen.

          Ein harzliches Glückauf

          Tom vom Berg

          http://bergpost.annerschbarrich.de
          .

          --
          Nur selber lernen macht schlau
    2. echo $begrüßung;

      Ganz oben in einem Skript schreibt man immer aber auch wirklich immer beim Programmieren:
      error_reporting(E_ALL);

      Wenn man kann, notiert man diese Angabe lieber in der Per-Verzeichnis-Konfigurationsdatei. Beim Apachen mit mod_php in die (meist so benannte) .htaccess, bei CGI in die (im Verzeichnis des aufgerufenen Scripts liegende) php.ini.

      Bei MYSQL abfragen verwendet man immer or die(mysql_error()); Während der Entwicklung.

      Das die() zu verwenden, ist eine schlechte Idee. Auch schon während der Entwicklung.

      Wenn das Skript das macht was man möchte, dann gilt, alle Fehler ausgaben rauszunehmen.

      Damit veränderst du das Script und sein Verhalten im Fehlerfall. Du musst anschließend sämtliche Tests wiederholen, um sicherzustellen, dass nun immer noch alles so läuft wie gewollt. Ich finde es besser, gleich von Anfang an, ein robustes, Fehler mit einkalkulierendes Script zu schreiben. Die Ausgaben der Fehlermeldungen kommen dann in den "Abfrage war nicht erfolgreich"-Zweig. Da sich gelegentlich herausstellt, dass auch Scripte im Produktiveinsatz noch Fehler enthalten, sollte man sich nicht aller Möglichkeiten des Debuggens berauben. Vielmehr sollte man sie, wie von Tom schon vorgeschlagen, schaltbar machen. (if (DEBUG) echo mysql_error(); oder Log-Ausgabe)

      echo "$verabschiedung $name";