sqlite_udf_encode_binary

(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)

sqlite_udf_encode_binaryКодирует бинарные данные перед тем как вернуть их из UDF

Описание

string sqlite_udf_encode_binary ( string $data )

sqlite_udf_encode_binary() кодирует бинарные данные data таким образом, что они могут быть возвращены в качестве результата запроса (так как библиотека libsqlite небезопасна для обработки бинарных данных).

Если данные могут быть бинарно-небезопасными (например, содержать NUL в середине строки или байт 0x01 в начале строки), то такие данные следует закодировать этой функцией перед тем, как возвращать их из вашей UDF.

PHP не осуществляет данные операции кодирования и декодирования автоматически, так как это негативно сказывается на производительности.

Замечание:

Не используйте функцию sqlite_escape_string() для экранирования строк, возвращаемых из UDF, так как это приведет к двойному экранированию. Используйте вместо этого sqlite_udf_encode_binary() !

Список параметров

data

Кодируемая строка (string).

Возвращаемые значения

Закодированная строка (string).

Смотрите также

  • sqlite_udf_decode_binary() - Декодирует бинарные данные, переданные в качестве параметров в UDF
  • sqlite_escape_string() - Экранирует спецсимволы в строке для использования в запросе
  • sqlite_create_function() - Регистрирует "стандартную" функцию (UDF) для использования в SQL-запросах
  • sqlite_create_aggregate() - Регистрирует агрегирующую функцию для использования в SQL-запросах

Коментарии

Автор:
I wrote a script to transfer my old data from a mysql database, performing some changes to a sqlite3 database. When I realized that that the sqlite interfaces is no longer included in PHP and my PECL didn't get it installed it was too late. 

However, there is a very easy, though not particularly performant way to get the job done like in the "sqlite_encode_blob" function I present below. Note that this does ONLY encode the data. To actually use it in a query you will have to wrap it like: X'data' See the example below.

#!/usr/bin/php
<?php
function sqlite_encode_blob($data) {
       
$result "";
        for (
$i 0$i strlen($data); $i++) {
               
$result .= sprintf("%02X"ord(substr($data$i1)));
        }
        return 
$result;
}

error_reporting(E_ALL);
$original "62.jpg";
$data file_get_contents($original);
$before microtime(true);
$encodedData sqlite_encode_blob($data);
$after microtime(true);
unset(
$data);
echo 
"Encoding time needed: ".($after $before)." seconds.\n";

$sql = <<<QUERY
BEGIN;
CREATE TABLE test(test BLOB);
INSERT INTO test(test) VALUES ( X'$encodedData' );
COMMIT;
QUERY;
unset(
$encodedData);

file_put_contents("test.sql"$sql);
`
sqlite3 blob_test.db < test.sql`
?>

The tricky part is to get the data back out of the database - that is not possible with the command line tool as far as I can tell. You will have to use a language with an actual API.

The following example is written in C and compiles on a linux box where the sqlite3 API is installed using:
gcc -o test test.c `pkg-config --cflags --libs sqlite3`
Note that this has absolutely no error checking whatsoever. If the slightest thing goes wrong it will likely cause a segmentation fault and likely leave the database corrupted.

# FILE test.c START
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>
#define DB_FILE "blob_test.db"
#define QUERY_STRING "SELECT data FROM test"
#define STORAGE_FILE "test.jpg"

int main(int argc, char** argv) {
        sqlite3 *db = NULL;
        int size = 0;
        const char *data = NULL;
        sqlite3_stmt *query = NULL;
        const char *rest = NULL;
        FILE *file = NULL;
        sqlite3_open(DB_FILE, &db);
        sqlite3_prepare_v2(db, QUERY_STRING, sizeof(QUERY_STRING), &query, &rest);
        sqlite3_step(query);
        size = sqlite3_column_bytes(query, 0);
        data = sqlite3_column_blob(query, 0);
        file = fopen(STORAGE_FILE, "w");
        fwrite(data, 1, size, file);
        fclose(file);
        sqlite3_finalize(query);
        sqlite3_close(db);
        return 0;
}

# FILE test.c END
2013-05-07 00:57:54
http://php5.kiev.ua/manual/ru/function.sqlite-udf-encode-binary.html

    Поддержать сайт на родительском проекте КГБ