Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Bilder auslesen und anzeigen

Einklappen

Neue Werbung 2019

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

  • MySQL Bilder auslesen und anzeigen

    Hallo,

    ich habe zwar viele Forumseinträge zu dem Thema gefunden, aber keiner konnte mir effektiv weiterhelfen. Ich probiere seit vielen Stunden rum.
    Ich speicher Bilder (jpg's) in einer MySQL-DB (über Sinn und Unsinn möchte ich hier nicht diskutieren). Das Auslesen und Anzeigen der Bilder bereitet mir Schwierigkeiten.
    Das Bild steht als Medium Blob in der DB-Tabelle pictures, ausserdem sind Name des Bildes, Typ, Größe und eine eindeutige ID dort verzeichnet.
    Über eine andere Tabelle map lese ich die ID's der Bilder von pictures aus (Fremdschlüssel).

    Hier mein Codeschnipsel: main.php
    PHP-Code:
        error_reporting(E_ALL);
        
    $link mysql_connect("...""...""...") or die("Could not connect: " mysql_error());

        
    mysql_select_db("db...") or die(mysql_error());

        
    $url ltrim chop$_SERVER['PHP_SELF'], ".php" ), "/" );
        
    $sql "SELECT * FROM map WHERE map_url='".$url."'";

        
    $result mysql_query("$sql") or die("Invalid query: " mysql_error());
        
        while ( 
    $row mysql_fetch_array($result) )
        {
            
    $sql_small "SELECT image FROM pictures WHERE image_id=".$row[4]; // $row[4] ist der FK, ID des gewünschten Bildes
            
    $small_pic mysql_query("$sql_small") or die("Invalid query: " mysql_error());
            
    $small_pic mysql_fetch_array($small_pic);
            echo 
    "<img src=\"file.php?image_id='".$row[4]."'\" />";
        }
        
    mysql_close($link); 
    file.php:
    PHP-Code:
        error_reporting(E_ALL);
        if(isset(
    $_GET['image_id']) && is_numeric($_GET['image_id'])) {
            
    $link mysql_connect("...""...""...") or die("Could not connect: " mysql_error());
     
            
    mysql_select_db("db...") or die(mysql_error());
     
            
    $sql "SELECT image FROM pictures WHERE image_id=".image_id;
     
            
    $result mysql_query("$sql") or die("Invalid query: " mysql_error());
     
            
    header("Content-type: image/jpeg");
            echo 
    mysql_result($result2);
            
    mysql_close($link);
        }
        else {
            echo 
    'Please use a real id number';
        } 
    Woran hängt es, dass mein Bild nicht dargestellt wird?
    An welcher Stelle muss ich den Quellcode wie ändern?
    Danke für Hilfe!
    Frank

  • #2
    Selbst wenn du nicht drüber diskutieren willst: Es ist eine schlecht Idee. Nur weil du diese Diskussion abwenden willst, heißt es noch lange nicht, dass deine Idee gut ist.

    Dein Code ist schlecht und deswegen kann ich dir sagen, dass du nicht genug Erfahrung hast, um sagen zu können, dass das, was du machst, Sinn hat. Speicher den Pfad des Bilder in die Datenbank und schon ist das Problem geregelt.

    Was das Problem angeht: mysql_result() hat falsche Parameter. Du fragst 2 ab, solltest aber 0 abfragen.

    Weitere Probleme:
    Nur weil du eine Zahl per GET bekommst, heißt es nicht, dass das Bild auch existiert. Gib mal 100000 ein; dann bekommst du 'ne Fehlermeldung.

    PHP_SELF sollte man nicht benutzen, weil es manipulierbar ist.

    Die MySQL-Extension ist ab PHP5.5 veraltet und wird in PHP5.6 oder PHP6 abgeschafft werden. Daher solltest du mysqli oder PDO verwenden.

    Kommentar


    • #3
      wer weiß, ob, selbst wenn der header korrekt ist, der datenbankfeldinhalt als interpretierbares bild beim Browser ankommt

      Kommentar


      • #4
        Weil Computer selten die Initiative ergreifen, zufällige Handlungen zu vollbringen?

        Kommentar


        • #5
          Hi Asterixus,

          Zitat von Asterixus Beitrag anzeigen
          Selbst wenn du nicht drüber diskutieren willst: Es ist eine schlecht Idee. Nur weil du diese Diskussion abwenden willst, heißt es noch lange nicht, dass deine Idee gut ist.
          Ich habe nicht behauptet, dass es eine gute Idee ist. Es ist einfach meine Idee um meine Problemstellung anzugehen, die lautet wie folgt:
          Ich erstelle eine Webseite für europaweite Schülertreffen. In GB ist es nicht erlaubt Fotos frei ins Netz zu stellen (von dem Klassentreffen mit einer italienischen Klasse z.B.). Darum hat die Site eine Passwortabfrage und mit richtigem Passwort werden die Bilder gezeigt. Die Bilder müssen also auch sicher gehostet werden, d.h. sie dürfen nicht mit Webspider und Co auszulesen sein. Da fällt mir das Speichern in eine DB ein.
          Welche Alternative hast Du bezüglich meiner Problemstellung zu bieten?
          Und warum soll das Speichern von Bildern in der DB ein Problem sein? DIe DB ist groß genaug und ich greife über die ID immer nur die drei Bilder ab, die ich haben will, das dauert nicht lange.


          Zitat von Asterixus Beitrag anzeigen
          Was das Problem angeht: mysql_result() hat falsche Parameter. Du fragst 2 ab, solltest aber 0 abfragen.
          Du meinst: echo mysql_result(); ?
          Leider hat das im Ergebnis nichts geändert. Es wundert mich auch, dass es ohne Parameter gehen sollte, weil mysql_result, so denke ich, den Parameter benötigt (wenigstetns die Datenquelle, also den ersten Parameter).


          Zitat von Asterixus Beitrag anzeigen
          Weitere Probleme:
          Nur weil du eine Zahl per GET bekommst, heißt es nicht, dass das Bild auch existiert. Gib mal 100000 ein; dann bekommst du 'ne Fehlermeldung.
          Ich habe überprüft, dass der FK als ID vorhanden ist. Das Problem von möglichen Fehlern abzufangen kommt später.

          Kommentar


          • #6
            Ich sag ja sonst nix zu SELECT *, aber das mit numerischen Index ist schon ein wenig ungünstig.

            Zitat von frankmehlhop Beitrag anzeigen
            Welche Alternative hast Du bezüglich meiner Problemstellung zu bieten?
            Und warum soll das Speichern von Bildern in der DB ein Problem sein? DIe DB ist groß genaug und ich greife über die ID immer nur die drei Bilder ab, die ich haben will, das dauert nicht lange.
            Im Dateisystem speichern, verhindern das der Webserver die Bilder ausliefern kann (z.B. außerhalb des web roots, oder per htaccess) und mittels PHP Script die Bilder ausliefern.

            Warum das ein Problem für die DB ist? Das ist erstmal kein Problem für die Datenbank, für die Datenbank wird es erst zum Problem wenn die Ressourcen knapp werden. Viel problematischer sind dabei die Backups, das wird schon bei wenigen Bildern "interessant".

            Kommentar


            • #7
              erc schrieb: Im Dateisystem speichern
              Das heißt in einem normalen Ordner?
              Wie kann ich verhindern, dass unbefugt darauf zugegriffen wird?
              Und wie kann ich die Bilder darin abspeichern und auslesen?

              Auch Links zu erklärenden Texten und Programmbeispielen wären mir sehr hilfreich.
              Danke! Frank

              Kommentar


              • #8
                z.B. außerhalb des web roots, oder per htaccess)

                Kommentar

                Lädt...
                X