mysqli 에서 SELECT 쿼리를 실행한 후, 그 결과값을 뽑아 내는 방법을 간단히 보겠습니다.

$mysqli = new mysqli($DB[‘host’], $DB[‘id’], $DB[‘pw’], $DB[‘db’]);
if (mysqli_connect_error()) {
exit(‘Connect Error (‘ . mysqli_connect_errno() . ‘) ‘. mysqli_connect_error());
}

$q = “SELECT * FROM ap_member WHERE id=’$user_id'”;
$result = $mysqli->query( $q);

위처럼 루틴하게 mysqli 연결의 끈을 생성시키고, 쿼리를 실행시킵니다.

실행결과는 $result 에 담겨있지요.

$result->num_rows

위처럼 하면, 쿼리의 결과로 넘어온 행의 갯수를 알수 있습니다.

$row = $result->fetch_array(MYSQLI_ASSOC);

위처럼 하면, 넘어온 결과를 한 행씩 패치해서 $row 라는 배열에 담아낼 수 있습니다.

fetch_array()함수의 인자로 들어갈 수 있는 값이 3개가 있네요.

php.net 에서 설명하고 있는 차이점입니다.

/* numeric array */
$row = $result->fetch_array(MYSQLI_NUM);
printf (“%s (%s)\n”, $row[0], $row[1]);

/* associative array */
$row = $result->fetch_array(MYSQLI_ASSOC);
printf (“%s (%s)\n”, $row[“Name”], $row[“CountryCode”]);

/* associative and numeric array */
$row = $result->fetch_array(MYSQLI_BOTH);
printf (“%s (%s)\n”, $row[0], $row[“CountryCode”]);

MYSQLI_NUM 으로 패치를 할 경우, 배열의 각 값에 접근하기 위해서는 숫자 첨자를 이용해야합니다.

우리의 예처럼 MYSQLI_ASSOC 로 패치할 경우에는 테이블의 필드명을 첨자로 해서 값에 접근할 수 있습니다.

이것, 저것 둘 다 이용하고 싶으면, MYSQLI_BOTH 를 함수 인자로 사용하면 됩니다.

$result->free();

쿼리의 결과를 이용하고 난 후에는 불필요한 리소스 낭비를 위해서 메모리를 해제 시켜줍니다.

출처: http://zzaps.tistory.com/29 [궁극의 잡 블로그]

Mysql_fetch_row사용 예

<?
$connect=mysql_connect(‘localhost’,’user id’,’password’);
mysql_select_db(“dbname”,$connect);

$query=”select num,title,content from board”;
$result=mysql_query($query,$connect);
$row=mysql_fetch_row($result);  // 레코드를 한개씩 배열로 저장

echo “$row[0],$row[1],$row[2]”;

echo “$row[0] // 테이블의 전체 레코드 개수 저장


?>

Mysql_fetch_array사용 예

<?
$connect=mysql_connect(‘localhost’,’user id’,’password’);
mysql_select_db(“dbname”,$connect);

$query=”select num,title,content from board”;
$result=mysql_query($query,$connect);
$row=mysql_fetch_array($result);

echo “$row[num],$row[title],$row[content]”;
?>

위의 두 예제를 보시면 이해가 되시나요..

mysql_fetch_row는 데이터베이스에서 가져온 데이터를 배열로 패치(fetch)할 때 0부터 배열이름을 부여합니다.

하지만 mysql_fetch_array는 정돈된 데이터베이스의 필드이름을 그 값의 key값으로 가져오게 됩니다.

보통 select할 데이터 필드가 적을 경우라면 mysql_fetch_row를 사용해도 상관없지만 만약 select할 데이터 필드가 많다면 mysql_fetch_array를 사용하여 필드 이름을 배열의 key값으로 가져오는것이 훨씬 유리합니다.

만약 select할 필드 값이 많은데 mysql_fetch_row를 사용했다면 어떻게 될까영..후후..
고달프겠졍…하나,두울,세엣,네엣…….열…ㅡㅡ;

MySQL 테이블에 저장되어있는 값을 쿼리를 통해 선택 한 후에는, 그 값을 바로 사용할 수 없다.

