개발 Q&A

제목 file_get_contents로 넘긴 후 DB등록 시 에러 발생 문제
글쓴이 정수리 작성시각 2016/09/26 15:17:35
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 81093   RSS

이전에 글을 너무 예의 어긋나게 올려 여러 포럼선배분들께 누를 끼쳐 죄송합니다

 

기존의인트라넷의 경우 현재 운영하고 있기에 테스트가 불가능하여 

 

기존의인트라넷의 전화접수대장과 똑같은 형태의 뷰페이지를 만들어서 테스트하였습니다.

 

dm_test.php(뷰페이지)에서 데이터를 등록하고 dm_submit.php로 데이터를 보내면

dm_submit.php는 

<?php
if($_POST){
	extract($_POST);
	foreach($_POST as $key =>$val){ 
$insertItem[$key] = $val;
	}
}

//var_dump($insertItem);
$result = file_get_contents('http://172.19.93.9/jds/index.php/gigwan_c/test?data='.urlencode(json_encode($insertItem)));
//var_dump($result);
?>

배열 형태로 post데이터를 받은 후 file_get_contents()를 통해 

새프로젝트 controller의 함수test로 데이터를보냈습니다.

그리고 새프로젝트 controlle의 test함수

function test(){
		log_message('debug', '시작');
		$insertitem = json_decode(urlencode($_GET['data']));
		
	
		if(empty($insertitem)){
			log_message('debutg', '안들어있음');

		}else{
			log_message('debug', '들어있음');
		
			$result  =  $this->Gigwan_m->test($insertitem);
		}
		log_message('info', 'The purpose of some variable is to provide some value.');
		log_message('debug', '끝');
		

	}

한대승님께서 log_message를 통해 데이터를 찍어보라고 하셔서 log_meassge를 통해 log를 확인해보았습니다.

if문과 log_meassge()를 통해 $insertItem에 데이터가 들어있은것을 확인하였습니다.

그런후  $reuslt =  $this->Gigwan_m->test($insertitem); 코드를 적용하니 

로그에서는 

ERROR - 2016-09-26 15:34:14 --> Severity: 4096  --> Object of class stdClass could not rted to string /home2/users/intra/public_html/jds/Codeigniter/system/database/DB_driverDEBUG - 2016-09-26 15:34:14 --> DB Transaction FailureERROR - 2016-09-26 15:34:14 --> Query error: You have an error in your SQL syntax; checnual that corresponds to your MySQL server version for the right syntax to use near '' 1

이 에러는 출력하였고

웹에서는

