Я пытаюсь получить информацию из базы данных MySql через Volley в JSONArray. PHP-скрипт для извлечения строк из таблицы выглядит следующим образом:
<?php
ob_start();
header('Content-Type: application/json');
$con=mysqli_connect("localhost","root","","planet_db");
if (mysqli_connect_errno($con))
{
//echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$search = $_POST['search'];
//sql query
$query = "SELECT FirstName, LastName, Username FROM users WHERE Username='$search' OR FirstName='$search'";
$result = mysqli_query($con,$query);
$jsonArr = array(array("FirstName"=>"Einie", "LastName"=>" Mini"));
while($row = mysqli_fetch_assoc($result))
{
array_push($jsonArr,$row);
}
ob_end_clean();
echo json_encode($jsonArr);
mysqli_close($con);?>
Результат выполнения запроса к базе данных на локальном хосте через страницу HTML выглядит следующим образом:
Второй элемент (индекс 1) JSONArray присутствует, как показано выше, НО, когда я пытаюсь получить элемент с индексом 1 в JSONArray, полученный клиентом приложения для Android, затем он выбрасывает исключение JSONException: index вне границ [0..1) , И точно так же, когда я редактирую следующую строку в моем PHP-скрипте:$jsonArr = array(array("FirstName"=>"Einie", "LastName"=>" Mini"));
в $jsonArr=array();
и попытаться получить элемент в JSONArray с индексом 0, я получаю JSONException: индекс вне границы [0..0). В заключение я не могу получить какой-либо элемент в JSONArray, добавленный через код:
while($row = mysqli_fetch_assoc($result))
{
array_push($jsonArr,$row);
}
в моем приложении для Android вместо этого выбрасывается исключение JSONException: Index, но я успешно получаю правильный массив JSON при запуске его на локальном хосте.
Это код моего приложения для Android:
private void performSearch()
{
final String url = "http://192.168.42.16/planet/searchPeople.php";
JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response)
{
//searchResults.setAdapter(new ResultListAdapter(response, Contents.this));
try {
Toast.makeText(Contents.this, response.getJSONObject(1).getString("FirstName") + " "+ response.getJSONObject(1).getString("LastName"), Toast.LENGTH_LONG).show();
} catch (JSONException e)
{
e.printStackTrace();
Toast.makeText(Contents.this,
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(Contents.this, error.toString(),Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map<String, String> getParams()
{
Map<String, String> map = new HashMap<String, String>();
map.put("search", query);
return map;
}
};
MySingleton.getInstance(Contents.this).addToRq(request); // adding request to Volley Request Queue
}
Как я могу избавиться от такого вида индекса вне привязки JSONException? Любая помощь могла бы быть полезна!
1) Ваш URL — это локальный URL, который может или не может быть доступен с вашего телефона в зависимости от настроек вашей сети. Убедитесь, что вы можете получить доступ к этому URL с вашего телефона.
2) Сначала просто попробуйте напечатать весь response
в вашем onResponse
метод, чтобы увидеть, если вы получите желаемый JSON или нет.
1) Прежде всего, вы убедились, что ваш 192.168.42.16 виден другим устройствам в сети? Убедитесь, пытаясь перейти к нему на вашем телефоне
2) Если это удастся, попробуйте использовать Logcat распечатать вывод того, что вы получили. [0..1) означает, что в ответе был один объект, поэтому попробуйте зарегистрировать его как Log.d (‘JSONTAG’, response.toString ());