Titanium - PHP+JSON 错误解析
Titanium - PHP+JSON error parsing
我正在开发一个简单的应用程序来登录面板,与 Mysql 数据库进行交互。
在我的应用程序中创建一个 HTTP 客户端来登录或注册新用户。
进入index.js
我放了登录代码,在newuser.js
我放了注册代码。
我创建了一个 HTTP 客户端来注册新用户,在 newuser.js
createReq = Titanium.Network.createHTTPClient();
createReq.onload = function() {
Titanium.API.info("Start onload");
var jsonReg = this.responseText;
var resultReg = JSON.parse(jsonReg);
Titanium.API.info("Start IF");
if (resultReg.registered == false) {
alert('utente esistente');
$.view_indicator.hide();
Titanium.API.info("user NOT registered");
} else if(resultReg.registered == true) {
alert('utente NON esistente');
$.view_indicator.hide();
Titanium.API.info("user registered");
}
}
function createUser () {
if ( $.user.value != '' && $.pass.value != '' && $.pass_check.value != '' && $.name.value != '' && $.email.value != '' ) {
if ($.pass.value != $.pass_check.value) {
alert("Le password non coincidono.")
} else {
if (!check_email($.email.value)) {
alert("Inserisci una email valida");
} else {
createReq.open("POST", "http://solimeo.sviluppofacile.it/register.php");
var params = {
username: $.user.value,
password: Ti.Utils.md5HexDigest($.pass.value),
name: $.name.value,
email: $.email.value
};
$.view_indicator.show();
createReq.send(params);
};
$.user.blur();
$.pass.blur();
$.pass_check.blur();
$.name.blur();
$.email.blur();
};
} else {
alert("Tutti i campi sono obbligatori!");
};
}
本例中的 JSON 数据来自此 PHP 页面,register.php
<?php
include ('connection.php');
$username = $_POST['username'];
$password = $_POST['password'];
$name = $_POST['name'];
$email = $_POST['email'];
$sql = "SELECT username,email FROM users WHERE username = '" . $username . "' OR email = '" . $email . "'";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
$response = array('registered' => false, 'message' => 'Utente che esiste');
echo json_encode($response);
} else {
$insert = "INSERT INTO users (username,password,name,email) VALUES ('" . $username . "','" . $password . "','" . $name . "','" . $email . "')";
$query = mysql_query($insert);
if ($query) {
//echo "Utente correttamente registrato! Puoi ora loggarti.";
$response = array('registered' => true, 'message' => 'Utente correttamente registrato! Puoi ora loggarti.');
echo json_encode($response);
} else {
//echo "Registrazione fallita";
$response = array('registered' => false, 'message' => 'Registrazione fallita.');
echo json_encode($response);
}
}
mysql_close($connect) or die (mysql_error());
?>
但是如果我尝试注册一个已经存在的用户,我会遇到这个错误
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] : XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
[ERROR] : XMLModule: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] : XMLModule: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] : XMLModule: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] : XMLModule: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] : XMLModule: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] : XMLModule: at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] : XMLModule: at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] : XMLModule: at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] : XMLModule: at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] : XMLModule: at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] : XMLModule: at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] : XMLModule: at android.os.Looper.loop(Looper.java:146)
[ERROR] : XMLModule: at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
[ERROR] : TiHttpClient: (KrollRuntimeThread) [1,49753] Error parsing XML
[ERROR] : TiHttpClient: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] : TiHttpClient: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] : TiHttpClient: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] : TiHttpClient: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] : TiHttpClient: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] : TiHttpClient: at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] : TiHttpClient: at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] : TiHttpClient: at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] : TiHttpClient: at android.os.Looper.loop(Looper.java:146)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
问题出在onload
方法的开头:Titanium.API.info("Start onload");
之后的错误returns
似乎是JSON结构的问题,但我已经尝试验证它,没问题。
在 index.js
中,我使用相同的模式登录,我没问题。
编辑: 我已经解决了问题...
找出不同之处:
1) 您正在发送 JSON
echo json_encode($response);
2) 代码需要 XML:
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] : XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
^^^
和
[ERROR] : XMLModule: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"regi
^^^^^^^---xml parser
trying to handle JSON ---^^^^^^
我已经解决了问题。
这不是期望 XML 的代码问题:它的输出具有误导性。
第一条消息说
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
在 "token" 之后有一个 space!!!
如果我在控制台中打印由 this.responseText
传递的字符串的每个字符,我可以看到两个 space:一个在开头,一个在结尾。
第一个 space 导致解析错误。第二个space无关紧要,因为它在最后。
这很奇怪,因为在其他 js index.js
中,我使用了相同的 iter,this.responseText
传递的字符串在 space 处没有开头,但结尾有两个 space。然而,最后的 spaces 是无关紧要的,所以在这种情况下,我的调用没有问题。
所以我用一个 cicle 在我的字符串中取 {
的索引,然后我在开始时使用了没有 spaces 的字符串。
createReq.onload = function() {
var response = this.responseText;
var i;
for ( i=0; i < this.responseText.length; i++) {
if (this.responseText[i] == "{")
break;
};
response = response.slice(i,response.length);
resultReg = JSON.parse(response);
if (resultReg.registered==false) {
// the rest of code
// .....
我选择了这个解决方案,因为 space 似乎是随便输入的。
可能是 HTTPClient 的响应管理存在一些问题。我想我也会联系 Appcelerator。
反正现在好了
我正在开发一个简单的应用程序来登录面板,与 Mysql 数据库进行交互。 在我的应用程序中创建一个 HTTP 客户端来登录或注册新用户。
进入index.js
我放了登录代码,在newuser.js
我放了注册代码。
我创建了一个 HTTP 客户端来注册新用户,在 newuser.js
createReq = Titanium.Network.createHTTPClient();
createReq.onload = function() {
Titanium.API.info("Start onload");
var jsonReg = this.responseText;
var resultReg = JSON.parse(jsonReg);
Titanium.API.info("Start IF");
if (resultReg.registered == false) {
alert('utente esistente');
$.view_indicator.hide();
Titanium.API.info("user NOT registered");
} else if(resultReg.registered == true) {
alert('utente NON esistente');
$.view_indicator.hide();
Titanium.API.info("user registered");
}
}
function createUser () {
if ( $.user.value != '' && $.pass.value != '' && $.pass_check.value != '' && $.name.value != '' && $.email.value != '' ) {
if ($.pass.value != $.pass_check.value) {
alert("Le password non coincidono.")
} else {
if (!check_email($.email.value)) {
alert("Inserisci una email valida");
} else {
createReq.open("POST", "http://solimeo.sviluppofacile.it/register.php");
var params = {
username: $.user.value,
password: Ti.Utils.md5HexDigest($.pass.value),
name: $.name.value,
email: $.email.value
};
$.view_indicator.show();
createReq.send(params);
};
$.user.blur();
$.pass.blur();
$.pass_check.blur();
$.name.blur();
$.email.blur();
};
} else {
alert("Tutti i campi sono obbligatori!");
};
}
本例中的 JSON 数据来自此 PHP 页面,register.php
<?php
include ('connection.php');
$username = $_POST['username'];
$password = $_POST['password'];
$name = $_POST['name'];
$email = $_POST['email'];
$sql = "SELECT username,email FROM users WHERE username = '" . $username . "' OR email = '" . $email . "'";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
$response = array('registered' => false, 'message' => 'Utente che esiste');
echo json_encode($response);
} else {
$insert = "INSERT INTO users (username,password,name,email) VALUES ('" . $username . "','" . $password . "','" . $name . "','" . $email . "')";
$query = mysql_query($insert);
if ($query) {
//echo "Utente correttamente registrato! Puoi ora loggarti.";
$response = array('registered' => true, 'message' => 'Utente correttamente registrato! Puoi ora loggarti.');
echo json_encode($response);
} else {
//echo "Registrazione fallita";
$response = array('registered' => false, 'message' => 'Registrazione fallita.');
echo json_encode($response);
}
}
mysql_close($connect) or die (mysql_error());
?>
但是如果我尝试注册一个已经存在的用户,我会遇到这个错误
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] : XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
[ERROR] : XMLModule: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] : XMLModule: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] : XMLModule: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] : XMLModule: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] : XMLModule: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] : XMLModule: at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] : XMLModule: at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] : XMLModule: at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] : XMLModule: at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] : XMLModule: at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] : XMLModule: at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] : XMLModule: at android.os.Looper.loop(Looper.java:146)
[ERROR] : XMLModule: at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
[ERROR] : TiHttpClient: (KrollRuntimeThread) [1,49753] Error parsing XML
[ERROR] : TiHttpClient: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"registered":fa...@2:1 in java.io.InputStreamReader@429a8648)
[ERROR] : TiHttpClient: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
[ERROR] : TiHttpClient: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
[ERROR] : TiHttpClient: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:82)
[ERROR] : TiHttpClient: at ti.modules.titanium.xml.XMLModule.parse(XMLModule.java:68)
[ERROR] : TiHttpClient: at ti.modules.titanium.network.TiHTTPClient.getResponseXML(TiHTTPClient.java:700)
[ERROR] : TiHttpClient: at ti.modules.titanium.network.HTTPClientProxy.getResponseXML(HTTPClientProxy.java:107)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.runtime.v8.V8Object.nativeCallProperty(Native Method)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.runtime.v8.V8Object.callProperty(V8Object.java:73)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1121)
[ERROR] : TiHttpClient: at android.os.Handler.dispatchMessage(Handler.java:98)
[ERROR] : TiHttpClient: at android.os.Looper.loop(Looper.java:146)
[ERROR] : TiHttpClient: at org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)
问题出在onload
方法的开头:Titanium.API.info("Start onload");
似乎是JSON结构的问题,但我已经尝试验证它,没问题。
在 index.js
中,我使用相同的模式登录,我没问题。
编辑: 我已经解决了问题...
找出不同之处:
1) 您正在发送 JSON
echo json_encode($response);
2) 代码需要 XML:
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
[ERROR] : XMLModule: (KrollRuntimeThread) [46894,49752] Error parsing XML
^^^
和
[ERROR] : XMLModule: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"regi
^^^^^^^---xml parser
trying to handle JSON ---^^^^^^
我已经解决了问题。
这不是期望 XML 的代码问题:它的输出具有误导性。
第一条消息说
[ERROR] : V8Exception: Exception occurred at undefined:1: Uncaught SyntaxError: Unexpected token
在 "token" 之后有一个 space!!!
如果我在控制台中打印由 this.responseText
传递的字符串的每个字符,我可以看到两个 space:一个在开头,一个在结尾。
第一个 space 导致解析错误。第二个space无关紧要,因为它在最后。
这很奇怪,因为在其他 js index.js
中,我使用了相同的 iter,this.responseText
传递的字符串在 space 处没有开头,但结尾有两个 space。然而,最后的 spaces 是无关紧要的,所以在这种情况下,我的调用没有问题。
所以我用一个 cicle 在我的字符串中取 {
的索引,然后我在开始时使用了没有 spaces 的字符串。
createReq.onload = function() {
var response = this.responseText;
var i;
for ( i=0; i < this.responseText.length; i++) {
if (this.responseText[i] == "{")
break;
};
response = response.slice(i,response.length);
resultReg = JSON.parse(response);
if (resultReg.registered==false) {
// the rest of code
// .....
我选择了这个解决方案,因为 space 似乎是随便输入的。 可能是 HTTPClient 的响应管理存在一些问题。我想我也会联系 Appcelerator。
反正现在好了