• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bilder aus Datenbank auslesen

thommy

Neues Mitglied
Hi Leute

ich hab folgendes Problem ich möchte Bilder die ich in einer Datenbank gespeichert hab auch wieder auslesen. Ob Bilder in einer Datenbank jetzt so sehr sinnvoll ist sei mal dahin gestellt aber ich benötige es für ein Projekt.
Das einlesen war kein Problem aber ich bekomm die Bilder nicht wieder ausgelesen, ich mach das so:

PHP:
<?php
// MySQL-Verbindung herstellen
require '../home/db_conect.php';

// Bild ausgeben
//$id = $_GET['id'];
$id="6"; // zum testen

$abfrage = "SELECT datei, dateityp, datum FROM bilder WHERE id='$id'";
$result = mysql_query($abfrage);
$row = mysql_fetch_object($result);
$datei= $row->datei;
$typ = $row->dateityp;
header("Content-type: $typ"); //hab auch schon image/$typ versucht 
echo "<img src=$datei>";
?>

die datei wird als BLOB abgelegt sprich db feld "datei" ist ein BLOB
kann mir da wer helfen?
Danke und Gruß
thommy
 
Werbung:
PHP:
header("Content-type: image/$typ"); // image/jpeg, image/png, ...
echo $datei;

Sollte theoretisch die Anzeige eines Bilds bezwecken.
 
Werbung:
Ist BLOB denn groß genug, um alle Daten aufzunehmen?

- MySQL :: MySQL 5.6 Reference Manual :: 11.6 Data Type Storage Requirements

BLOB fasst maximal 65 535 Byte.

Edit: Bevor ich es lösche:

Schema:

Code:
CREATE TABLE `dbpic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL,
  `data` mediumblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Beispiel:

PHP:
<?php

class ImageRepository
{
    protected $connection;
    protected $table;

    public function __construct($connecton, $db, $table)
    {
        $this->connection = $connecton;
        mysql_select_db($db, $this->connection);
        $this->table = $table;
    }

    /**
     * Escaping shortcut
     */
    protected function e($data)
    {
        return mysql_real_escape_string($data, $this->connection);
    }

    public function create($file)
    {
        $finfo = new finfo(FILEINFO_MIME);

        // Returns something like "text/plain; charset=us-ascii". We just want
        // the MIME type
        $type = $finfo->file($file);
        $tmp = explode(';', $type);
        $type = trim($tmp[0]);

        $data = file_get_contents($file);

        $q = "
        INSERT INTO `" . $this->table . "`
            (
                `id`,
                `type`,
                `data`
            )
        VALUES
            (
                NULL,
                '" . $this->e($type) . "',
                '" . $this->e($data) . "'
            )
        ";

        mysql_query($q, $this->connection);
    }

    public function read($id)
    {
        $q = "
        SELECT
                `type`,
                `data`
        FROM
                `" . $this->table . "`
        WHERE
                `id` = '" . $this->e($id) . "'
        ";

        $result = mysql_query($q, $this->connection);

        $image = null;

        while ($row = mysql_fetch_array($result)) {
            $image = array(
                'id' => $id,
                'type' => $row['type'],
                'data' => $row['data']
            );
        }

        return $image;
    }

    public function update($id, $newFile)
    {
        // ...
    }

    public function delete($id)
    {
        // ...
    }
}

$ir = new ImageRepository(
    mysql_connect('server', 'user', 'password'),
    'database',
    'table'
);

// Create new entry
#$ir->create(__DIR__ . '/demo.jpg');

// Read and output entry with ID 14
#$image = $ir->read(14);
#header('Content-Type: ' . $image['type']);
#echo $image['data'];

(Enthält keinerlei Fehlerprüfungen.)

Ich würde allerdings von der Nutzung des mysql-Adapters abraten und auf PDO setzen.
 
Zuletzt bearbeitet:
Ja danke das ist eine gute Lösung und funktioniert auch! Muss sie jetzt mal auf meine bedürfnisse anpassen bzw. verstehen lernen damit ich das Beispiel auch mit gutem Gewissen verwenden kann und vieleicht traue ich mich dann auch noch an PDO!

Gruß
 
ist eigentlich der retun wert $image ein mehrdimensionales arry?

wenn ja geht dann folgende ausgabe :
foreach(bla bla)
{
$image = $ir->read($id);
header('Content-Type: ' . $image['type']);
echo $image['data'];
}
 
Werbung:
Jain. Du kannst nur ein Bild (eine Ressource) pro Request sinnvoll zurückliefern. Das Script, was wir hier schreiben, wird mehr so aufgerufen:

PHP:
<img src="/pfad/zum/script.php?id=14" />
 
Zurück
Oben