본문 바로가기

코딩공부/WEB3 - PHP & MySQL

[5] PHP와 MySQL의 연동, SELECT

데이터베이스로부터 데이터를 읽어오기

 

실습준비

select를 API단에서 깔끔하게 체크하기 위해서 index.php 를 지금 수정하지 않고, select.php 파일을 만들어서 처리한다.

 

topic 테이블에 데이터 저장 후, 이 데이터들을 select.php 파일에서 출력할 것이다.

 

select.php

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  '111111',
  'opentutorials');
# 실서버에서 모든 데이터를 가져오는 것은 위험하다. 대용량의 데이터로 과부하가 걸릴 수 있기 때문에 LIMIT 으로 제한된 갯수의 데이터만 가져오도록 해야한다.
$sql = "SELECT * FROM topic LIMIT 1000";
$result = mysqli_query($conn, $sql);
var_dump($result);
var_dump($result->num_rows);
?>

 

var_dump($result); 로 쿼리 실행 리턴값을 확인

'mysqli_result' 라고 하는 객체를 반환하고 있고, 객체에는 num_rows : 행의 갯수, field_count : 컬럼의 갯수 들이 담겨 있다.

 

mysqli_query

mysqli_query 로 반환된 객체에 topic 테이블의 행이 담겨져 있지 않고, (우리가 예상한 것과는) 다른 것이 담겨있다는 것을 확인했다.

mysqli_query 이 무엇인지 속성을 확인해보자

 

실패했을 때 'FALSE'를 리턴값으로 반환한다. SELECT, SHOW, DISCRIBE와 같이 정보를 읽는 것과 관련된 쿼리를 실행했을 때는 mysqli_result 라는 객체를 반환한다.

그 외, INSERT, UPDATE, DELETE 와 같은 명령을 실행했을 때 결과가 성공하면 'TRUE'를 리턴한다. 

 

num_rows : sql 실행 결과의 갯수

 

 

mysqli_fetch_array 사용법

mysqli_fetch_array를 이용해서 mysql 서버가 응답한 결과를 배열로 변환하는 방법

 

데이터베이스로 부터 가져온 데이터를 PHP에서 활용해야 한다.

데이터베이스와 PHP는 서로 완전히 다른 기술이기 떄문에 , PHP라는 컴퓨터 언어를 통해서 그 데이터를 활용하기 위해서는 PHP 데이터 타입으로 전환하는 과정을 거져야 된다. mysqli_fetch_xxx 이름의 API 들이 그러한 역할을 한다. ( *fetch : 가져오다. )

 

mysqli_fetch_array 

mysqli 쿼리를 통해서 우리가 가져온 데이터를 php에서 사용할 수 있도록 전환해서 가져온다. 그 때, 배열, 연관 배열, 객체 등의 원하는 데이터 타입으로 가져올 수 있다. 그 중 익숙한 array이로 가져와서 사용해보자

 

mysqli_fetch_array의 문법 확인

 

첫번째 인자로 mysqli_result 가 온다. 예제를 통해서 확인

mysqli_query()의 결과값을 $result에 받아서 mysqli_fetch_array()의 첫번째 인자값으로 넘기고 있다.

 

mysqli_fetch_array 반환값 확인

 

1. 배열이 리턴되었다.

2. 실제 데이터베이스에 저장돼있는 데이터는 4건인데 출력된 데이터는 그 중 첫번째 행만을 보여주고 있다.

3. 출력된 결과를 보면, 값들이 두 번씩 반복된다.

 첫번째 - 값의 자릿수, 두번째 - 컬럼명

 우리는 데이터를 선택적으로 가져올 수 있다.

 

mysqli_fetch_array 결과값을 $row 변수에 담고, 인덱스 또는 컬럼명으로 데이터를 가져올 수 있다.

ex ) $row[0] , $row['title']

 

  • 연관 배열 : 컬럼명을 통해서 데이터를 가져오는 형식의 배열
  • 배열 : 인덱스를 통해서 가져오는 형식의 배열

sql문의 조건(where)을 추가해서 하나의 행을 표현

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  '111111',
  'opentutorials');
# 실서버에서 모든 데이터를 가져오는 것은 위험하다. 대용량의 데이터로 과부하가 걸릴 수 있기 때문에 LIMIT 으로 제한된 갯수의 데이터만 가져오도록 해야한다.
$sql = "SELECT * FROM topic WHERE id=10"; #조건(where)으로 하나의 행 가져오기
$result = mysqli_query($conn, $sql);
// var_dump($result);
// var_dump($result->num_rows);
$row = mysqli_fetch_array($result);
# mysqli_fetch_array의 결과값 확인
# var_dump 정보가 많아서 보기 힘들면, print_r 로 확인
// print_r($row)
echo '<h1>'.$row['title'].'</h1>';
echo $row['description'];
?>

 

여러 행을 가져오는 방법

※ mysqli_fetch_array 특징

1. mysqli_fetch_array 함수는 실행할 때마다 쿼리문의 결과를 하나씩 하나씩 배열로 리턴한다.

2. 더이상 데이터가 없다면 'NULL' 값을 리턴한다.

mysqli_fetch_array 리턴값

 

$row를 여러번 찍어보면 다음과 같이 두번째, 세번째 데이터를 가져오고 있다.

 

더 이상 가져올 데이터가 없을 때, mysqli_fetch_array 는 어떻게 동작할까?

추가적으로 아무것도 출력되지 않는다.

그렇다면 $row 라는 데이터에 무엇이 담겨있는지 구체적으로 확인해보자. 

'NULL'이 출력된다.

 

데이터의 추가, 삭제에 따라 로직을 바꿀 수 없으므로 반복문(while)을 통해 데이터가 존재하는 경우 반복해서 가져오도록 코드를 리팩토링 한다.

* PHP에서는 NULL == false 는 true 이다.

<?php
$conn = mysqli_connect(
  'localhost',
  'root',
  '111111',
  'opentutorials');
// 1 row
echo "<h1>single row</h1>";
$sql = "SELECT * FROM topic WHERE id=10";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
echo '<h1>'.$row['title'].'</h1>';
echo $row['description'];

// all rows
echo "<h1>multi row</h1>";
$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)) { #데이터가 있다면 반복 - 모든행을 가져온다.
  echo '<h2>'.$row['title'].'</h2>';
  echo $row['description'];
}
?>