JSONは独立したブロックで構成されていません。したがって、これは決して行いません:
foreach($this->settings_model->get_state_list() as $state)
{
echo json_encode(array($state->CODSTA, $state->STANAM));
}
出力はテキストとして扱われ、イテレータはオブジェクトの要素をループします...単一の文字です。
リストまたは辞書を宣言する必要があります。jQueryコールバックでデータをどのように使用するかに応じて、いくつかの例を含めました。注:PHP側では、JSONの適切なMIMEタイプを出力する必要がある場合もあります。
$states = array();
foreach($this->settings_model->get_state_list() as $state)
{
// Option 1: { "71": "SomeState0", "72": "Somestate2", ... }
// Simple dictionary, and the easiest way IMHO
$states[$state->CODSTA] = $state->STANAM;
// Option 2: [ [ "71", "SomeState0" ], [ "72", "SomeState2" ], ... ]
// List of tuples (well, actually 2-lists)
// $states[] = array($state->CODSTA, $state->STANAM);
// Option 3: [ { "71": "SomeState0" }, { "72": "SomeState2" }, ... ]
// List of dictionaries
// $states[] = array($state->CODSTA => $state->STANAM);
}
Header('Content-Type: application/json');
// "die" to be sure we're not outputting anything afterwards
die(json_encode($states));
jQueryコールバックでは、charsetを使用してデータ型とコンテンツタイプを指定します(これは、サーバーがISO-8859-15でデータを送信し、ブラウザーがページを実行しているオーランド諸島などの状態に遭遇するとすぐに役立ちます。 UTF8では、苦痛なWTFの瞬間につながる可能性があります):
$.ajax({
url: 'settings/express_locale',
type: 'POST',
data: { code: location, type: typeLoc },
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
$("#comboId").get(0).options.length = 0;
$("#comboId").get(0).options[0] = new Option("-- State --", "");
// This expects data in "option 1" format, a dictionary.
$.each(data, function (codsta, stanam){
n = $("#comboId").get(0).options.length;
$("#comboId").get(0).options[n] = new Option(codsta, stanam);
});
},
error: function () {
alert("Something went wrong");
}