어떤 이유로 항목 “설명” 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_array
bykey
및 by 모두 값을 반환합니다int
. 인덱스를 사용하지 않으므로 가져 오지 마십시오.
이것이 정말로 문제라면 json_encode
루프의 본문을 다음과 같이 바꾸는 것이 좋습니다.
$rows[] = array_map('htmlentities',$row);
Perhpas 거기에 뭔가를 비난하는 특별한 문자가 있습니다 …