钛 - PHP + JSON 解析错误


Titanium - PHP+JSON error parsing

我正在开发一个简单的应用程序来登录面板,与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。

反正现在没关系了。