Doczytałem że są/były problemy z odczytywaniem dużych BLOBów i trzeba to robić paczkami więc testowo czytam pierwsze 8192 bajtów, jednak moje odczytane dane nie wyglądają dobrze a wykonałem taki test (wszystko zakodowane jest w UTF-8 w PHP i w DB):
$var_datablob = 'TEST1: Testowy text zapisany jako blob'; // text zapisywane do bloba i pola tekstowego 'TEST'
$blob_id = ibase_blob_create();
ibase_blob_add($blob_id, $var_datablob);
$blob_id_str = ibase_blob_close($blob_id);
$q = "INSERT INTO TMP_TEST(TEST, OBJ) VALUES('$var_datablob','$blob_id_str')";
$d = $DB->db->exec($q);
$q = "INSERT INTO TMP_TEST(TEST, OBJ) VALUES('TEST2: Testowy text zapisany jako blob',$blob_id_str)";
$d = $DB->db->exec($q);
A odczytałem tak:
$q = "SELECT * FROM TMP_TEST";
$d = $DB->db->query($q);
while( $row = $d->fetchRow(MDB2_FETCHMODE_OBJECT) ) {
$blobinfo = ibase_blob_info($row->obj);
$blob_id = ibase_blob_open($row->obj);
$stringBLOB = ibase_blob_get($blob_id,8192);
echo '#' . $row->t_id . ' | ' . $row->test . ' | BLOB string: ' . $stringBLOB . '<br>';
ibase_blob_close($blob_id);
}
Co dało taki wynik:
#1 | TEST1: Testowy text zapisany jako blob | BLOB string: 0x0000000100000000
#2 | TEST2: Testowy text zapisany jako blob | BLOB string: 4294967296
Przy czym wartość "4294967296" dostaję nie zależnie jaką wartość dodam jeśli nie będzie w ciapkach(''). Wartość "0x0000000100000000" dostaję zawsze niezależnie jaką wartość podam jeśli jest bez ciapek... więc o co tutaj chodzi!? Co dopiero mówić o konwertowaniu tego jakkolwiek...
To są "przykłady książkowe" bez żadnych moich kombinacji i powinny działać "z automatu" ale nic z tego... obsługa BLOBów w PHP dla ibase to porażka...

Uff, rozgryzłem to... jednak z przykrością stwierdzam że wbudowane funkcje ibase* częściowo nie działają prawidłowo. Jednak korzystając z rad Crozin'a spróbowałem "na chama" wpakować dane do BLOB'a i się udało

Z odczytem już jest lepiej bo działa to tak jak powinno czyli mamy coś takiego:
// ZAPIS
$var_datablob = 'TEST1: Testowy text zapisany jako blob';
$q = "INSERT INTO TMP_TEST(TEST, OBJ) VALUES('$var_datablob','$var_datablob')";
$d = $DB->db->exec($q);
// ODCZYT
$q = "SELECT * FROM TMP_TEST";
$d = $DB->db->query($q);
while( $row = $d->fetchRow(MDB2_FETCHMODE_OBJECT) ) {
$blob_id = ibase_blob_open($row->obj);
$blobinfo = ibase_blob_info($row->obj);
$blobdata = ibase_blob_get($blob_id,$blobinfo[0]); // nasz text 'TEST1: Testowy text zapisany jako blob' !
ibase_blob_close($blob_id); // to musi byc!
}
Nie wiem jeszcze jak się zachowa taki odczyt (czyli całość na raz) dla na prawdę dużych danych, ponoć są z tym problemy, tak samo nie zadziała to gdy w definicji pola BLOB w bazie zadeklarujemy jawnie wielkość segmentu np:
CREATE TABLE test (
ID INTEGER,
OBJ BLOB SUB_TYPE 1 SEGMENT SIZE 80
);
Wtedy należy postępować tak jak w tym komentarzu:
http://www.php.net/manual/pl/function.ibas...b-get.php#60192 i pobierać po kawałku dane zklejając końcowy wynik.
Teraz to dla mnie proste i logiczne ale wcześniej widocznie miałem jakąś zaćmę...
Jeszcze raz dzięki Crozin za pomocne wskazówki!