Вставка большого текста в блоб

Я долго пытался найти решение этой проблемы, и нигде в Интернете я не смог найти ответ. У меня есть такая ситуация, когда мне нужно вставить или обновить поле BLOB-объектов (подтип 1) из базы данных Firebird с помощью php. Проблема в том, что когда текст становится действительно большим> 36k, он не выполняет запрос. Я знаю, что строковые запросы ограничены 32 КБ данных, и я пытался использовать параметризованные запросы в C #, но я не смог найти что-то, что могло бы работать для меня в PHP. Даже близко к работе.

Я пробовал с ibase_blob_Create и так далее, я попытался вставить прямо как Insert into table (blob_value) values (?), ibase_prepare это и так далее. Ничто, кажется, не работает для меня. Есть ли какой-то волшебный способ заставить это работать в php или просто невозможно получить большой текст в blob из php?

Я пытался использовать такие вещи, как:

class DBMgmt_Ibase_Blob extends DBMgmt_Generic_Blob
{
var $blob; // resourse link
var $id;
var $database;

function DBMgmt_Ibase_Blob(&$database, $id=null)
{
$this->database =& $database;
$this->id = $id;
$this->blob = null;
}

function read($len)
{
if ($this->id === false) return ''; // wr-only blob
if (!($e=$this->_firstUse())) {
return $e;
}

$data = @ibase_blob_get($this->blob, $len);
if ($data === false) return $this->_setDbError('read');
return $data;
}

function write($data)
{
if (!($e=$this->_firstUse())) return $e;
$ok = @ibase_blob_add($this->blob, $data);
if ($ok === false) return $this->_setDbError('add data to');
return true;
}

function close()
{
if (!($e=$this->_firstUse())) return $e;
if ($this->blob) {
$id = @ibase_blob_close($this->blob);
if ($id === false) return $this->_setDbError('close');
$this->blob = null;
} else {
$id = null;
}
return $this->id ? $this->id : $id;
}

function length()
{
if ($this->id === false) return 0; // wr-only blob
if (!($e=$this->_firstUse())) return $e;
$info = @ibase_blob_info($this->id);
if (!$info) return $this->_setDbError('get length of');
return $info[0];
}

function _setDbError($query)
{
$hId = $this->id === null ? "null" : ($this->id === false ? "false" : $this->id);
$query = "-- $query BLOB $hId";
$this->database->_setDbError($query);
}

// Called on each blob use (reading or writing).
function _firstUse()
{
// BLOB is opened - nothing to do.
if (is_resource($this->blob)) return true;
// Open or create blob.
if ($this->id !== null) {
$this->blob = @ibase_blob_open($this->id);
if ($this->blob === false) return $this->_setDbError('open');
} else {
$this->blob = @ibase_blob_create($this->database->link);
if ($this->blob === false) return $this->_setDbError('create');
}
return true;
}
}

Который я использую так:

 $text = new DBMgmt_Ibase_Blob($DB);
if (!$text->write(htmlspecialchars($Data["Text"]))){
throw new Exception("blob fail");
}
$blobid = $text->close();
//similar query
$DB->query("INSERT INTO TABLE1 (BLOB_VALUE) VALUES (?)",$blobid);

После этого в своей базе данных я нахожу номер, который, как я знаю, должен использовать:

Blob = new DBMgmt_Ibase_Blob($DB,$data->Text);
$data->Text = $Blob->read($Blob->length());

Но я получаю, что String не является BLOB-идентификатором с номером в базе данных, например 30064771072.

Я пытался напрямую добавить его, но, конечно, это не работает

$DB->query('insert into table (blob) values (?)',$string); // where string is like 170k chars

Я получаю ошибку Ошибка динамического SQL Код ошибки SQL = -104 Неожиданный конец командной строки 1, столбец 236

Я попытался положить его в файл по ссылке php.net php.net blob_import с кодом, похожим на это:

$dbh = ibase_connect($host, $username, $password);
$filename = '/tmp/bar';

$fd = fopen($filename, 'r');
if ($fd) {

$blob = ibase_blob_import($dbh, $fd);
fclose($fd);

if (!is_string($blob)) {
// import failed
} else {
$query = "INSERT INTO foo (name, data) VALUES ('$filename', ?)";
$prepared = ibase_prepare($dbh, $query);
if (!ibase_execute($prepared, $blob)) {
// record insertion failed
}
}
} else {
// unable to open

Но я все еще получаю результат, как метод написания блобов.

1

Решение

Вам нужно использовать параметры:

$query = ibase_prepare($DB, 'insert into table (blob) values (?)');
ibase_execute($query, $string);

ср: http://php.net/manual/en/function.ibase-execute.php

0

Другие решения

Других решений пока нет …