我正在开发一个简单的应用程序来登录面板,与Mysql DB进行交互。在我的应用程序中,创建一个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
,我使用相同的模式 lo 登录,我没有问题。
编辑:我已经清理了这个问题...
找出差异:
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
"令牌"后面有一个空格!!如果我在控制台中打印经过this.responseText
传递的字符串的每个字符,我可以看到两个空格:一个在开头,一个在结尾。第一个空格会导致解析错误。第二个空格无关紧要,因为它在最后。
这很奇怪,因为在我使用相同的迭代器的其他 js、index.js
中,this.responseText
传递的字符串在开头没有空格,但在末尾有两个空格。但是,末尾的空格无关紧要,因此在这种情况下,我对通话没有问题。
因此,我使用 cicle 在字符串中获取 {
的索引,然后我使用了开头没有空格的字符串。
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
// .....
我选择了这个解决方案,因为似乎空间是随意放入的。可能是使用 HTTPClient 管理响应存在一些问题。我想我也会联系Appcelerator。
反正现在没关系了。