Warning: file_get_contents(http://xxx.xx.xx.x/jds/index.php/gigwan_c/test?data=%7B%22Tdate%22%3A%222016-09-26%22%2C%22Ttime%22%3A%2215%3A23%22%2C%22Tuser%22%3A%22%22%2C%22Tcom%22%3A%22%22%2C%22Tdept%22%3A%22%22%2C%22Tname%22%3A%22%22%2C%22Tphone%22%3A%22%22%2C%22Tmemo_a%22%3A%22%22%2C%22Tmemo_b%22%3A%22%22%2C%22TetcPG%22%3A%22%22%2C%22Tresult%22%3A%220%22%2C%22Treason%22%3A%22%22%2C%22Tdamdang%22%3A%22%22%2C%22TPG%22%3A%22%22%2C%22Ttype%22%3A%22%22%2C%22Twrite_a%22%3A%22%22%2C%22Twrite%22%3A%22%22%7D): failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Error in /home2/users/intra/public_html/dm_submit.php on line 10

이함수를 출력하였습니다;

 

혹시나 해서 데이터를 보낼때 json_ecode를 사용하고 urlencode를 사용하였으니

test함수에서 urldecode먼저 사용한 후 json_decode 사용한 뒤 다시 한번 데이터를 보냈을때

로그를 확인하니 저if문을 건너뛰고 나머지들이 출력되네요;

제가 데이터를 전송할때 처리와 받을 때 처리를 잘못한것 일까요?

넘어온 데이터들이 모델로 넘어가 DB에 저장만되면되는데 ㅜㅜ

 

혹시 몰라  test함수에서 데이터를 보내면

function test2($data){
		log_message('debug', '모델시작');
			log_message('debug', 'gg_pk쿼리시작');
		$sql =  'select gg_pk from jds_gigwan where gg_na = ?';	
		$query  =  $this->query($sql, $data['Tcom']);

		$gg_pk =  $query->row();
		log_message('debug', 'gg_pk끝');
		log_message('debug', 'pg_pk쿼리시작');
		$sql =  'select pg_pk from jds_program where pg_name = ?';

		$query =  $this->query($sql, $data['TPG']);

		$pg_pk = $query->row();
		log_message('debug', 'pg_pk끝');
		log_message('debug', '등록쿼리시작');
		$sql = 'insert into jds_telmemo(gg_pk, pg_pk, Tdate, Tuser, Tcom, Tname. Ttime, Tphone, Tmemo_a, Tdept, Tdamdang, TPG, Ttype, Tmemo_b, TetcPG, Twrite, Twrite_a, Tresult,  Treason, Texcept) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';

		$result = $this->query($sql, array($gg_pk->gg_pk, $pg_pk->pg_pk, $data['Tdate'], $data['Tuser'], $data['Tcom'], $data['Tname'], $Tdata['Ttime'], $Tdata['Tphone'], $data['Tmemo_a'], $data['Tdept'], $data['Tdamdang'], $data['TPG'], $data['Ttype'], $data['Tmemo_b'], $data['TetcPG'], $data['Twrite'], $data['Twrite_a'], $data['Tresult'], $data['Treason'], $data['Texcept']));
		log_message('debug', '등록쿼리끝');
		log_message('debug', '모델끝');
	}

 DB에 저장하는 모델의 함수입니다.

 

 다음글 php 로컬 파일 read 서버 부하 (6)
 이전글 배열이 너무 어렵네요 ㅠㅠ 고수님들 많은 가르침 부탁드... (1)

댓글

kaido / 2016/09/26 15:18:55 / 추천 0

MySQL server version for the right syntax to use near '' 1  이 메세지는 query 가 잘못 되었다는 의미입니다.

select * from tb_name where  name = '포럼';

이건 정상

select * from tb_name where  name = 포럼;

이건...?

 

테스트 해보시면 동일한 에러메세지를 보실 수 있습니다.

해결 방법으로 액티브 레코드를 사용 하는 방법과  더블쿼터와 싱글쿼터를 잘 판단해서 넣는 수밖에 없습니다.

 

웹에서 나오는 500에러(HTTP request failed! HTTP/1.0 500 Internal Server Error in /home2/users/intra/public_html/dm_submit.php on line 10) 는 해당 DB 부분에서 에러나와서 나오는 메세지로 보이구요.

정수리 / 2016/09/26 15:56:37 / 추천 0

@kido

답변 감사합니다

말씀하신 대로 액티브 레코드로 변경을 하였습니다;

그런데 액티브 레코드로 변경한 이후

다시 실행을 했을때 controller에 있는 if문의 else부분부터 끝까지

log_message('debug', '들어있음');
		
			//$result  =  $this->Gigwan_m->test2($insertitem);
		}
		log_message('info', 'The purpose of some variable is to provide some value.');
		log_message('debug', '끝');

의 출력문이 안뜨네요;; 로그부분에서

테이블에 정상적으로 데이터가 들어갔나확인을 해보니 아무것도 없구요 ㅜㅜ

혹시나해서 모델로 보내는 부분을 주석처리를 해도 if문부터 끝의 log_message도 로그부분에서 안나타네요;

신기한것은 모델부분의 db에 넣는 함수 

test2($insertitem); 이부분을 전체 주석처리 하고 실행을 하니

cotroller의 if문이 실행이 됩니다;

그렇다면 if문의 result부분만 주석처리 해도 if 문이후의 출력문들은 로그에 출력이 되어야 하는데 result문 주석처리하고 모델부분test2함수를 주석처리 하지 않았을 경우 if문의 출력부분이 로그에 출력되지 않고 모델부분 test2()만 주석처리를 하면 controller의

if문의 출력문이 로그에 출력이 되네요;;

어느 부분이 문제인지 알수가 없네요 ㅜㅜ;;

