관리 메뉴

나만을 위한 블로그

[PHP] PHP에서 INSERT문 사용 시 에러 해결(글 조회수) 본문

PHP

[PHP] PHP에서 INSERT문 사용 시 에러 해결(글 조회수)

참깨빵위에참깨빵 2020. 1. 12. 20:57
728x90
반응형

게시판을 만들고 이 안에서 글을 작성하기 위해 INSERT 문을 사용했는데, 글 작성이 완료됐다는 alert는 정상 출력되지만 DB에 저장도 안 되고 게시판 안에 출력되지도 않았다.

 

원인이 무엇인지 생각해봤다.

 

1. DB 설정 오류

2. SQL문 오타(컬럼명과 값 이름 등)

3. php 변수 오타

4. DB 연결 안 됐는데 난 됐다고 생각한 걸지도?

 

먼저 4번 원인부터 확인했다. DB 연결은 아래와 같이 했다.

 

session_start();
header('Content-Type: text/html; charset=utf-8'); // utf-8인코딩

$db = new mysqli("localhost", "root", "비밀번호", "DB 이름");
$db->set_charset("utf8");

function mq($sql)
{
global $db;
return $db->query($sql);
}

 

전에 했었지만 한번 더 확인하고자 dbconn.php 파일을 별도로 만들어 다시 확인해봤다.

dbconn.php 파일의 내용은 아래와 같다.

 

// $conn = mysqli_connect("localhost", "root", "비밀번호", "DB 이름"); <- php에서 MySQL에 연결하는 함수는 2개가 있다. 이걸로 해도 된다.

$conn = new mysqli("localhost", "root", "비밀번호", "DB 이름");
if ($conn->connect_error) {
  die("연결 실패 : " .$conn->connect_error); // 연결 실패 시 원인을 출력한다
} else {
  echo "연결 성공"; // 연결 성공 시 웹 페이지 좌상단에 연결 성공이라는 문구를 출력한다
}

 

결과는 연결 성공이 출력됐고, 이걸로 4번 원인은 아니라고 판단했다.

 

 

다음은 3번 원인이다. php 변수에 오타가 있다면 웹 페이지에 출력이 됐겠지만, 혹시 몰라서 유, 에스, 아이, 디 식으로 한 글자씩 읽으며 내 의도와 똑같은 변수명을 지정해준 게 확실한지 확인했다.

두 번 정도 읽었지만 틀린 곳은 없었다. 이걸로 3번 원인도 아니다.

 

 

다음은 2번 원인이다. SQL문 오타. 이 에러일 거란 직감이 강하게 들었다. 엔간하면 다 이놈한테서 발생하는 에러기 때문에 SQL문을 확인하는 사이트에서 확인해봤다.

 

https://www.eversql.com/sql-syntax-check-validator/

 

SQL Syntax Check Online, SQL Validator, Instant SQL Compiler Online

Online SQL Query Optimization, Easily, Automatically

www.eversql.com

 

여기에 INSERT 문을 넣고 돌려봤다.

그런데 결과는 정상이라는 거다.

 

????????????????????????? 그럼 뭐야????

 

 

그래서 마지막으로 1번 원인을 확인해봤다. 하이디 SQL을 켜서 DB 설정을 다시 확인해봤다.

처음에는 잘 보이지 않았다. 그래서 아이디어를 기록해 둔 메모장을 켜서 처음 DB 설계했을 때의 내 의도와 비교해가며 DB를 확인했다.

이것까지 보고 나서야 알았다. 조회수 컬럼(hit)이 문제였다.

 

조회수는 기본값이 0부터 시작하는 컬럼이어야 한다.

그런데 난 '기본값 없음'으로 설정해뒀다. 바로 기본값을 0으로 바꾸고 다시 글 작성을 시도했다.

 

$sql = "INSERT INTO board(name, pw, title, content, date)
  VALUES('".$_POST['name']."', '".$userpw."', '".$_POST['title']."', '".$_POST['content']."', '".$date."');";

  $result = mysqli_query($db, $sql); // DB 연결 결과와 SQL문을 $result 변수 안에 넣고

  if ($result === false) { // false가 나왔다면 무슨 에러인지 출력한다(29번 줄의  태그를 주석 쳐야 제대로 볼 수 있다)
    echo mysqli_error($db);
  }

 

잘 된다.

 

조회수 컬럼은 기본값 없음으로 설정하는 게 아니라 기본값을 0으로 설정해야 한다...

애초에 내가 생각없이 DB를 만든 게 잘못이었다. 이거 때문에 날려버린 내 하루...

반응형
Comments