그것을 PHP가 인식할 수 있는 형태로 변환해 주어야 하는데, 그것을 아래의 함수를 통해 할 수 있다.

 

 

테이블

필드명 name value
저장값 CUFFS アメサラサ
  1. fetch_array

이 함수는 결과를 배열로 뽑아내는데, 번호로 된 배열과 필드 이름으로 된 배열 두가지가 동시에 생성된다.

위와 같은 테이블에서 데이터를 뽑아내면 fetch_array 를 통해 뽑아낸 배열의 구조는 다음과 같다.

Array (

    [0] => CUFFS

    [name] => CUFFS

    [1] => アメサラサ

    [value] => アメサラサ

)

사용법

$data = mysql_fetch_array($data_); or $data = mysqli_fetch_array($data_); or $data = $data_->fetch_array();

echo $data[‘name’].’ => ‘.$data[1];

fetch_array의 경우 설정에 따라 번호로 된 배열로만 뽑아낼 수도 있고, 필드 이름으로만 된 배열을 뽑아낼 수도 있다.

다음과 같은 상수를 사용해서 처리할 수 있다.

MYSQL_BOTH – 기본값

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_BOTH); or $data = mysqli_fetch_array($data_, MYSQL_BOTH);
or $data = $data_->fetch_array(MYSQL_BOTH);

        결과 -> 위의 fetch_array 의 결과와 동일

MYSQL_ASSOC

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_ASSOC); or $data = mysqli_fetch_array($data_, MYSQL_ASSOC);
or $data = $data_->fetch_array(MYSQL_ASSOC);

        결과 -> 아래의 fetch_assoc 의 결과와 동일

MYSQL_NUM

        사용법 -> $data = mysql_fetch_array($data_, MYSQL_NUM); or $data = mysqli_fetch_array($data_, MYSQL_NUM);
or $data = $data_->fetch_array(MYSQL_NUM);

        결과 -> 아래의 fetch_row 의 결과와 동일

  1. fetch_assoc

이 함수는 필드 이름으로 된 배열로만 저장한다.

Array (

     [name] => CUFFS

     [value] => アメサラサ

)

사용법

$data = mysql_fetch_assoc($data_); or $data = mysqli_fetch_assoc($data_); or $data = $data_->fetch_assoc();

echo $data[‘name’].’ => ‘.$data[‘value’];

  1. fetch_row

이 함수는 숫자로 된 배열로 저장한다.

이 경우 필드의 순서를 바꾸거나 하면 전혀 다른 결과가 나올 수 있기 때문에 그것까지 고려를 해 프로그래밍 해야 한다.

Array (

[0] => CUFFS

[1] => アメサラサ

)

사용법

$data = mysql_fetch_row($data_); or $data = mysqli_fetch_row($data_); or $data = $data_->fetch_row();

echo $data[0].’ => ‘.$data[1];

 

 

  1. fetch_object

이 함수는 배열이 아닌 객체로 결과값을 받아온다.

stdClass Object (

[name] => CUFFS

[value] => アメサラサ

)

사용법

$data = mysql_fetch_object($data_); or $data = mysqli_fetch_object($data_); or $data = $data_->fetch_object();

echo $data->name.’ => ‘.$data->value;

 

 

 

위의 4가지 함수에 대해 알아보았다.

그렇다면 위의 4가지 각각의 함수 속도는 어떻게 될 것인가?

그것에 대해 PHP 매뉴얼은 다음과 같은 답변을 내놓고 있다.

 

  1. fetch_array

mysql_fetch_array()는 필드 이름으로 된 색인이 추가되지만, mysql_fetch_row() 보다 느려지지는 않는다.

  1. fetch_assoc

mysql_fetch_assoc()는 필드이름으로 된 색인이 추가되지만, mysql_fetch_row() 보다 느려지지는 않는다.

  1. fetch_row

언급 없음

  1. fetch_object

속도면에서, 이 함수는 mysql_fetch_array()와 비슷하고, mysql_fetch_row()만큼이나 빠르다. 그러나 큰 차이는 없다.

 

