C#과 Mysql 그리고 PHP.. Longtext 전송문제!! 꾸벅

안녕하세요. 선배님들 인사드립니다 꾸벅.
정답을 찾지 못해도, 방향이라도 조언을 얻고자 감히 질문 올려봅니다.

C#을 이용해서 로그를 수집하는 프로그램을 만들고 있는데,
이 로그를 스트링화 해서 서버쪽에 PHP로 날리면
PHP에서 db 로 보내는 방식으로 사용하고 있습니다.

몇주전부터 전체 로그를 보내는 방식으로 만들어보고 있는데
이 로그의 길이가 짧으면 2-3천글자 길면 몇만글자가 되어서
longtext 컬럼을 이용하고 있습니다.

2~5천글자 정도는 아무 문제없이 잘 전송이 되는데
8천? 9천? 정도가 넘어가면 전송 자체가 안됩니다.
(글씨가 잘리는게 아니고 전송자체가 안됨)

그래서 해당 컬럼에 직접 붙혀넣기로 몇만글자를 넣어도 잘 들어가서
이건 프로그램이나 PHP의 문제가 아닐가 싶은 의심만 드는 상황입니다.

“제가 많이 초보입니다ㅠ_ㅠ”

C#에서는 이런식으로 전송을 날립니다.

try
{
StringBuilder sb = new StringBuilder(url);

sb.Append(“?” + “예를들어이렇게시작” + “=” + 머시기머시기);
sb.Append(“&” + “temp” + “=” + mainForm.txtResult); <— 이부분이 문제의 그 부분입니다.

WebRequest myWebRequest = WebRequest.Create(sb.ToString());
WebResponse myWebResponse = myWebRequest.GetResponse();
StreamReader reader = new StreamReader(myWebResponse.GetResponseStream());

string temp = reader.ReadToEnd();
int ret = -1;
try
{
ret = Int32.Parse(temp);
}

catch { }
return ret;
}

catch (Exception ee)
{
ee.ToString();
return -1;
}

mainForm.txtResult

이부분은 다른 부분에서
txtResult = sb1.ToString();
이런식으로 처리해서 가져옵니다.
줄은 대략 적어도 500줄 많으면 3천줄 정도 되기도 하구요.
줄당 적어도 30글자 많으면 50글자정도 됩니다.
형식은
[23-08-17 13:24:35] 글씨와 숫자로 12,236으로 이루어져 있습니다.
같은 줄이 많습니다.

C#에서 이걸 보내는 PHP쪽은

<?php include "common.php"; @extract($_REQUEST); $ip = $_SERVER['REMOTE_ADDR']; $sql = "insert into a_record set temp='$temp', <-----이부분이 받는쪽입니다. username='$username', insip='$ip' "; $ret = dbquery($sql); if($ret) echo "1"; else echo "-1"; ?>

보내려는 스트링의 내용이 많으면 안올라가고
적으면 잘 올라가고요.

제가 어느부분을 좀더 관심있게 찾아봐야 할지
고견 부탁드립니다!! 꾸벅

===================================
고견을 통해 수정한 내용 공유하고자 들렀습니다!!

sb.Append(“?” + “예를들어이렇게시작” + “=” + 머시기머시기);
sb.Append(“&” + “temp” + “=” + mainForm.txtResult); <— 이부분이 문제의 그 부분입니다.

WebRequest myWebRequest = WebRequest.Create(sb.ToString());
WebResponse myWebResponse = myWebRequest.GetResponse();
StreamReader reader = new StreamReader(myWebResponse.GetResponseStream());

이부분을 아래처럼 수정했습니다.

sb.Append(“?”);
sb.Append(“&” + “예를들어이렇게시작” + “=” + 머시기머시기);
sb.Append(“&” + “temp” + “=” + mainForm.txtResult);

byte[] byteArray = Encoding.UTF8.GetBytes(string.Concat(sb.ToString())); <— 추가
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url); <— url로 변경
myWebRequest.Method = “POST”; <— 추가
myWebRequest.ContentType = “application/x-www-form-urlencoded; charset=UTF-8;”; <— 추가
myWebRequest.ContentLength = byteArray.Length; <— 추가

Stream dataStream = myWebRequest.GetRequestStream(); <— 추가
dataStream.Write(byteArray, 0, byteArray.Length); <— 추가
dataStream.Close(); <— 추가

WebResponse myWebResponse = myWebRequest.GetResponse();
StreamReader reader = new StreamReader(myWebResponse.GetResponseStream());

sb.Append(“?”); 이부분으로 시작하는건 등록이 안되더라구요.
임시방편으로 이렇게 한줄 추가하고 다음부터 &로 시작하는건 등록이 잘되구요.

php쪽이나 다른 부분은 아예 안건드렸습니다.

일단…!!!
작동이 잘 된다는 점에서 매우 만족…

전문가분들이 보기엔 거슬리시는 부분이 분명 있겠지만!!
문제에 봉착한다면 다시 찾아뵙겠습니다.

정말 진심으로 무척 감사드립니다!!

2개의 좋아요

GET으로 넘길 수 있는 파라미터의 값 길이는 웹서버의 설정에 따라 제한되어 있습니다.
POST 또는 PUT으로 값을 넘기셔야 합니다.

8개의 좋아요

일단 디버깅하는 방법부터 공부하세요.
F9로 브레이크포인트 잡고, F10으로 한줄씩 실행시키는 디버깅만 할줄 알아도 자잘한 버그는 다 잡습니다.
그 다음에는 try~catch를 왜 하는지? 어떻게 대처를 해야하는지? 공부하세요.
그냥 return해버릴거면 뭐하러 try~catch를 하나요? 어짜피 줄줄이 에러날텐데. 이럴거면 그냥 죽이는게 낫죠.

1개의 좋아요

와우… 감사합니다!! 의외로 간단히 해결될수 있을것같네요!!
기본지식이 없다가 만들어진 소스를 찾고 수정해가다 보니
ㅠㅠㅠ 감사합니다!!

2개의 좋아요

답답하신 마음 십분 이해합니다!!
말씀하신대로 왜 Try catch 하는지도 모르구요…
그냥 이 소스가 그렇게 만들어져 있어서 입맛에 맞게 고치다보니…
컴퓨터가게를 하지만, 프로그램 만지는건 마치 워드 3급 필기시험 준비하는 사람보다도
수준미달인 격이라…
앞으로도 처음부터 차근차근 배우기엔 어려울것 같고…
그래도 몇개월 열심히 하다보니 이제는 들여다보고 검색좀하면
아 이런 구조구나 하고 느낌은 올정도가 되긴했습니다…
물론 기본지식이 하나도 없고 이 프로그램에 국한된 얘기지만요…
일단 F9와 F10으로 한줄씩 실행시키는 부분은 몰랐던 내용이고
그 부분을 배우면 왠지 좀더 디테일하게 수정할수 있을것같습니다!
조언 감사드립니다.
다만 조언해주신 내용을 읽는 입장에서, 글쓰신분의 의도와는 다를 수 있겠지만,
무언가 비아냥거림이라던지, 도움을 줄 생각보다는 기본도 안된 사람이
이런 질문을 하는게 마음에 안든다는 뉘앙스가 풍겨지는 느낌이
다소 안타깝긴 합니다. 그런 의도가 없으셨다면 더욱 아셔야 될 것 같아서 글 남겨봅니다.

6개의 좋아요

위 링크들의 글들로 인해 과거부터 지속적인 행동강령을 위반하시는 것 같습니다.

글로 감정을 드러내는 것은 어려운 일이니 조금만 부드럽게 말씀해주시면 좋겠습니다.

앞으로 주의 부탁드립니다.

https://www.dotnetdev.kr/coc/

4개의 좋아요

고견을 통해 수정한 내용 공유하고자 들렀습니다!!

sb.Append(“?” + “예를들어이렇게시작” + “=” + 머시기머시기);
sb.Append(“&” + “temp” + “=” + mainForm.txtResult); <— 이부분이 문제의 그 부분입니다.

WebRequest myWebRequest = WebRequest.Create(sb.ToString());
WebResponse myWebResponse = myWebRequest.GetResponse();
StreamReader reader = new StreamReader(myWebResponse.GetResponseStream());

이부분을 아래처럼 수정했습니다.

sb.Append(“?”);
sb.Append(“&” + “예를들어이렇게시작” + “=” + 머시기머시기);
sb.Append(“&” + “temp” + “=” + mainForm.txtResult);

byte[] byteArray = Encoding.UTF8.GetBytes(string.Concat(sb.ToString())); <— 추가
HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url); <— url로 변경
myWebRequest.Method = “POST”; <— 추가
myWebRequest.ContentType = “application/x-www-form-urlencoded; charset=UTF-8;”; <— 추가
myWebRequest.ContentLength = byteArray.Length; <— 추가

Stream dataStream = myWebRequest.GetRequestStream(); <— 추가
dataStream.Write(byteArray, 0, byteArray.Length); <— 추가
dataStream.Close(); <— 추가

WebResponse myWebResponse = myWebRequest.GetResponse();
StreamReader reader = new StreamReader(myWebResponse.GetResponseStream());

sb.Append(“?”); 이부분으로 시작하는건 등록이 안되더라구요.
임시방편으로 이렇게 한줄 추가하고 다음부터 &로 시작하는건 등록이 잘되구요.

php쪽이나 다른 부분은 아예 안건드렸습니다.

일단…!!!
작동이 잘 된다는 점에서 매우 만족…

전문가분들이 보기엔 거슬리시는 부분이 분명 있겠지만!!
문제에 봉착한다면 다시 찾아뵙겠습니다.

정말 진심으로 무척 감사드립니다!!

8개의 좋아요

@나무컴퓨터 성격이 엄청 꼼꼼하시네요. 실력 금새 느실거에유!

4개의 좋아요

감사해용!!
어떤면에서 그렇게 느끼셨는지 모르겠지만…
추측해보자면 후기남긴것…?ㅠ_ㅠ
저도 정보가 필요해서 검색을 하다보면
다들 해결을 한건지 어쩐건지 알수가 없는 정보가 대다수여서…
저로 인해 한분이라도 이런 후기를 남기게 되면 좋을것같아서
귀찮음이 있지만 해보았습니당!!
이 문제로 골치 아픈 시간을 되돌아보면, 이깟 후기 올리는 시간쯤이야…ㅎㅎ
좋게 봐주셔서 감사합니당!!

4개의 좋아요

@나무컴퓨터 질문글도 그렇고 정성이느껴지십니다!! ㅎㅎ

2개의 좋아요

결과를 남겨주시는 것 자체가
추후에 비슷한 이슈로 찾아오시게 될 다른 분들을 위해 도움이 많이 됩니다.
그런 배려에서 나온 행동은 저도, 또는 (제 생각에는) 저희들 모두 응원합니다.
그리고 지식이 얕다고는 하시지만, 문제 접근 및 질문/해결 방법은 이미 훌륭하신 것 같은걸요.
어쩌면 저보다 더 젠틀하실지두 ㅎㅎ

4개의 좋아요

축하드려요 ㅎㅎ

문자열 만드실때 약간의 팁을 드리자면, 문자열 보간(String Interpolation)이라고 하는 기능을 이용하시면 좀더 편하게 문자열을 이어붙일 수 있습니다.

sb.Append("&" + "예를들어이렇게시작" + "=" + 머시기머시기);
sb.Append("&" + "temp" + "=" + mainForm.txtResult);

이거를

sb.Append($"&변수1={변수1}");
sb.Append($"&temp={mainForm.txtResult}");

이런식으로 작성하시면 좀더 가독성있게 문자열을 조합할 수 있습니다.
큰따옴표 앞에 달러기호($)를 붙이고, 큰따옴표 사이에 넣고 싶은 변수가 있다면 {변수명} 이런식으로 중괄호로 감싸서 변수를 넣으시면 됩니다.

화이팅입니다 :blush: :blush:

5개의 좋아요