2016-04-14 39 views
2

我想将包含存储在文件系统中的CalDAV指令的文件存储到数据库中,以便与SabreDAV一起使用。下面的代码段创建工作正常的文件:数据库中的BLOB始终为空

$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:非常感谢您提供的有用答案。该文件将被正确读取。它肯定会导致一个工作的解决方案,但它似乎有文件传输到数据库的另一个问题。 blob在数据库中保持空白。与此同时,我用(1)MYSQL LOAD_FILE(我已经检查了权限)来试用它,这使得calendardata的值变为NULL(perhabs“臭名昭着的linux bug”,我偶然发现了uppon?)和(2)file_get_contents,其中数据库中的Object保持为空。 非常感谢你 – DrFeelgood

+0

@DrFeelgood尝试将字符串绑定到blob。 'b'类型存在已知问题,将该值设置为null。所以试试$ stmt-> bind_param(“s”,$ contents);而不是$ stmt-> bind_param(“b”,$ contents);.来源:http://php.net/manual/ro/mysqli-stmt.bind-param.php#96850 –

0

阅读文档。 fopen不会给你的文件内容。它会打开一个文件并给你一个处理该文件的句柄。您需要使用该句柄来实际读取文件中的一些数据。