본문 바로가기
PHP

[PHP] DB에서 특정 행들만 가져오기(8) - DB 에서 열 이름 가져오기

by LightBlogger 2017. 9. 19.

열 이름을 가져올 때 mysqli_fetch_field() 등의 새로운 함수를 사용할 수도 있겠지만,


앞서 본 개념만으로도 열 이름을 가져올 수 있다.


이때 쿼리 중에 SHOW COLUMNS 명령이 유용하다.


SHOW COLUMNS FROM user_data



DB에 "SHOW COLUMNS FROM user_data" 를 질의하면 위와 같은 테이블을 반환해 준다.


이제 mysql_fetch_row() 로 이 중 첫 번째 열에 있는 값들만 가져오면 되겠다.


다음을 입력해 보자.


$query = "SHOW COLUMNS FROM user_data";

$result = mysqli_query($conn, $query);

while($row = mysqli_fetch_row($result)){

 echo $row[0];

}


<?php
$conn = mysqli_connect("localhost", "root", "123456789");
mysqli_select_db($conn, "test");
 ?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

<TABLE border=1>

<?php

$list = file("list.txt");

$query = "SHOW COLUMNS FROM user_data";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_row($result)){
 echo $row[0];
}

$i = 0;
while($i<count($list)){
  $log = $list[$i];
  $log = rtrim($log, "\r\n");
  $query = "SELECT * FROM user_data WHERE log_num='%d'";
  $result = mysqli_query($conn, sprintf($query, $log));
  $row = mysqli_fetch_row($result);

  echo "<TR>";
  $j = 0;
    while($j<mysqli_num_fields($result)){
      echo "<TD>",$row[$j],"</TD>";
      $j = $j + 1;
      }
  echo "</TR>";

  $i = $i + 1;
}

 ?>

</TABLE>

  </body>
</html>


결과는 다음과 같다.



표 위쪽에 열 이름이 반환되는 것이 보인다.


이제 표 모양으로 만들기 위해 <TR> 과 <TD> 를 다음과 같이 추가해 주자.


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

<TABLE border=1>

<?php

$list = file("list.txt");

$query = "SHOW COLUMNS FROM user_data";
$result = mysqli_query($conn, $query);
echo "<TR>";
while($row = mysqli_fetch_row($result)){
 echo "<TD>",$row[0],"</TD>";
}
echo "</TR>";

$i = 0;
while($i<count($list)){
  $log = $list[$i];
  $log = rtrim($log, "\r\n");
  $query = "SELECT * FROM user_data WHERE log_num='%d'";
  $result = mysqli_query($conn, sprintf($query, $log));
  $row = mysqli_fetch_row($result);

  echo "<TR>";
  $j = 0;
    while($j<mysqli_num_fields($result)){
      echo "<TD>",$row[$j],"</TD>";
      $j = $j + 1;
      }
  echo "</TR>";

  $i = $i + 1;
}

 ?>

</TABLE>

  </body>
</html>


결과는 다음과 같다.



여기서 새롭게 추가한 while(){} 문이 조금 생소할 수 있다.


조건에 ($i<4) 같은 것 대신 ($row = mysqli_fetch_row($result)) 가 들어있기 떄문이다.


$row = mysqli_fetch_row($result) 는 왠지 while문의 조건 부분이 아니라 중괄호 안쪽에 들어와 있어야 하는 것 같은데 말이다.



원리는 이렇다. 


$row = mysqli_fetch_row($result) 는 while문의 중괄호 안에서와 마찬가지로 $result 의 첫 행을 가져온다.


그럼 조건은?


$row 에 어쨌든 값이 있으므로 while 문은 일단 실행된다. PHP 는 '값이 있음' 을 'TRUE' 와 동일하게 생각한다.


조건이 TRUE 이므로row[0] 는 첫 번째 행의 첫 번째 값을 출력하고 다시 돌아 mysqli_fetch_row() 는 $result 의 두 번째 행을 가져온다.


역시 값이 있으므로(TRUE) while 문은 실행되고, row[0] 는 두 번째 행의 첫 번째 값을 출력한다.


이렇게 네 번 돌고 나서 mysqli_fetch_row() 는 $result 의 다섯 번째 행을 가져오려 하는데


$result 에는 다섯 번째 행이 없다. 고로 $row 에는 아무것도 담기지 않는다. 이때 PHP 는 '값이 없음' 을 'FALSE'로 생각한다.


하여 while 의 조건 안이 FALSE 가 되고 while 문은 종료되는 것이다.



이것을 이용해 while() 문을 조금 더 효율적으로 적을 수 있다.




반응형

댓글