밑에는 문제가 되었던 부분을 액티브 레코드로 변경한 후 model test2()부분입니다.

function test2($data){

			
			$this->db->select('gg_pk');
			$query= $this->db->get_where('jds_gigwan', array('gg_na' = >$data['Tcom']));
			$gg_pk = $query->gg_pk;

			$this->db->select('pg_pk');
			$query= $this->db->get_where('jds_program', array('pg_name' = >$data['TPG']));
			$pg_pk = $query->pg_pk;
			
		
		$sql = 'insert into jds_telmemo(gg_pk, pg_pk, Tdate, Tuser, Tcom, Tname, Ttime, Tphone, Tmemo_a, Tdept, Tdamdang, TPG, Ttype, Tmemo_b, TetcPG, Twrite, Twrite_a, Tresult, Treason, Texcept) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';

		$result = $this->query($sql, array($gg_pk, $pg_pk, $data['Tdate'], $data['Tuser'], $data['Tcom'], $data['Tname'], $Tdata['Ttime'], $Tdata['Tphone'], $data['Tmemo_a'], $data['Tdept'], $data['Tdamdang'], $data['TPG'], $data['Ttype'], $data['Tmemo_b'], $data['TetcPG'], $data['Twrite'], $data['Twrite_a'], $data['Tresult'], $data['Treason'], $data['Texcept']));
}	

 

뫄뫄잉뿌 / 2016/09/26 16:19:05 / 추천 0
$this->db->select('gg_pk');
 $query= $this->db->get_where('jds_gigwan', array('gg_na' = >$data['Tcom']));
 $gg_pk = $query->gg_pk;

이 부분을

$this->db->select('gg_pk');
$query= $this->db->get_where('jds_gigwan', array('gg_na' = >$data['Tcom']));
$gg_pk = $query->row()->gg_pk;

로 바꿔보시고 실행해보세요.

쿼리 결과 생성을 안하셔서 그런거같아요

정수리 / 2016/09/26 16:23:03 / 추천 0

@뫄뫄잉뿌

답변감사합니다

그래도 똑같네요;; 테이블에 아무값도 안들어가고  if문부터 있는 log_meassge 부분이 로그에 출력이 안되네요 ;;

모델부분에서 log_meassage를 설정해놓았는데 그것도 출력이 안되구요

어느부분부터 해야할지 답답하네요;; 이게 해결을 해야 하는데 

뫄뫄잉뿌 / 2016/09/26 16:24:30 / 추천 0

더불어 하단의 insert문을 액티브레코드로 변경 시

$data = array(
    'gg_pk'  =>  $gg_pk,
    'pg_pk'  =>  $pg_pk,
    'Tdate'  =>  $data['Tdate'],
     ....
);

$this->db->insert('jds_telmemo',$data);

나중에 보시기에 이게 더 편할거라 생각합니다.

 

뫄뫄잉뿌 / 2016/09/26 16:25:58 / 추천 0

gg_pk, pg_pk 둘다 바꾼건가요?

기존 상황에서 액티브쿼리만 바뀐거라면 쿼리부분만 수정하면 될거같은데..

정수리 / 2016/09/26 17:02:13 / 추천 0

@뫄뫄잉뿌

다행히 해결하였습니다^^;

$data['Tdate'] 이것을 $data->Tdate로 바꾸니

데이터정보가 나오면서 하나하나씩 풀려가더라구요

헷갈리는 것이 json_encode를 했을 경우 json문법구조로 바뀌는 것인가요?

그렇다면 json_encode로 인코딩한것을 json_decode를 decode했을 경우 객체배열로 바뀌는 건가요?

배열같은 데이터를 넘길때 문자열 형태로 만들어서 넘긴다는것은 알고 있는데...

아직도 저부분이 헷갈리네요ㅜㅜ

 

뫄뫄잉뿌 / 2016/09/26 17:11:22 / 추천 0

http://php.net/manual/kr/function.json-decode.php

구글에 json_decode를 입력하면 바로 나옵니다. 참고하세요.

정수리 / 2016/09/27 07:59:26 / 추천 0

@뫄뫄잉뿌 

답변감사합니다

달아주신 url를 참고하겠습니다.