Edit report at https://bugs.php.net/bug.php?id=62361&edit=1
ID: 62361 Comment by: a...@php.net Reported by: lgynove at 163 dot com Summary: SQLite3::escapeString Status: Open Type: Bug Package: SQLite related Operating System: windows xp PHP Version: 5.3.14 Block user comment: N Private report: N New Comment: Ok, after digging into the subject i've found sqlite3_bind_blob() here http://www.sqlite.org/c3ref/bind_blob.html . This functionality fully replaces sqlite2's sqlite_encode_binary() in sqlite3. As I can see, it's also implemented and available in PHP http://de2.php.net/manual/de/sqlite3stmt.bindparam.php . It looks pretty much like if we want to have the old behaviour, we should take encode.c from PECL. A sticky point here - I'm not sure that the encoding algorithms are equivalent in both 2 and 3. So we would need also something like ->unescapeString() to get the data back. That could be useful in some cases but anyway redundant in sqlite3. What do you think? Previous Comments: ------------------------------------------------------------------------ [2012-06-27 14:41:49] a...@php.net Ah, now I see what you mean. php_sqlite_encode_binary in the PECL code, strange it wasn't moved into sqlite3. ------------------------------------------------------------------------ [2012-06-27 13:57:55] fel...@php.net But we have implemented an auxiliar escaping routine to escape the binary ones, as pointed out by the reporter. ------------------------------------------------------------------------ [2012-06-27 13:42:50] a...@php.net That's not a php bug i'd say. We rely here on the functionality of http://www.sqlite.org/c3ref/mprintf.html using %q format option. And what their manual says --- The %q option works like %s in that it substitutes a nul-terminated string from the argument list. But %q also doubles every '\'' character. %q is designed for use inside a string literal. By doubling each '\'' character it escapes that character and allows it to be inserted into the string. --- Escaping '\'' and '\0' can be of course easily implemented. But, as sqlite3 itself has no other string formatting options, I'd really doubt the usefulness and correctness of such an implementation. Furthermore, if such a data would be selected back from the db, some code would be needed to restore all that escaped '\0' bytes and whatever else. It might make sense to use base64 or alike to insert binary data into sqlite3 i think. ------------------------------------------------------------------------ [2012-06-24 21:05:17] fel...@php.net In fact actually escapeString() method is not binary-safe. ------------------------------------------------------------------------ [2012-06-19 05:28:29] lgynove at 163 dot com Description: ------------ this bug in sqlite3,not sqlite. use picture file (*.jpg) is not work use *.txt is work ok if use sqlite function (sqlite_escape_string) is work ok! Test script: --------------- $db = new sqlite3(dirname(__FILE__) . '/test.sqlite'); $str = file_get_contents('d:/www/test.jpg'); echo strlen($str),"\n"; $str = $db->escapeString($str); echo strlen($str),"\n"; $str = file_get_contents('d:/www/test.txt'); echo strlen($str),"\n"; $str = $db->escapeString($str); echo strlen($str),"\n"; Expected result: ---------------- 5000 5000 35 35 Actual result: -------------- 5000 4 35 35 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62361&edit=1