[ajax 에러] JSON.parse: unexpected character at line 1 column 1 of the JSON data
Web 프로그램/Web 디버깅 2017. 2. 18. 11:11ajax 로 form 값을 전송하는데 정상적으로 처리가 안된다.
이것 때문에 몇시간을 삽질했다. 네이버 검색하면 메시지 자체가 검색되지 않는다.
구글링을 하면 검색결과가 많은데 제대로 된 해결책을 찾기가 쉽지 않다.
error |
parsererror,SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data |
증상 | error 메시지는 나오는데 DB 테이블에는 정보가 업데이트되고 있음 |
원인 |
함수에서 warning 메시지 발생으로 인한 문제로 판명됨 |
조치 |
아래에 자세히 기술 |
$.ajax({
url: 'memberInfo.php',
type: 'POST',
data: {
uid:$("#memberuid").val(),
userNM:$("#memberName").val(),
mobileNO:$("#memberMobile").val()
},
dataType: "json",
success: function (response) {
if(response.result == 1){
alert('수정 완료');
location.replace('index.php'); // 화면 갱신
}
if(response.result == 0){
alert('수정 실패');
}
},
error: function(jqXHR, textStatus, errorThrown){
alert("arjax error Type : " + textStatus + "\n" + errorThrown);
}
});
데이터가 정상적으로 넘어가는지 확인하려고 alert 으로 일일이 찍어봤다.
정상적으로 잘 넘어간다.
그래서 memberInfo.php 파일에서 변수가 넘어왔다고 가정하고 직접 실행을 해봤으나, 정상적이다.
테스트로 값을 넘기는 거라 임의의 값으로 처리하면서 DB 저장되는 건 주석처리를 해버렸다.
<?php
if(!isset($_SESSION)) {
session_start();
}
//$_POST['userNM'] ='홍길동';
//$_POST['mobileNO'] ='010-123-7777';
if (empty($_POST)) {
echo json_encode(array('result'=>'0'));
exit;
} else {
@extract($_POST);
include_once $_SERVER['DOCUMENT_ROOT'].'/_core/config/config.php';
include_once $_SERVER['DOCUMENT_ROOT'].'/_core/config/dbconnect.php'; // db접속
include_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/dbClass.php';
$u=new MySQLiDbClass;
$mobileNO = preg_replace("/[^0-9]/", "", $mobileNO); //전화번호 숫자이외에 제거
$QSET ="userNM='".$userNM."',";
$QSET.="mobileNO='".$mobileNO."'";
$u->getDbUpdate('member_id',$QSET,"uid=".$uid);
echo json_encode(array('result'=>'1'));
}
?>
DB에는 제대로 저장되는지 확인해봤다.
DB 테이블에는 정상적으로 update가 되고 있다.
단지 화면상으로 결과를 돌려주는 부분에서 에러를 발생시키고 있다.
문제 해결과정
1단계 :
dataType: "json" 을 dataType: "text" 로 변경하고
success : function(response) { alert(response); 를 추가한다.
그러면 아래와 같이 출력되는 메시지를 전부 보여준다.
<br />
<b>Warning</b>: mysqli_query() expects at least 2 parameters, 1 given in <b>C:\AutoSet9\public_html\workspace\phpclass\dbClass.php</b> on line <b>184</b><br />
<br />
<b>Warning</b>: mysqli_query() expects at least 2 parameters, 1 given in <b>C:\AutoSet9\public_html\workspace\phpclass\dbClass.php</b> on line <b>185</b><br />
{"result":"1"}
2단계 :
Warning 이 발생한 부분을 찾아서 수정해준다.
//DB업데이트
function getDbUpdate($table,$set,$where){
global $dbconn;
mysqli_query($dbconn,'set names utf8');
mysqli_query($dbconn,'set sql_mode=\'\'');
$sql ="update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):'');
mysqli_query($dbconn,$sql);
return 1;
}
3단계 :
dataType: "json" 으로 원복 조치
$rs=$d->getDbUpdate('member_id',$QSET,"uid=".trim($uid));
if($rs == 1){
echo json_encode(array('result'=>'1'));
}else{
echo json_encode(array('result'=>'0'));
}
원인은 mysqli_query 부분을 제대로 입력하지 않아서 경고메시지가 출력되었던 것이었다.
결과값이 1이면 처리하라는 if문의 결과값만 돌려줄 줄 알았는데 그게 아니었다.
화면에 출력되는 경고메시지가 있다보니, echo json_encode(array('result'=>'1')); 메시지 이외의 값도 결과로 돌려주었었나 보다.
함수 하나를 이용하더라도 완벽하게 만들어서 이용해야 한다는 걸 다시 한번 느꼈다.
'Web 프로그램 > Web 디버깅' 카테고리의 다른 글
PHP 함수의 결과는 정수일까? String일까? (0) | 2018.06.24 |
---|---|
PHP 5.5.0 이상에서 Deprecated: mysql_connect() (2) | 2017.05.25 |
PHP 디버깅 요령 및 경고메시지 처리 방법 (2) | 2016.11.30 |
Undefined index 에러 해결방법 (0) | 2016.09.10 |
비정상 접속 체크 (0) | 2016.05.04 |