BLOB in MySQL-DB speichern

StupidBoy

Mitglied Gold
Hallo,

ich stehe gerade ziemlich auf dem Schlauch und komme einfach nicht auf die Lösung meines Porblems welches sich folgendermaßen darstellt.

Ich erzeuge mittels PHP ein Bild und möchte dieses als BLOB in eine MySQL Datenbank schreiben.

Soweit so gut, das Bild wird erzeugt (ich kanns mir anzeigen lassen) und anschließend scheinbar in die Datenbank geschrieben, kein Fehler, kein gar nichts.
Nur wenn ich in die Datenbank schaue, muss ich feststellen, dass das entsprechende Feld nur 1 Byte einhält, eindeutig zu wenig für ein Bild.

Ich komm einfach nicht auf den Fehler. Das SQL-Query wird ansonsten ohne Probleme ausgeführt, die Daten, abgesehen vom BLOB, korrekt aktualisiert.

Ich bin für jede Hilfe dankbar.

Meine Tabelle:
PHP:
CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` varchar(64) COLLATE latin1_general_ci NOT NULL,
  `mail` varchar(128) COLLATE latin1_general_ci DEFAULT NULL,
  `customer_id` int(8) NOT NULL,
  `surname` varchar(120) COLLATE latin1_general_ci DEFAULT NULL,
  `prename` varchar(120) COLLATE latin1_general_ci DEFAULT NULL,
  `birthdate` date NOT NULL,
  `birthday_applied` date NOT NULL DEFAULT '2001-01-01',
  `birthday_card` mediumblob,
  `birthday_card_id` varchar(62) COLLATE latin1_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mail` (`mail`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;

Mein PHP-Code:
PHP:
//$im ist die Grafik, wir vorher erzeugt und lässt sich testweise auch an dieser Stelle ausgeben.
$im = addslashes($im);
            
            $data       = array('birthday_card' => $im,
                                'birthday_card_id' => $birthdayCardId);
                                
            $tbl_user   = new TableUser();
            $adapter    = $tbl_user->getAdapter();
            $where      = $tbl_user->getAdapter()->
                            quoteInto('customer_id = ?', $this->userSession->userId);
                        
            $row = $tbl_user->update($data, $where);
 
Zuletzt bearbeitet:
Moin!

Nach dem Generieren des Bildes hast Du nur einen sog. Resource Identifier. Übrlicherweise ist das ein simpler ganzzahliger Wert - deswegen ist dein BLOB auch nur ein Byte groß.
Um das Bild in die Datenbank zu schreiben brauchst Du die Binärdaten - das geht am einfachsten indem Du das Bild erst speicherst und dann wieder einliest:
PHP:
$file= sprintf("/tmp/%s", md5(microtime()));
imagepng($im, $file); # oder imagejpeg(); etc.
$data = array(
  'birthday_card' => fread(fopen($file, "r"), filesize($file))
, 'birthday_card_id' => $birthdayCardId
);
unlink($file);
Bitte beachte, dass das Binary noch "escaped" werden muss - mysql_real_escape_string(); ist die sicherste Methode.
Im Übrigen solltest Du Dir sehr genau überlegen ob Du die Bilder wirklich in der DB speichern willst. Das das nur selten von Vorteil ist, wird auf http://php-faq.de/q-db-blob.html sehr gut verdeutlicht.

Gruß
Enum
 
Zuletzt bearbeitet:
Generell will ich nochmals darauf hinweisen, dass man Bilder niemals in MySQL speichern sollte - dafür gibt es schon eine perfekte "Datenbank" - das Dateisystem! Meta-Informationen können zu einem Bild in die DB gespeichert werden - und auch, wie der Pfad zum Bild lautet.
 
Zurück