PHP·MySQL·리눅스 등 실무 개발과 트러블슈팅
분명히 잘 들어가던 한글 데이터가 어느 날 갑자기 `???`나 `한글` 같은 외계어로 바뀌어 보인 적 있으신가요. 게시판에 글을 쓰면 멀쩡한데, 터미널에서 덤프를 떴다가 다시 넣으면 죄다 깨지는 상황. 많은 개발자가 여기서 "테이블 문자셋을 utf8로 바꿨는데 왜 안 되지?"라며 몇 시간을 날립니다. > 한글 깨짐의 90%는 파일이 잘못된 게 아니라...
목록 페이지가 갑자기 느려진 적 있으신가요? 어제까지 멀쩡하던 화면이 오늘따라 빙글빙글 돌기만 합니다. 코드는 하나도 안 바꿨는데 말이죠. 저도 처음 이 상황을 겪었을 때 서버를 의심하고, 네트워크를 의심하고, 심지어 컴퓨터를 한 번 껐다 켰습니다. 범인은 엉뚱한 곳에 있었습니다. 데이터가 쌓이면서 인덱스 없는 쿼리가 테이블 전체를 훑기 시작한 것이죠. 오...
밤 11시에 예약해 둔 글이 있었습니다. 다음 날 오전 9시에 자동으로 올라가도록 맞춰 뒀죠. 그런데 아침에 일어나 보니 글은 이미 새벽에 올라가 있었고, 방문자 통계도 엉망이었습니다. 코드를 백 번 봐도 시간 계산에는 문제가 없었어요. 범인은 코드가 아니라 ==서버의 시간대(timezone) 설정==이었습니다. > 시간 버그의 90%는 '계산'이 아니라 ...
사용자 입력을 SQL에 직접 이어붙이면 SQL 인젝션에 노출된다. 결론부터 말하면 mysqli의 prepared statement(준비된 쿼리) 를 쓰면 값과 쿼리 구문이 분리되어 대부분의 인젝션을 원천 차단할 수 있다. 위험한 코드 ```php // 절대 이렇게 쓰지 말 것 $id = $_GET['id']; $sql = "SELECT FROM member...
서비스가 갑자기 멈췄습니다. 로그를 열어보니 `No space left on device`. 디스크가 꽉 찼다는 뜻이죠. 그런데 막상 뭘 지워야 할지 모르면, 이 짧은 한 줄이 사람을 한 시간씩 붙잡아 둡니다. 저도 처음엔 무작정 로그 폴더만 뒤졌다가 엉뚱한 곳에서 헤맸습니다. 오늘은 디스크가 찰 때 ==범인 폴더를 빠르게 찾아내는 순서==를 차근차근 정리...
"7일 뒤"를 계산했는데 결과가 하루씩 밀린 적, 한 번쯤 있으시죠? 저는 회원 쿠폰 만료일을 `strtotime`과 문자열로 대충 계산했다가, 월말과 윤년에서 보기 좋게 틀렸습니다. PHP에서 날짜를 안전하게 다루는 길은 생각보다 단순합니다. ==`DateTime` 클래스== 하나만 손에 익히면 됩니다. > 날짜는 '문자열'이 아니라 '객체'로 다뤄야 실...
PHP에서 가장 자주 만나는 오류 중 하나가 `Warning: Cannot modify header information - headers already sent`다. 결론부터 말하면, HTTP 헤더(쿠키·세션·리다이렉트)를 보내기 전에 이미 본문(HTML, 공백, 출력)이 먼저 전송되었기 때문이다. 원인을 알면 대부분 1분 안에 해결된다. 왜 발생하나 H...
MySQL에 한글을 저장했는데 글자가 `???` 나 깨진 문자로 보인 적 있으신가요? 원인은 대부분 문자셋(charset) 불일치입니다. 한 군데만 어긋나도 깨집니다. 이 글에서 어디를 맞춰야 하는지 순서대로 정리합니다. 결론부터: utf8 말고 utf8mb4 MySQL의 `utf8`은 사실 최대 3바이트만 저장하는 반쪽짜리라 이모지·일부 한자에서 문제가 ...
PHP로 프로젝트를 만들다 보면 거의 한 번은 마주치는 오류가 있습니다. ``` Warning: require_once(.../config/config.php): failed to open stream: No such file or directory Fatal error: require_once(): Failed opening required '.../co...