AMFPHP issue referencing ByteArray

Recently I made some test in AMFPHP sending an retrieving ByteArray to be stored in a mysql blob field.

But suddenly I encounter a problem when I was trying to return an array of ByteArrays and I could not find out the reason flash continued to show me this error:

The php file which was generating this error was:

class Service
{
public function getArray( )
{
$GLOBALS['amfphp']['encoding'] = 'amf3';
$a = new ByteArray("\x00\x10this is a string");
$b = new ByteArray("\x00\x16this is another string");
$c = $a;
return array( $a, $b, $c );
}
}

While the Actionscript test class was:

package
{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
import flash.utils.ByteArray;

public class test extends Sprite
{
private var nc: NetConnection;
private var rsp: Responder;

public function test()
{
rsp = new Responder( onResult, null );
nc = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF3;
nc.connect( "http://localhost/amfphp/trunk/gateway.php" );
nc.call( "test.bytearray.Service.getArray", rsp );
}

private function onResult( e: * ): void
{
if ( e is Array )
{
for each ( var b: ByteArray in( e as Array ) )
{
trace( 'reading bytearray...' );
b.position = 0;
trace( b.readUTF() );
}
}
}
}
}


After some investigation I found that the error was into the AMFSerializer.php file in the writeAmf3ByteArray method which doesn’t reference correctly the bytearray objects.

Thus I made a little modification and after that I succeeded to retrieve correctly the bytearray list ( with the 3rd element as reference of the first one ).

Here you can download the patch file, if you want to test the modification ( at your own risk 🙂 ). The patch has been created using the last svn version of amfphp and you can apply the patch with the following command:
patch -p0 -i bytearray.patch

Charset handling proposal in AMFPHP

Patrick Mineault makes a proposal for the charset handling in AMFPHP

[..] that should put an end to problems with Unicode and native character set handling between PHP and Flash, a problem that has palgued AMFPHP for a long time

To use charset handling in the new CVS version, you will need to call the setCharsetHandler function from your gateway.php file, like this:

$gateway->setCharsetHandler("iconv", "latin1", "latin1");

Detail for setCharsetHandler method: setCharsetHandler(string mode, string phpCharset, string sqlCharset) The mode can be: 1. none (don’t do anything) 2. iconv (uses the iconv libray for reencoding) 3. mbstring (uses the mbstring library for reencoding) 4. recode (uses the recode library for reencoding) 5. utf8_decode (uses the XML function utf8_decode and encode for reencoding – ISO-8859-1 only) I haven’t tested it already, but I’m sure this is a great step toward a solution of the charset problem!

http://www.amfphp.org/wiki/doku.php?id=charset_issue