почему массив php json возвращает нулевое значение, даже если оно имеет значение для первой строки

0

Я получаю данные json this

$sql=mysqli_query($con,"select * FROM mohamiusermeta  where meta_key='websiteurl' or meta_key='profile_photo' or meta_key = 'Office' or meta_key='address_user' or meta_key='agentarea' or meta_key='offertext' or meta_key='officename' or meta_key='cover_photo' or meta_key='membertype' order by user_id desc");
$newarray = array();
$subArray = array();
while($row=mysqli_fetch_assoc($sql))
{
    $output[$row['meta_key']] = $row['meta_value'];
    $subArray[user_id]=$row['user_id'];
    $subArray[Office]=$output['Office']; 

    $subArray[officename]=$output['officename']; 
    $subArray[address_user]=$output['address_user']; 
    $subArray[profile_photo]=$output['profile_photo']; 
    $subArray[cover_photo]=$output['cover_photo']; 
    $subArray[agentarea]=$output['agentarea']; 
    $subArray[offertext]=$output['offertext']; 
    $subArray[websiteurl]=$output['websiteurl']; 
    $subArray[membertype]=$output['membertype']; 
    $newarray[] = $subArray;
}

json_encode($newarray);

echo(json_encode($newarray,JSON_UNESCAPED_UNICODE));

mysqli_close();
?>

но результат в браузере получает значение null и дублирующее значение для первой строки, где он имеет значение в базе данных

что неправильно в выборке массива? проверить результат в браузере http://lifecareclub.net/api/test.php

  • 0
    Первое, что нужно сделать, это проверить, имеет ли $newarray значения, которые вы ожидаете. var_dump() полезен для этого. Кажется, у вас есть json_encode($newarray) строка json_encode($newarray) , но она должна быть безвредной. Однако вы можете сравнить результаты этой строки с результатом следующей строки, чтобы увидеть, является JSON_UNESCAPED_UNICODE флаг JSON_UNESCAPED_UNICODE причиной вашей проблемы.
Теги:

2 ответа

0
Лучший ответ

Вы $newarray то, что уже добавлено в $newarray в следующей итерации, когда вы изменяете членов $subArray.

Чтобы решить эту проблему, переместите $subArray = array(); внутри цикла, непосредственно перед первым назначением на один из его ключей. Таким образом, вы создаете новый массив на каждой итерации, который "отсекает его" из данных, которые вы назначили своим членам в предыдущей итерации.

NB: вам нужно использовать кавычки в $subArray['user_id'] =... и другие назначения, но я полагаю, что это опечатка в вашем вопросе.

0

Здесь я вижу несколько проблем с тем, как результаты запроса извлекаются из базы данных и преобразуются в ваш массив. В общем, для отладки таких проблем вы должны посмотреть на значения ваших переменных на этом пути и посмотреть, соответствуют ли они ожиданиям.

Например, если вы положите

var_dump($output);

в вашем цикле, прежде чем вы начнете использовать $output для установки значений в $subArray, вы увидите, что у него нет всей информации, которую вы думаете.

Примечание: если вы используете Ajax для вызова функции, вам нужно научиться использовать инструменты отладки браузера, чтобы посмотреть на точные данные, возвращаемые с сервера. Таким образом, вы можете вернуть результаты, не связанные с JSON, и посмотреть, что действительно происходит. В этом случае вы увидите, что возвращаемые данные на самом деле являются сообщением об ошибке, которое поможет вам разобраться в следующем шаге.

Я не хочу писать код для вас, но вот несколько вещей, которые вы можете сделать, чтобы улучшить свой код. Я предполагаю, что такие вещи, как officename являются столбцами в вашей таблице базы данных, которые возвращаются SELECT.

$sql=mysqli_query($con,"select * FROM mohamiusermeta  where meta_key IN ('websiteurl', 'profile_photo', 'Office', 'address_user', 'agentarea', 'offertext' , 'officename', 'cover_photo', 'membertype') order by user_id desc");

$newarray = array();

while($row = mysqli_fetch_assoc($sql))
{
    $subArray = array();

    $subArray[$row['meta_key']] = $row['meta_value'];
    $subArray['user_id'] = $row['user_id'];
    $subArray['Office'] = $row['Office']; 
    $subArray['officename'] = $row['officename']; 
    $subArray['address_user'] = $row['address_user']; 
    $subArray['profile_photo'] = $row['profile_photo']; 
    $subArray['cover_photo'] = $row['cover_photo']; 
    $subArray['agentarea'] = $row['agentarea']; 
    $subArray['offertext'] = $row['offertext']; 
    $subArray['websiteurl'] = $row['websiteurl']; 
    $subArray['membertype'] = $row['membertype']; 
    $newarray[] = $subArray;
}

echo(json_encode($newarray,JSON_UNESCAPED_UNICODE));

mysqli_close();

Вещи, которые я изменил:

  • В запросе я использовал IN чтобы сократить список и сделать его более понятным.
  • исключить $output
  • помещать кавычки вокруг индексов в $subArray

Заметки стиля:

  • выберите стиль именования переменных и придерживайтесь его.
  • аккуратность помогает

Последнее замечание: похоже, что весь этот код делает немного больше, чем создание новой копии $row. Рассмотрите возможность замены всего на $newarray[] = $row; и передавая meta_key и meta_value на стороне javascript.

  • 0
    спасибо всем .. ваши комментарии очень полезны для меня .. спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню