Array Index is Out of Range: Connecting to Database

Ah, help? Error occurs about halfway down…

EDIT: I’ve put the whole script in here for context, just in case. That being said, there’s a repeated chunk of text halfway down that says “THIS IS WHERE THE ERROR KICKS IN” to make it easy to see the actual troublesome part.

public var MarkerHolder:GameObject;
public var prefabMarker:GameObject;
public var cameraPivot:GameObject;
public var MainCamera:GameObject;

private var makePinURL:String = "makePin.php";
private var getPinsURL:String = "getPins.php";


private var parsedData_HT:Hashtable;
private var rawVectorData:Hashtable;

private var output:String;

// These are three string variables that will hold
// out GUI input values before they are sent to PHP/DB 
private var inputXString:String;
private var inputYString:String;
private var inputZString:String;

function Start () {
 inputXString = "";
  inputYString = "";
 inputZString = "";
 output = ""; 
 // retrieve the data from the server
 yield requestData(getPinsURL);
 //
 parseVectorPointData(parsedData_HT);
} 

function Update () {
}

function OnGUI () {
 GUI.Label(new Rect(10, 400, 600, 50), output);
 // Capture user input
 inputXString = GUI.TextField(new Rect(10, 10, 200, 20), inputXString);
 inputYString = GUI.TextField(new Rect(10, 30, 200, 20), inputYString);
 inputZString = GUI.TextField(new Rect(10, 50, 200, 20), inputZString);
 if (GUI.Button(new Rect(10, 80, 100, 20), "Submit")) {
 SubmitClicked();
 }
}

function SubmitClicked() {
 // Retrieve input data from front end
 var xVal:String = inputXString;
 var yVal:String = inputYString;
 var zVal:String = inputZString;
 
 // Create form data to POST to PHP
 var formData:WWWForm = new WWWForm();
 formData.AddField("xPos", xVal);
 formData.AddField("yPos", yVal);
 formData.AddField("zPos", zVal);
 // add data to the DB
 yield requestData(makePinURL, formData);
 // retrieve the data from the server
 yield requestData(getPinsURL); 
 // Parse the data and create the markers in the scene
 parseVectorPointData(parsedData_HT);
 // Move the pivot to center the camera on the newly created marker 
 // (uses iTween plugin in Plugin folder) 
 var newPivot:Vector3 = new Vector3(parseFloat(inputXString),parseFloat(inputYString), parseFloat(inputZString));
 iTween.MoveTo(cameraPivot,iTween.Hash("position",newPivot,"time",2,"onupdate","repositionCameraNoMouse","onupdatetarget", MainCamera));
 Debug.Log("Submit clicked!");
}


function parseVectorPointData(vect3Data:Hashtable) {
 Debug.Log("parseVectorPointData");
 
 
 // Clear old markers
 for (var h:int = MarkerHolder.transform.childCount - 1; h >= 0; h--) {
 Destroy(MarkerHolder.transform.GetChild(h).gameObject);
 }
 
 
 
 // Cycle through the retrieved data and create visual representation
 // of each object that is positioned in 3D space
 for (var de:DictionaryEntry in vect3Data) {
 
 // The data currently returned for each index is a series of three values
 // x, y, z (Vector3). Data must be split; comma is split point
 var parsedValueString:String[] = de.Value.Split([','], System.StringSplitOptions.None);
 
 // convert each point from a string to a float value e.g., '1' -> 1
 var xVal:float = parseFloat(parsedValueString[0]);
 var yVal:float = parseFloat(parsedValueString[1]);
 var zVal:float = parseFloat(parsedValueString[2]);
 
 
 // store values in vector3 for use in Instantiate
 var v3:Vector3 = new Vector3(xVal, yVal, zVal);
 
 // Create a new marker for data point
 var marker:GameObject = Instantiate(prefabMarker, v3,  Quaternion.identity);
 // Make the marker a child of the MarkerHolder object already in the scene Hierarchy
 marker.transform.parent = MarkerHolder.transform;
 
 
 }
 
}

//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
//THIS IS WHERE THE ERROR KICKS IN
// Use this for parsing string or URL encoded text
function parseData (stringToParse:String):Hashtable {
 var unparsedString:String = stringToParse;
 var parsedString:String[] = unparsedString.Split(['&'], System.StringSplitOptions.None);
 var parsedData:Hashtable = new Hashtable();
 for (var i:int = 0; i < parsedString.Length; i++) {
 Debug.Log(parsedString*);*

var nameValuePair:String = parsedString*;*
var parsedNameValueString:String[] = nameValuePair.Split([‘=’], System.StringSplitOptions.None);
parsedData.Add(parsedNameValueString[0], parsedNameValueString[1]);
}
// Output the name value pairs
for (var de:DictionaryEntry in parsedData) {
Debug.Log("Key = " + de.Key + " : Value = " + de.Value);
}
return parsedData;
}

function requestData(url:String) {
var wwwRequest:WWW = new WWW(url);

// Wait for download to complete
yield wwwRequest;

//output = wwwRequest.text;
output = ‘’;

// Parse the data
parsedData_HT = parseData(wwwRequest.text);

/for (var de:DictionaryEntry in parsedData_HT) {
output += ("Key = " + de.Key + " : Value = " + de.Value);
_}/_

Debug.Log(“Succes: Request Data String”);
}

function requestData(url:String, wwwForm:WWWForm) {
var wwwRequest:WWW = new WWW(url, wwwForm);

// Wait for download to complete
yield wwwRequest;

//output = wwwRequest.text;
output = ‘’;

// Parse the data
parsedData_HT = parseData(wwwRequest.text);

/* for (var de:DictionaryEntry in parsedData_HT) {
output += ("Key = " + de.Key + " : Value = " + de.Value);
}*/
Debug.Log(“Succes: Request Data String WWWForm”);
}

/*
//
// Object Rotation
// These functions are called by the ObjectBroadcaster.js script
// They originate on the markers but could be attached to any other GameObject
//
*/

function OnMouseDragged(go:GameObject) {
Debug.Log(“Dragged”);
gameObject.BroadcastMessage(“repositionCamera”, 0.0F);
}
function OnObjectClicked(tr:Transform) {
output = tr.position.ToString();
iTween.MoveTo(cameraPivot,iTween.Hash(“position”,tr.position,“time”,2,“onupdate”,“repositionCameraNoMouse”,“onupdatetarget”, MainCamera));
}
Thanks in advance!
- ess

This probably occurs because you’re hard-code-accessing elements 0 and 1 amongst the tokens which should be a result of a String.Split on the character ‘=’ on the string called nameValuePair.

Specifically, these two lines of code:

var parsedNameValueString:String[] = nameValuePair.Split(['='], System.StringSplitOptions.None);
 parsedData.Add(parsedNameValueString[0], parsedNameValueString[1]);

There’s nothing wrong with that per se, but it raises strict requirements about the nature of the received string. What happens if the string stored in nameValuePair does not contain a “=”-character? Then String.Split on ‘=’ returns only one element, and then accessing element at index 1 throws the exception you’re getting.

Examine each instance of nameValuePair to make sure it does indeed contain a =. You seem to be doing so already - you’re printing each of them to the console using Debug.Log. What do they contain?