2013-11-15 17 views
11

Mam kod PHP, który musi zakodować dane tabeli DB w json. Użyłem więc json_encode().php json_encode nie działa częściowo na tablicach

używam tabel podanych tutaj - http://www.geekality.net/2011/08/21/country-names-continent-names-and-iso-3166-codes-for-mysql/

behavious tego kodu wydaje się być różny dla różnych wejść.

Zapytanie - $query = "SELECT * FROM countries "; nie zwraca żadnych wartości json.

Kwerenda - $query = "SELECT * FROM countries where continent_code='AS'"; zwraca poprawnie wartości json.

podczas gdy $query = "SELECT * FROM countries where continent_code='EU'"; również nie zwraca niczego.

Podobnie "NA", "AF" nie działały, a inne działają idealnie.

Jestem dziwny z tego zachowania json_encode PHP.

To jest mój kod.

<?php 
$con=mysqli_connect('localhost','xxxx','xxxxx','joomla30'); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$result = mysqli_query($con,"SELECT * FROM countries where continent_code='EU'") or die (mysqli_error($con)); 

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
     $orders[] = array(
      'CountryCode' => $row['code'], 
      'CountryName' => $row['name'] 
     ); 
    } 
//print_r($orders); 

echo json_encode($orders); 

mysqli_close($con); 
?> 

Do poprzedniej linii json_encode są przenoszone dane. Myślę więc, że jego problem z kodowaniem jsonów.

Próbowałem się o tym dowiedzieć, używając print_r($orders);.
Otrzymałem od niego następujące dane wyjściowe.

Jeśli spróbuję dla "UE", otrzymam tę tablicę.

Jeśli spróbuję "AS", otrzymam tę tablicę.

Array ([0] => Array ([CountryCode] => AE [CountryName] => United Arab Emirates) 
[1] => Array ([CountryCode] => AF [CountryName] => Afghanistan) 
[2] => Array ([CountryCode] => AM [CountryName] => Armenia) 
[3] => Array ([CountryCode] => AZ [CountryName] => Azerbaijan)... 

Obie macierze wygląda alike prawo ... Ale json_encode działa tylko na „za”, a nie do „UE”.

Czy ktoś wie, jak rozwiązać ten problem? Jeśli tak, proszę mi powiedzieć ..

+1

Domyślam się, że problemem są "Wyspy Alandzkie", ponieważ json_encode ma problemy z "Å" jako dziwnym unicode. Spróbuj ustawić swój mysql_connection na UTF-8 –

Odpowiedz

24

Należy upewnić się, że każdy składnik aplikacji internetowej używa UTF-8. This answer z innego pytania powie Ci, jak to zrobić. Jeśli read this z RFC4627:

Kodowanie: tekst JSON MUSI być zakodowane w formacie Unicode. Domyślne kodowanie to UTF-8.

Funkcja json_encode wymaga, aby wszystkie przychodzące dane były kodowane w UTF-8. Właśnie dlatego łańcuchy takie jak Åland Islands prawdopodobnie powodują problemy.

+4

Dziękuję za szybką odpowiedź w ciągu 2 minut .. dodałem 'mysqli_set_charset ($ con, 'utf8');' Działało idealne ... – vsriram92

13

Po prostu losowe domysły tutaj: json_encode wymaga, aby wszystkie dane, które podajesz, były zakodowane w UTF-8, a w przeciwnym razie wystąpi błąd. Te kraje, w których się nie powiedzie, prawdopodobnie zawierają dane zawierające znaki spoza zestawu ASCII. Czysty ASCII jest kompatybilny ze znakami UTF-8, nie-ASCII, którymi musisz się szczególnie zająć. Zobacz, jak uzyskać kodowane w UTF-8 dane z bazy danych (mysqli_set_charset), patrz UTF-8 all the way through.

+5

Dziękuję .. I dodano 'mysqli_set_charset ($ con, 'utf8');' Udało się idealnie ... – vsriram92

+0

Dzięki, właśnie dodałem następujący kod '$ db-> set_charset (" utf8 ");' w moim przygotowanym oświadczeniu i działa idealnie –