[php] json_encode가 NULL을 반환합니까?

어떤 이유로 항목 “설명” NULL이 다음 코드와 함께 반환 됩니다.

<?php
include('db.php');

$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>

내 데이터베이스의 스키마는 다음과 같습니다.

CREATE TABLE `staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` longtext COLLATE utf8_unicode_ci,
  `description` longtext COLLATE utf8_unicode_ci,
  `icon` longtext COLLATE utf8_unicode_ci,
  `date` longtext COLLATE utf8_unicode_ci,
  `company` longtext COLLATE utf8_unicode_ci,
  `companyurl` longtext COLLATE utf8_unicode_ci,
  `appurl` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

페이지에 표시되는 내용은 다음과 같습니다.

[{"id":"4","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"},{"id":"3","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"}]

어떤 아이디어?



답변

UTF8이 아닌 인코딩으로 데이터를 검색하고 있다고 확신합니다 . 쿼리 mysql_query('SET CHARACTER SET utf8')앞에 넣으 십시오 SELECT.


답변

PHP 5.5 이상이 있는 경우 문제를 설명하는 문자열을 반환하는 json_last_error_msg ()를 사용할 수 있습니다 .

5.5가 없지만 5.3 이상이면 json_last_error () 를 사용 하여 문제가 무엇인지 확인할 수 있습니다 .

함수 문서 에서 문제를 식별하는 데 사용할 수있는 정수를 반환합니다 . 현재 (2012.01.19) 식별자는 다음과 같습니다.

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

이는 향후 버전에서 변경 될 수 있으므로 설명서를 참조하는 것이 좋습니다.

5.3 미만이면 운이 좋지 않은 것입니다. 오류가 무엇인지 물어볼 방법이 없습니다.


답변

ntd의 anwser가 내 문제를 해결하지 못했습니다. 같은 상황에있는 사람들을 위해 마지막으로이 오류를 처리 한 방법은 다음과 같습니다. 각각의 결과를 utf8_encode하십시오.

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

도움이 되었기를 바랍니다.


답변

며칠 전에 1 테이블에 동일한 문제가 있습니다.

먼저 시도해보십시오.

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

마지막 줄이 5를 반환하면 데이터에 문제가있는 것 입니다. 귀하의 테이블은 UTF-8이지만 입력 된 데이터는 아닙니다 . 예를 들어 입력은 txt 파일에 있었지만 어리석은 인코딩 (내 경우에는 Win-1250 = CP1250)으로 Win 시스템에서 생성되었으며이 데이터는 DB에 입력되었습니다.

해결책? 새 데이터 (엑셀, 웹 페이지) 를 찾고, PSPad (또는 기타)를 통해 소스 txt 파일편집하고 , 인코딩을 UTF-8로 변경 하고, 모든 행을 삭제 한 다음 원본에서 데이터를 넣습니다. 저장. DB에 들어가십시오 .

인코딩을 utf-8로만 변경 한 다음 모든 행을 수동으로 변경할 수도 있습니다 (특수 문자가있는 cols-desc, …). 노예에게 좋다 …


답변

json_encode에 utf8 인코딩 된 문자열을 전달해야합니다. 아래와 같이 사용 utf8_encode하고 array_map()작동 할 수 있습니다 .

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>


답변

AHHH !!! 너무 잘못되어 머리가 아파요. 이런 식으로 더 시도하십시오 …

<?php
include('db.php');

$result = mysql_query('SELECT `id`, `name`, `description`, `icon` FROM `staff` ORDER BY `id` DESC LIMIT 20') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>
  • 반복 할 때 not mysql_num_rows을 사용해야합니다 . 또한 모든 루프를 다시 계산하는 대신이 값을 캐시 (변수에 저장)해야합니다. 후드 아래에서 무엇을하는지 누가 알겠습니까? (효율적일 수 있습니다. 잘 모르겠습니다)<<=
  • 그렇게 명시 적으로 각 값을 복사 할 필요는 없습니다. 당신은 단지 이것을 더 어렵게 만드는 것입니다. 쿼리가 여기에 나열한 것보다 더 많은 값을 반환하는 경우 SQL에 원하는 값만 나열합니다.
  • mysql_fetch_arrayby key및 by 모두 값을 반환합니다 int. 인덱스를 사용하지 않으므로 가져 오지 마십시오.

이것이 정말로 문제라면 json_encode루프의 본문을 다음과 같이 바꾸는 것이 좋습니다.

$rows[] = array_map('htmlentities',$row);

Perhpas 거기에 뭔가를 비난하는 특별한 문자가 있습니다 …


답변

PHP.net에서 권장하는 charset 설정 방법은 다음과 같습니다.

mysqli_set_charset ( ‘utf8’)