0

I am using JSON to parse data and connect to a PHP file. I am not sure what the problem is because I am a newbie to flex. This is the error I am receiving:

JSONParseError: Unexpected < encountered
    at com.adobe.serialization.json::JSONTokenizer/parseError()
    at com.adobe.serialization.json::JSONTokenizer/getNextToken()
    at com.adobe.serialization.json::JSONDecoder/nextToken()
    at com.adobe.serialization.json::JSONDecoder()
    at com.adobe.serialization.json::JSON$/decode()
    at DressBuilder2/getPHPData()
    at DressBuilder2/__getData_result()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.rpc.http.mxml::HTTPService/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()
    at mx.rpc::Responder/result()
    at mx.rpc::AsyncRequest/acknowledge()
    at DirectHTTPMessageResponder/completeHandler()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.net::URLLoader/onComplete()

Here is the actual mxml code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  width="535" height="345">
<mx:Script>
<![CDATA[
 import mx.events.DataGridEvent;
 import mx.controls.TextInput;
 import mx.rpc.events.ResultEvent;
 import mx.collections.ArrayCollection;
 import com.adobe.serialization.json.JSON;

 [Bindable]
 private var dataArray:ArrayCollection;

 private function initDataGrid():void
 {
   dataArray = new ArrayCollection();
   getData.send();
 }

 private function getPHPData(event:ResultEvent):void
 {
   var rawArray:Array;
   var rawData:String = String(event.result);
   rawArray = JSON.decode(rawData) as Array;
   dataArray = new ArrayCollection(rawArray);
 }

 private function sendPHPData():void
 {
   var objSend:Object = new Object();
   var dataString:String = JSON.encode(dataArray.toArray());
   dataString = escape(dataString);
   objSend.setTutorials = "true";
   objSend.jsonSendData = dataString;
   sendData.send(objSend);
 }

 private function updatedPHPDataResult(event:ResultEvent):void
 {
   lblStatus.text = String(event.result);
 }

 private function checkRating(event:DataGridEvent):void
 {
   var txtIn:TextInput = TextInput(event.currentTarget.itemEditorInstance);
   var curValue:Number = Number(txtIn.text);
   if(isNaN(curValue) || curValue < 0 || curValue > 10)
   {
     event.preventDefault();
     lblStatus.text = "Please enter a number rating between 0 and 10";
   }
  }
]]>
</mx:Script>
 <mx:HTTPService id="getData" url="http://www.keishalexie.com/imd465/forum.php"
 useProxy="false" method="GET" resultFormat="text"
 result="getPHPData(event)">
<mx:request xmlns="">
  <getTutorials>"true"</getTutorials>
  </mx:request>
</mx:HTTPService>
<mx:HTTPService id="sendData" url="http://www.keishalexie.com/imd465/forum.php"
 useProxy="false" method="GET" resultFormat="text"
 result="updatedPHPDataResult(event)">
</mx:HTTPService>
<mx:Binding source="dgData.dataProvider as ArrayCollection"
 destination="dataArray"/>
<mx:Panel x="0" y="0" width="535" height="345" layout="absolute"
 title="Forum">
  <mx:DataGrid id="dgData" x="10" y="10" width="495" height="241"
   dataProvider="{dataArray}" creationComplete="{initDataGrid()}"
   editable="true" itemEditEnd="{checkRating(event)}">
    <mx:columns>
    <mx:DataGridColumn headerText="Name" dataField="name" editable="false"/>
    <mx:DataGridColumn headerText="Author" dataField="author" width="115"
       editable="false"/>
    <mx:DataGridColumn headerText="Rating" dataField="rating" width="50"
       editable="true" />
  </mx:columns>
  </mx:DataGrid>
 <mx:Button x="10" y="259" label="UpdateDatabase" id="butUpdate"
   click="{sendPHPData()}"/>
   <mx:Label x="140" y="261" id="lblStatus"/>
 </mx:Panel>
 </mx:Application>

Here is the PHP:

<?php
  $USERNAME = '';   //database username
  $PASSWORD = '';    //database password
  $DATABASE = '';   //database name
  $URL = '';        //database location

  if(isset($_GET['getTutorials'])) {
    mysql_connect($URL, $USERNAME, $PASSWORD);
    mysql_select_db($DATABASE) or die('Cannot connect to database.');

    $returnArray = array();

    $query = 'SELECT * FROM Tutorials';
    $result = mysql_query($query);

    while($row = mysql_fetch_assoc($result)) {
      array_push($returnArray, $row);
    }

    mysql_close();
    echo json_encode($returnArray);
  }
  elseif(isset($_GET['setTutorials'])) {
     $jsonString = urldecode($_GET['jsonSendData']);
     $jsonString = str_replace("\\", "", $jsonString);
     $data = json_decode($jsonString, true);

     mysql_connect($URL, $USERNAME, $PASSWORD);
     mysql_select_db($DATABASE) or die('Cannot connect to database.');

     foreach ($data as $tutorialEntry) {
       $query = sprintf(
        'UPDATE Tutorials SET rating = "%s" WHERE id = "%s"',
       mysql_real_escape_string($tutorialEntry['rating']),
       mysql_real_escape_string($tutorialEntry['id']));

       $result = mysql_query($query);

       if(!$result) {
         mysql_close();
         echo mysql_error();
         return;
       }
     }

     mysql_close();
     echo "database updated";
   }
?>

3 Answers 3

2

Visiting http://www.keishalexie.com/imd465/forum.php?getTutorials=1 (Which is what your code is calling) returns

Fatal error: Call to undefined function: json_encode() in /homepages/38/d177816689/htdocs/keishalexie/imd465/forum.php on line 23

Which is not a json document.

Visit http://www.keishalexie.com/imd465/forum.php?getTutorials=1 in your browser as you fix the problem. Then once it looks good there, start working on the FLEX side of things.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks so much--for your tips. Turns out I needed the php-json extension because I was working in an earlier version of PHP. I finally was able to get the PHP working and now am working on the FLEX.
1

Looks like you have an unexpected < in your JSON data, sounds like you're getting html back from the server instead of nice clean JSON.

Use firebug, or a http headers tool to examine the response from the server (or just load up the url in a browser) and see what the response is.

You might need to disable error logging when outputting your JSON data, or if you are using a templating system, not use it when sending JSON.

2 Comments

I am using the as3corelib 92.1, so I am not sure where to check or log for an additional < in the code.
Use firebug, here is a quick guide about firebug. ibm.com/developerworks/web/library/wa-aj-firebug/…
0

Looks like your web server is throwing an HTML error page. So, yeah.. Log the JSON you're trying to parse or put a breakpoint before parsing and see what the content is that you're trying to parse.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.