2016-04-14 20 views
2

Ich möchte eine Datei mit CalDAV-Anweisungen, die auf dem Dateisystem gespeichert ist, in der Datenbank speichern, um es mit SabreDAV zu verwenden. Der folgende Codeausschnitt erstellt die Datei, die gut funktioniert:BLOB in der Datenbank ist immer leer

$datei = fopen("./calendar/temp/tmp_event".$eventrand,"w"); 
$caldavcontent = "BEGIN:VCALENDAR[...]"; 
fwrite($datei, $caldavcontent,2000); 
fclose($datei); 

Der folgende Codeausschnitt die Datei liest (die die Daten enthalten, je nach Bedarf, überprüfte ich schon, dass) und soll es in die Datenbank speichern:

$blob = fopen("./calendar/temp/tmp_event".$eventrand,'rb'); 
$stmt = $mysqli->prepare("INSERT INTO calendarobjects(calendardata,lastmodified,[...]) 
VALUES(?,".time().",[...]"); 
$stmt->bind_param("b",$blob); 
$stmt->execute(); 

Die Abfrage wird vom System ohne Fehler ausgeführt, aber das BLOB, das in der Datenbank gespeichert werden soll, bleibt leer. Hat jemand eine Vorstellung davon, was falsch ist?

Vielen Dank im Voraus!

Mit freundlichen Grüßen

Antwort

1

Die $blob Variable enthält einen Griff in die Datei, nicht den binären Inhalt.

die folgenden Zeilen hinzufügen, die Daten in eine Variable zu lesen:

$blob = fopen("./calendar/temp/tmp_event".$eventrand,'rb'); 

$fsize = filesize("./calendar/temp/tmp_event".$eventrand); 
$contents = fread($blob, $fsize); fclose($blob); 


$stmt = $mysqli->prepare("INSERT INTO calendarobjects(calendardata,lastmodified,[...]) 
VALUES(?,".time().",[...]"); 
$stmt->bind_param("b",$contents); 
$stmt->execute(); 
+1

Wenn Sie die ganze Datei lesen, warum nicht 'file_get_contents'? Ist es nicht binärsicher? Vergessen Sie auch nicht, die Datei zu "fclose" ... –

+0

Vielen Dank für Ihre Antworten! @Mihail Burduja: Vielen Dank für Ihre hilfreiche Antwort. Die Datei wird korrekt gelesen. Es führt definitiv zu einer funktionierenden Lösung, aber es scheint, als gäbe es ein weiteres Problem mit der Übertragung der Datei an die Datenbank. Der Blob bleibt in der Datenbank leer. In der Zwischenzeit habe ich es mit (1) MYSQL LOAD_FILE versucht (ich habe bereits die Berechtigungen überprüft), wodurch der Wert von calendardata zu NULL wird (perhabs der "berüchtigte Linux-Bug", über den ich gestolpert bin?) Und (2) file_get_contents, wo das Objekt in der Datenbank leer bleibt . Vielen Dank – DrFeelgood

+0

@DrFeelgood Versuchen Sie, den Blob als String zu binden. Es gibt ein bekanntes Problem mit dem Typ "b", der den Wert auf null setzt. Versuchen Sie also $ stmt-> bind_param ("s", $ contents); anstelle von $ stmt-> bind_param ("b", $ contents) ;. Quelle: http://php.net/manual/ro/mysqli-stmt.bind-param.php#96850 –

0

die Dokumentation lesen. fopen gibt Ihnen den Dateiinhalt nicht. Es öffnet eine Datei und gibt Ihnen ein Handle, um mit dieser Datei zu arbeiten. Sie müssen dieses Handle verwenden, um einige Daten aus der Datei tatsächlich zu lesen.