#35155 [Opn->Asn]: prepared statement with blob field does not work

2005-11-11 Thread sniper
 ID:   35155
 Updated by:   [EMAIL PROTECTED]
 Reported By:  f dot engelhardt at 21torr dot com
-Status:   Open
+Status:   Assigned
 Bug Type: MySQLi related
 Operating System: Linux 2.6
 PHP Version:  5CVS-2005-11-09 (snap)
 Assigned To:  georg
 New Comment:

Georg, see the feedback.


Previous Comments:


[2005-11-11 11:33:32] f dot engelhardt at 21torr dot com

case MYSQL_TYPE_VAR_STRING:
convert_to_string_ex(&stmt->param.vars[i]);
stmt->stmt->params[i].buffer = Z_STRVAL_PP(&stmt->param.vars[i]);
stmt->stmt->params[i].buffer_length =
strlen(Z_STRVAL_PP(&stmt->param.vars[i]));
break;

php-5.0.5/ext/mysqli/mysqli_api.c:574

This line is the problem, you can not use strlen to read the length of
binary data, or this convert_to_string_ex() function destroys the
data.

Kind regards

Florian Engelhardt



[2005-11-11 11:18:27] f dot engelhardt at 21torr dot com

Hello,

i have a hint for you: The size inserted into the database is exactly
the size, that strlen() returns, BUT: strlen stops on  the first \0 and
in a real binary file, this sign can be everywhere, not just at the end.
In your case, i 
found this:

php-5.0.5/ext/mysqli/mysqli_api.c:161

case 's': /* string */
bind[ofs].buffer_type = MYSQL_TYPE_VAR_STRING;
bind[ofs].buffer = NULL;
bind[ofs].buffer_length = 0;
bind[ofs].is_null = &stmt->param.is_null[ofs];

I tried this, and i found out, that it works with
MYSQL_TYPE_VAR_STRING, but you have to specify the length. If i insert
the right lengt, everything works as expected.

So you just have to define the length for the data that is in the bound
variable.

Kind regards

Florian Engelhardt



[2005-11-11 09:55:55] f dot engelhardt at 21torr dot com

Well, i allready tried this:



Exaclty the same problem.

Fix it.

Kind Regards

Florian Engelhardt



[2005-11-11 08:51:46] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

from http://www.php.net/mysql_stmt_bind_param

Character Description
b corresponding variable is a blob and will be send in
packages

For sending a blob in packages, you have to use
mysql_stmt_send_long_data. If you don't want to do this (e.g. your data
doesn't need escaping and is < max_allowed_package) use type "s"
(=string).



[2005-11-09 16:07:10] f dot engelhardt at 21torr dot com

This Problem is very annoying, becouse i am using innodb tables with
foreign key constraints, and if i use mysqli_stmt_send_long_data() for
any of the fields, all the other arent NULL anymore. So my constraint
fails!

Example:


without mysqli_stmt_send_long_data() i have the problem as described,
and with mysqli_stmt_send_long_data() on the blob field, mysql tells
me, that the constraint gets violated!
This can only happen, if the variables $one and $two are not  NULL.



The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/35155

-- 
Edit this bug report at http://bugs.php.net/?id=35155&edit=1


#35155 [Opn->Asn]: prepared statement with blob field does not work

2005-11-08 Thread sniper
 ID:   35155
 Updated by:   [EMAIL PROTECTED]
 Reported By:  f dot engelhardt at 21torr dot com
-Status:   Open
+Status:   Assigned
 Bug Type: MySQLi related
 Operating System: Linux 2.6
-PHP Version:  5.0.5
+PHP Version:  5CVS-2005-11-09 (snap)
-Assigned To:  
+Assigned To:  georg
 New Comment:

Assigned to the maintainer.


Previous Comments:


[2005-11-08 23:26:59] f dot engelhardt at 21torr dot com

it doesn´t work, but the behavior changed a little:
Every insert without mysqli_stmt_send_long_data()
inserts 0 Bytes into the blob field, with this function
it works as in the other version (5.0.5)



[2005-11-08 17:43:53] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip





[2005-11-08 17:06:50] f dot engelhardt at 21torr dot com

it seems to work with mysqli_stmt_send_long_data(), but it has to work
without, as the doc says, you only have to use it, if you send data
larger than max_allowed_packet. This value is set to 16M, that data is
only 2mb.

Kind regards



[2005-11-08 17:06:19] [EMAIL PROTECTED]

RTFM:

http://www.php.net/manual/en/function.mysqli-stmt-send-long-data.php



[2005-11-08 15:29:36] f dot engelhardt at 21torr dot com

Description:

Inserting a data into a blob column only inserts some of the data, in
most cases between 1 and 200 Bytes, but not allways the same and never
all data (which is in this case about 2 mb). I also tried it with
mysqli_stmt_send_long_data(), but that was not working either.

The table is as followes:

CREATE TABLE `dbfs_data_chunk` (
  `fileid` smallint(5) unsigned NOT NULL,
  `version` smallint(5) unsigned NOT NULL default '0',
  `data` mediumblob,
  PRIMARY KEY  (`fileid`,`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL-Version: 5.0.15

If i do a base64_encode() it works, but this isn´t a solution, only a
bad workaround, which is not acceptable.

I also tried MyISAM, the same result.

Reproduce code:
---


Expected result:

Should insert the binary data into the table

Actual result:
--
only 1 to 200 Bytes get inserted.





-- 
Edit this bug report at http://bugs.php.net/?id=35155&edit=1