그렇다면, 과연 진짜로 그런것일까.

테스트를 위해 다음과 같은 가상 환경을 제작하였다.

 

1) 21 Fields

2) 100,000 Records

 

$data_ = $mysqli->query(“SELECT * FROM test_table“);

while($data = $data_->fetch_array()) {}

 

다음과 같은 PHP 코드로 실행되는 함수들은, 각각 10만번의 동작을 거칠 것이다.

 

그리고 그에 대한 결과는 다음과 같이 나타났다.

 

환경: MyISAM & 21 Fields & 100,000 Records
단위: sec fetch_array fetch_assoc fetch_object fetch_row
1번째 시도 2.2280280590057 1.388512134552 3.3347442150116 1.2834389209747
2번째 시도 1.6447999477386 1.3500959873199 2.7877049446106 1.0823369026184
3번째 시도 1.7114689350128 1.303701877594 2.8545777797699 1.0900609493256
4번째 시도 1.8702390193939 1.5157608985901 3.1205198764801 1.1778881549835
5번째 시도 1.6467909812927 1.3309321403503 2.7673869132996 1.1073391437531
평균 1.82026538848874 1.37780060768126 2.97298674583436 1.14821281433106

fetch_object > fetch_array > fetch_assoc > fetch_row 의 순서를 보여주고 있다.

결과를 자세히 보면, 10만개의 데이터를 뽑는데 걸리는 시간은 길어봐야 3초 밖에 되지 않는다.

그러나 어느 특정한 경우를 제외하면 10만개의 데이터를 동시에 뽑아내는 사람은 없을 것이다.

그렇기에 PHP 매뉴얼의 말도 일리는 있지만, 차이는 존재한다.

기왕 시작한 김에, 위의 fetch_array 시 상수를 통해 컨트롤 할 수 있는 부분의 속도도 체크해보았다.

환경: MyISAM & 21 Fields & 100,000 Records 「fetch_array」
단위: sec MYSQL_BOTH MYSQL_ASSOC MYSQL_NUM
1번째 시도 2.0118298530579 1.3998398780823 1.1996338367462
2번째 시도 1.8045439720154 1.630038022995 1.3843371868134
3번째 시도 1.703469991684 1.3845191001892 1.2655489444733
4번째 시도 1.7362868785858 1.393550157547 1.1305871009827
5번째 시도 1.7584209442139 1.3735721111298 1.1451189517975
평균 1.8029103279114 1.43630385398866 1.22504520416262

MYSQL_BOTH = fetch_array

MYSQL_ASSOC = fetch_assoc

MYSQL_NUM = fetch_row

와 동일한 속도를 보여주고 있다(당연한 결과겠지만 말이다).



출처: http://delirussum.tistory.com/entry/PHP-MySQL-Fetch-함수 [My Documents]

 

mysql_fetch_assoc(resource)

– 리턴값 : 배열

– 인덱스배열을 빼고, 이름을 지닌 배열을 리턴한다.

– row[name] 이런식.

출처 : http://e2xist.tistory.com/415

 

보통 아래와같이 쿼리를 날리면…갯수를 얻어올 수 있다.

SELECT count(*) FROM A;

A 테이블의 행 갯수…

여기서 A 테이블의 a 라는 조건이 1일때만 count 하도록 해보자

SELECT count(if(a=1, a, null)) FROM A;

출처: http://marlboroyw.tistory.com/288 [ywlee861009]

출처 : http://blog.kurien.co.kr/519?category=574625

출처 : https://appletree.or.kr/blog/notes/mysql%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EC%9D%B8%EC%BD%94%EB%94%A9default-encoding%EC%9D%84-utf8%EC%9C%BC%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/

출처: http://mcpaint.tistory.com/194 [MC빼인트와 함께]

다른 컬럼 다음으로 이동

첫번째 위치로 이동

출처 : https://zetawiki.com/wiki/MySQL_%EC%BB%AC%EB%9F%BC_%EC%88%9C%EC%84%9C_%EB%B0%94%EA%BE%B8%EA%B8%B0