2016-04-14 1 views
2

ファイルシステムに格納されているCalDAV命令を含むファイルをデータベースに保存して、SabreDAVで使用する場合。次のコードスニペットは、正常に動作し、ファイル作成:データベース内のBLOBは常にEMPTYです

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

を次のコードスニペットは、ファイル(必要に応じてデータが含まれている、私はすでにことを確認)を読み取り、データベースにそれを格納する必要があります

$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(); 

問合せはエラーなしでシステムによって実行されますが、データベースに格納する必要があるBLOBは空のままです。誰が何が間違っているのか考えていますか?

ありがとうございます!

敬具

答えて

1

$blob変数がファイルではなく、バイナリコンテンツへのハンドルが含まれています。

変数にデータを読み込むために次の行を追加します。

$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

ファイル全体を読むつもりならば、なぜ 'file_get_contents'を使ってみませんか?バイナリセーフではありませんか?また、ファイルを 'fclose'することを忘れないでください。 –

+0

あなたの答えをありがとう! @Mihail Burduja:有益な答えをありがとうございました。ファイルは正しく読み込まれます。間違いなく実用的なソリューションにつながりますが、ファイルをデータベースに転送する際に別の問題があるようです。ブロブはデータベース内で空のままです。その間、私は(1)MYSQL LOAD_FILE(私はすでに権限をチェックしていました)によってcalendardataの値がNULLになりました(upponを遭遇した「悪名高いLinuxのバグ」)と、(2)file_get_contents 。 ありがとうございました – DrFeelgood

+0

@DrFeelgood BLOBを文字列としてバインドしてみてください。値をnullに設定する 'b'型の既知の問題があります。したがって、$ stmt-> bind_param( "s"、$ contents);を試してください。 $ stmt-> bind_param( "b"、$ contents);の代わりに。ソース:http://php.net/manual/ro/mysqli-stmt.bind-param.php#96850 –

0

は、マニュアルを参照してください。 fopenはあなたにファイルの内容を教えてくれません。ファイルを開き、そのファイルを処理するためのハンドルを提供します。実際にファイルからデータを読み取るには、そのハンドルを使用する必要があります。