0

PHP から Android に一連の結果を返そうとしています。

単一の結果を返すことができましたが、今は複数の結果を返そうとしています。これを配列として行う方法を理解するのに苦労しています。

PHP 関数:

   public function searchForPeople($tower) {
    $uuid = uniqid('', true);

    $result = mysql_query("SELECT * FROM users WHERE tower='$tower'") or die(mysql_error());
    $resultNo = mysql_num_rows($result);

    // check for successful store
    if ($result != null) {

        //if just one result return it
        if ($resultNo == 1) {

            // return result
            $resultSet[] = mysql_fetch_array($result);
            return $resultSet;

    //if more than one loop through
    } else {

        //add each row to an array
        while($row = mysql_fetch_array($result)) {
            $resultSet[] = $row;
        }
        return $resultSet;
        }

    } else {
        return false;
    }
}

Android からデータを POST する index.php のセクション:

    //SEARCH FOR PEOPLE
     else if ($tag == 'searchPeople') {

        $tower = $_POST['tower'];

        $result = $db->searchForPeople($tower);


    // check array has been created
    if ($result != false) {

        $response["success"] = 1;

        $count = 0;
        foreach($result as $row) {

        $response[$count]["user"]["name"] = $row["name"];
        $response[$count]["user"]["email"] = $row["email"];

        $count++;
        }

        echo json_encode($response);


      } else {
        $response["error"] = 2;
        $response["error_msg"] = "No users found";
        echo json_encode($response);
    }
    }

        else {
    echo "Invalid Request";
}

次に、以下のように Android で情報を取得しようとしていますが、PHP で json を返す方法に問題があることを意味する 0 の値がないというエラーが表示されます。

JSONObject results  = new JSONObject(resultsString);
JSONObject json_row = results.getJSONObject("0");
JSONObject json_user = json_row.getJSONObject("user");

これは、SQL結果のPHP配列を返す際の問題だと確信しています。おそらく、それらをループして $resultSet または $response に追加するときです。

どんな助けでも大歓迎です。

編集:

ここに私が得ているエラーがあります:

11-14 19:42:37.270: E/JSON(639): "[{\"uid\":\"4\",\"unique_id\":\"505efc638e0f48.78430999\",\"name\":\"fish\",\"email\":\"fish\",\"encrypted_password\":\"r\/Hb7uXrHN8bFuRoKlG8+Y5LdKFjM2QyZDUyYzQ1\",\"salt\":\"c3d2d52c45\",\"created_at\":\"2012-09-23 13:11:15\",\"updated_at\":\"2012-11-03 09:56:15\",\"location\":\"888\",\"tower\":\"IS\",\"base_location\":\"\",\"client_site\":\"\",\"graduate\":\"0\",\"location_updated\":\"0000-00-00 00:00:00\"}]"
11-14 19:42:37.270: E/JSON Parser(639): Error parsing data org.json.JSONException: Value [{"uid":"4","unique_id":"505efc638e0f48.78430999","name":"fish","email":"fish","encrypted_password":"r/Hb7uXrHN8bFuRoKlG8+Y5LdKFjM2QyZDUyYzQ1","salt":"c3d2d52c45","created_at":"2012-09-23 13:11:15","updated_at":"2012-11-03 09:56:15","location":"888","tower":"IS","base_location":"","client_site":"","graduate":"0","location_updated":"0000-00-00 00:00:00"}] of type java.lang.String cannot be converted to JSONArray
4

3 に答える 3

0

私はあなたが使うべきだと信じています

mysql_fetch_assoc

PHPで行をプルします。これで、Androidに返す必要のある文字列にjson_encodedする準備が整います。

だからこれを試してみてください:

function sqlToJSON($sql){
     $sth = mysql_query($sql);

    //if this is an update or an insert nothing to return
    if($sth === false || $sth === true){    

        return null;
    }    

    $rows = array();
    while($r = mysql_fetch_assoc($sth)) {
        $rows[] = $r;
    }   
    return json_encode($rows);
 }

このメソッドの結果はnew JSONObject(res);、追加の変換を行わなくてもJava側で実行できるはずです...これはメモリから言っているので、100%正しくない可能性がありますが、そうでない場合はかなりです。選ぶ。

于 2012-11-11T16:16:10.573 に答える
0

私は最近、以下のようなルーチンを使用しました。結果が 1 つでも多くても、常に機能します。

$dbuser = // user name;
$dbpass = // password;
$dbhost = // host name;
$dbname = // database name;

$sql = "SELECT * FROM users WHERE tower=" . $tower;

try {
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->query($sql);  
$results = $stmt->fetchAll(PDO::FETCH_OBJ);
$dbh = null;
echo '({"items":'. json_encode($results) .'});';
} catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}'; 
}
于 2012-11-11T00:32:02.837 に答える
0

resultsStringデバッグにダンプしてLog、それがどのように見えるか、およびそれが期待される JSON 文字列であるかどうかを確認する必要があります。次に、サーバーまたはクライアントのどこでコードを修正する必要があるかを確認できます。

JSONObject.getJSONArray()も調べます。返される応答はネストされた配列 AFAICS で構成されているためです。

于 2012-11-11T16:01:10.397 に答える