PHP에서 MySQL을 연동하여 데이터를 가져오거나(select), 수정(update), 삭제(delete) 등을 할 때 사용하는 간단한 흐름이다.
네이버 지식인에 질문하는 사항을 가지고 간단하게 정리한다.
<?php |
The MySQLi Extension (MySQL Improved) is a relational database driver used in the PHP scripting language to provide an interface with MySQL databases.
PHP Connect to MySQL - MySQL (procedural) : MySQL DB에서만 동작하며, , PHP 7.0 이상에선 동작안됨. PHP 5.5에서 deprecated - MySQLi (procedural) : MySQL DB에서만 동작한다. - MySQLi (object-oriented) : MySQL DB에서만 동작한다. |
MySQL DB에서 가져온 데이터(배열)을 반환하는 함수에 대해 알아보자. (절차지향 MySQL 방식)
mysql_query |
MySQL 서버에 하나의 쿼리를 전송한다. select, show 와 같이 레코드를 생성하는 쿼리는 그 리소스를 반환한다. insert, update, delete 와 같이 결과 레코드가 없는 쿼리는 true, false 를 반환한다. |
mysql_result |
쿼리의 결과 레코드를 반환한다. <?php |
mysql_fetch_row | 쿼리의 결과 레코드를 숫자 인덱스 배열로 반환한다. 이 레코드를 배열 형태로 되돌려 준다. 이 배열에서 필드값을 가져오려면 인덱스로 숫자를 사용한다. |
mysql_fetch_assoc | 쿼리의 결과 레코드를 연관 배열로 반환한다. 이 레코드를 배열 형태로 되돌려 준다. 배열의 인덱스로 필드 이름을 사용할 수 있어서 직관적이고 사용하기 편리하다. |
mysql_fetch_array | 쿼리의 결과 레코드를 숫자 인덱스 배열이나 연관 배열로 반환한다. |
select 구문으로 조회(mysql_query)하고 그 결과인 result set 에서 레코드를 한개씩 리턴해주는 함수에는 mysql_fetch_row, mysql_fetch_assoc, mysql_fetch_array 가 있다.
MySQL 함수명 |
MySQLi 함수명 |
리턴값 |
mysql_fetch_row |
mysqli_fetch_row |
일반배열 |
mysql_fetch_assoc |
mysqli_fetch_assoc |
연관배열 |
mysql_fetch_array |
mysqli_fetch_array |
일반배열 + 연관배열 |
mysql_fetch_row(resource $result)
mysql_fetch_row()는 데이터를 0으로 시작하는 숫자형 인덱스 배열로 반환한다.
가장 빠르다고 알려져 있으나 어느 컬럼을 가져왔는지 가독성이 떨어진다.
컬럼명이 얼마 안될 경우 혹은 문서 정리가 잘 되어있을때 사용 하도록 한다.
$row[0]; //인덱스 번호로만 데이터를 출력한다.
mysql_fetch_assoc(resource $result)
mysql_fetch_assoc()는 데이터를 문자형 연관 배열로 반환한다.
가장 많이 사용되는 함수로써 키값을 가지고 데이터를 출력한다.
데이터베이스에서 SELECT문으로 해당 컬럼을 키값만으로 출력이 가능하다.
$row['id'];
$row['userID']; // 필드의 이름은 대소문자를 구별한다.
mysql_fetch_array(resource $result [, int $result_type ])
$result_type 은 생략 가능하며, 생략하면 MYSQL_BOTH
mysql_fetch_array($result, MYSQL_NUM) = mysql_fetch_row($result)
mysql_fetch_array($result, MYSQL_ASSOC) = mysql_fetch_assoc($result)
mysql_fetch_array($result, MYSQL_BOTH)
인덱스(숫자)번호와 연관 배열의 키값으로 데이터를 가져 올 수 있다.
성능이 크게 차이는 없으나 데이터가 많을 시 key[0] 번째 값과 key['키'] 인덱스 배열과 연관배열값을 모두 가져 오기 때문에 불필요한 메모리가 쌓인다.
성능에 미치는 영향이 별로 없다면 mysql_fetch_array 함수를 사용하는 것이 편하다.
입문자들이 코딩하면서 책에 나온대로 따라 연습하면서 놓치는 부분은 사소한 곳에 있다.
$sql ="SELECT id,pass FROM testboarduser where id='".$id."'";
$result=mysql_query($sql,$conn);
이렇게 두줄로 처리하기도 하지만 더 심하게는 간단하게 한줄로 코딩한다고
$result=mysql_query("SELECT id,pass FROM testboarduser where id='".$id."'",$conn);
로 처리한다.
로직상 틀린 것은 없다.
하지만 문제점을 발견하기 위해서 디버깅을 한다고 치자.
$result=mysql_query("SELECT id,pass FROM testboarduser where id='".$id."'",$conn);
은 문제가 어디에서 생겼는지 발견하기가 쉽지 않다.
$sql ="SELECT id,pass FROM testboarduser where id='".$id."'";
echo $sql; // 데이터가 원하는 결과대로 나오는지 확인 목적
$result=mysql_query($sql,$conn);
이렇게 하면 DB 연결이 잘된 것인지 아닌지 확인이 가능해진다.
$sql ="SELECT id,pass FROM testboarduser";
$sql.=" where id='".$id."'";
$result=mysql_query($sql,$conn);
그러면 왜 이렇게 $sql 을 분리해서 코딩하는 걸까?
검색어를 입력해서 검색어가 포함된 결과를 돌려받고 싶다. 검색어 조건이 2개 이상이다.
이런 경우 등을 처리할 때 유연하게 처리가 가능하기 때문이다.
MySQLi 접속방식과 MySQL 접속방식으로 코딩시 DB 연결 부분을 실수하는 초보자가 많다.
MySQL |
//SQL Query |
MySQLi |
//SQL Query |
<?php
@extract($_GET); // $_GET['cat1'] 대신에 $cat1 이라고 써도 되도록 해준다.
include "db_info.php"; // db 연결
$sql ="SELECT id,pass FROM testboarduser";
$sql.=" where display=1";
if (isset($cat1)&& !empty($cat1)) $sql.= ' and category1='.$cat1;
if (isset($cat2)&& !empty($cat2)) $sql.= ' and category2='.$cat2;
if(isset($where) && !empty($where) && isset($keyword) && !empty($keyword)){
if($where=="name"){
$sql.= " and name LIKE '%".trim($keyword)."%'";
} else if( $where=="phone" ){
$sql.= " and (cellphone LIKE '%".trim($keyword)."%' OR officephone LIKE '%".trim($keyword)."%')";
} else {
$sql.= " and ".$where." like '%".trim($keyword)."%'";
}
}
$sort = isset($sort) ? $sort : 1;
if($sort ==1){
$xsort = "uid";
$xorderby = "desc";
}else if($sort ==2){
$xsort = "hit";
$xorderby = "desc";
}else if($sort ==3){
$xsort = "name";
$xorderby = "desc";
}else if($sort ==4){
$xsort = "cellphone";
$xorderby = "desc";
}
$xsort = isset($xsort) ? $xsort : 'uid';
$xorderby= isset($xorderby) ? $xorderby : 'desc';
$sql.="order by ".$xsort." ".$xorderby."";
$curPage = isset($curPage)? $curPage : 1; // 출력할 페이지 번호
$rowsPage = isset($rowsPage)? $rowsPage : 10; // 기본 10개씩 출력
$sql.=" LIMIT ".$curPage.",".$rowsPage."";
echo $sql; // 쿼리문이 제대로 된 것인지 확인 목적
$result=mysql_query($sql,$conn);
while($row=mysql_fetch_array($result)){
// 출력할 내용 테이블 형태로 작성
}
?>
이와같이 복잡한 쿼리문을 유연하게 처리하기 위해서 $sql 변수를 분리해서 사용하는게 좋다.
LIMIT 개념 이해는 https://www.w3schools.com/php/php_mysql_select_limit.asp 사이트를 애용하면 대부분 해결 될 것이다.
찾고자 하는 걸 구글링을 하듯이 https://www.w3schools.com/ 사이트를 찾아보면 정말 유용한 사이트라고 감탄하게 된다.
같이보면 도움되는 게시글
http://link2me.tistory.com/1110
'Web 프로그램 > DB 연동 및 처리' 카테고리의 다른 글
MySQLi 객체 접속 방식(중복자료 검사 및 Insert) (0) | 2017.10.07 |
---|---|
PHP 에서 MySQL 테이블 생성하는 방법 (0) | 2017.05.17 |
[PHP] 통신의 기본 이해 및 코딩방법 ★★★★★ (1) | 2016.10.28 |
[PHP기초] mysql_num_rows() 함수 (0) | 2016.10.08 |
[중급] MySQL 사용자 함수 - dbClass.php (0) | 2016.08.27 |