2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

PHP에서 POST 할 때 데이터가 중간에 잘리는 문제

테스트 할 때는 생각하지 못했던 문제인데 실제 서비스 들어가니 바로 터지는 ㅋㅋㅋCSV파일에 데이터가 있고 그걸 ajax로 서버로 넘겨서 Import하는데 클라이언트쪽에서는 데이터 다 확인이 되는데 서버로 전송해서 저장할 때 값이 특정부분에서 잘려서 뒤로는 아예 안 들어가는 에러가 발생..데이터를 500건 넣었더니 100번째 줄에서 잘려서 고것만 들어가고 나머지 400개는 무시됨..예외로도 안 잡히니 실행은 잘 되는 듯 했다. 뭔가 해서 찾아보니 101번째 즈음해서 데이터가 잘리고 뒤로는 계속 널이 들어감.100개씩 잘라서 5번 돌리니 잘 돌아감 ㅋㅋ 뭐지??
"100","2017","7","共・高2組2","1","1","1","1","","true","",""
"101","2017","7","必・高, null, null, null, null, null, null, null, null
(원래는、"101","2017","7","必・高2組3 ","1","1","1","1","","true","","" 임)

에러는 대략 이런 느낌 ㅋ2018-01-31 14:40:46    Notice (8): Undefined offset: 4 in [D:\Bitnami\wampstack-7.1.7-0\apache2\htdocs\djks\trunk\src\Controller\ParticipantController.php, line 475] Request URL: /participant/import Referer URL: http://localhost:8765/participant/import 
2018-01-31 14:40:46    Notice (8): Undefined offset: 5 in [D:\Bitnami\wampstack-7.1.7-0\apache2\htdocs\djks\trunk\src\Controller\ParticipantController.php, line 475] Request URL: /participant/import Referer URL: http://localhost:8765/participant/import  …

삽질을 하다가 알게 된 문제..자바스크립트 쪽에서 이런 식으로 파일을 열여서 내용만 죽 붙여서 넘겼는데 CSV.parse 가 값을 배열로 리턴한다..즉, 배열인 개체를 POST로 넘기게 되는데 이렇게 되면 그 배열의 필드가 변수처럼 인식이 되서 php.ini에 있는 Max_input_vars 라고 하는 설정값만큼만 전송이 된다고 한다. 기본이 1000 이니까..필드 10개짜리 데이터니까 딱 100번째 줄 까지 들어가고 뒤는 잘린거다.
// CSVファイル以外は処理を止める if(fileData.name.match('.csv$')) { // FileReaderオブジェクトを使ってファイル読み込み var reader = new FileReader(); // ファイル読み込みに成功したときの処理 reader.onload = function() { 'use strict'; csvContents = CSV.parse(reader.result); // console.log(csvContents); } // ファイル読み込みを実行 reader.readAsText(fileData); }
해결책은 간단하게 3가지다.1. Max_input_vars 값을 늘린다 : 서버에 부담이 갈 수 있으므로 좋은 방법은 아님2. 입력값 수를 줄인다 : 고객한테 데이터 100개만 넣어요 혹은 100개씩 파일 나누세요 할 수 없음3. POST할 때 배열이나 개체가 아닌 문자열로 넘긴 후 서버쪽에서 개체로 생성하는 경우 
3번이 가장 현실적이라서 이래저래 찾아보니 자바스크립트쪽에서는 JSON.stringify 로 배열을 문자열로 만든 후, PHP에서 json_decode 로 배열을 만들어주면 될 듯 하다는 소리에 수정했더니 됐다 ㅋ
아..주말에 고생했다 ㅋ 퇴근해야지...실력이 없으니 시간 들여서 몸빵하는 수 밖에 ㅠㅠ
// 자바스크립트 쪽 처리 if(fileData.name.match('.csv$')) { // FileReaderオブジェクトを使ってファイル読み込み var reader = new FileReader(); // ファイル読み込みに成功したときの処理 reader.onload = function() { 'use strict'; // CSVパーサーで配列作り、文字化する csvContents = JSON.stringify(CSV.parse(reader.result)); } reader.readAsText(fileData, "UTF-8"); } // POST 넘길 때 데이터타입을 json으로 해야 함..텍스트로 했다가 2시간 고생했음 ㅋ $.ajax({ url:urlPath, type:'POST', cache: false, dataType: 'json', data:{'csvContents':csvContents} })
if($this->request->is('ajax')) { // 문자열을 연상배열로 만듦 $csvContents = json_decode($this->request->data('csvContents'),true); if(empty($csvContents)) { //......생략 }

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법