2016-04-14 39 views
2

Dosya sisteminde saklanan CalDAV yönergelerini içeren bir dosyayı SabreDAV ile kullanmak üzere veritabanına kaydetmek istiyorum. (Ben zaten kontrol gerektiği gibi verileri içeren) ve veritabanına saklamalısınız şu kod parçacığı dosyasını okurBLOB Veritabanı her zaman 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(); 
Aşağıdaki kod parçası çalışıyor dosya oluşturur

Sorgu, sistem tarafından herhangi bir hata olmadan yürütülür, ancak veritabanına depolanması gereken BLOB boş kalır. Neyin yanlış olduğu hakkında bir fikri olan var mı?

Şimdiden çok teşekkür ederim!

Saygılarımızla

cevap

1

$blob değişken dosyası değil, ikili içerik için bir tanıtıcı içerir.

bir değişken veri okumak için aşağıdaki satırları ekleyin:

$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

Dosyanın tamamını okuyacaksanız, neden dosya_get_contents' değil? İkili güvenli değil mi? Ayrıca, dosya fclose 'unutmayın ... –

+0

Yanıtlarınız için çok teşekkür ederim! @Mihail Burduja: Yararlı cevabınız için çok teşekkür ederim. Dosya doğru okunur. Kesinlikle çalışan bir çözüm yol açar, ancak dosyanın veritabanına iletilmesinde başka bir sorun var gibi görünüyor. Blob veritabanında boş kalır. Bu arada (1) MYSQL LOAD_FILE (zaten kontrol izinlerini) ile denedim, bu da takvim verisinin değerini NULL (NULL) "(" uyandırdığı "kötü şöhretli linux hatayı") ve (2) file_get_contents veritabanındaki nesnenin boş kalmasını sağlar. . Çok teşekkür ederim – DrFeelgood

+0

@DrFeelgood Bloğu dize olarak bağlamayı deneyin. Değeri null olarak ayarlayan 'b' türünde bilinen bir sorun var. Öyleyse $ stmt-> bind_param ("s", $ content); $ stmt-> bind_param ("b", $ content) yerine; Kaynak: http://php.net/manual/ro/mysqli-stmt.bind-param.php#96850 –

0

belgeleri okuyun. fopen dosya içeriğini size vermez. Bir dosya açar ve bu dosyayla çalışmak için bir tutamaç verir. Dosyadan bazı verileri okumak için bu tanıtıcıyı kullanmanız gerekir.