[PHP] mysqli 의 쿼리 결과 다루기

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();

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

php에서 헥사코드 인코딩,디코딩하기

[php]
//스트링을 헥사코드로 인코딩하기
function String2Hex($string){
$hex=”;
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
[/php]
[php]
//헥사코드를 스트링으로 디코딩 하기
function Hex2String($hex){
$string=”;2014-07-08
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
[/php]

php 를 이용하여 디렉토리에 있는 파일 검색하기

<?

// target directory
$directory=”./bgm”;

// 저장된 디렉토리를 연다. “@”에러 생격도 출력 안하는데 @는 해결책이 아님
$handle = @opendir($directory);

// 디렉토리가 존재하면(is_dir)

if (is_dir($directory)) {
while(false !== ($file = readdir($handle))) {
/* 주의 !
readdir은 모든 디렉토리 안에 기본적으로 존재하는 “.”과 “..”또한 반환하는데
이를 조건을 추가하여 제거 해주면 된다.*/

if ($file != “.” && $file != “..”) {
echo “file : $file
“;
}
}
}
// 열었으면 닫는다.
@closedir($handle);
?>

//만약에 UTF-8 을 쓰고 있다면 리스르로 만든 파일명이 전부 깨지는것을 볼수 있을것이다.
//이유는 가져온 파일명은 UTF-8이 아니기 때문이다. 그래서 변환이 필요하다.

$utffile = iconv(“euc-kr”,”UTF-8″,$file);
//위와 같은 식으로 변환해서 뿌려주면 된다.

zipcode DB를 가져오는곳,.

홈페이지 작업을 하다가 우편번호가 필요할경우

http://www.zipfinder.co.kr/zipcode/index.html

위의 사이트에 가서 우편번호를 다운받을수 있다. 다운받은 dbf 파일을 엑셀로 열어서, 각자 사용하고자 하는

형식으로 저장을 하여 사용하면 된다.

나같은 경우에는 엑셀로 dbf 파일을 열어서 csv 형식으로 저장하고

phpmyadmin을 이용해서 db에 올렸다.

session_start() 에러 해결방법


 


<?
session_start();
?>

이렇게 달랑 하나 있는데 에러 메세지가 떴다. 에러 메세지는 다음과 같았다.

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:\APM_Setup6\htdocs\index.php:1) in C:\APM_Setup6\htdocs\ndex.php on line 1

구글 번역기를 돌려 보니 “세션 캐시를 보낼 수없습니다 리미 – 헤더를 이미 보낸”이라고 나왔다.

즉, 헤더를 이미 보냈기 때문에 세션을 시작할 수 없다는 뜻이다.

php에서 세션 관련 함수, 헤더 관련 함수는 어떤 출력(echo나 html 문자)도 있기 전에 와야 한다는 건 익히 알고 있었지만, 그렇게 했는데도 에러가 나는 것은 처음이었다.

phpschool.com에 물어본 결과, utf-8 BOM이라는 놈과 관련있다는 사실을 알게 됐다.

이건 UTF-8,16,32에서 이 페이지의 인코딩이 뭘로 돼있는지, 알려주기 위해 문서 맨 앞에 삽입하는 것인데, 이 때문에 session_start()를 하기 전에 html 출력이 있었던 것처럼 처리되는 것이다.(utf-8은 선택, utf-16,32는 필수다.)

만약 php가 이런 부분까지 해결해 준다면 좋겠지만, 아직 지원이 안 된다고 한다.

해결방법은, 에디트 플러스 같은 에디터에서 설정파일을 뒤지는 것이다.

에디트플러스의 경우 : 메뉴 – 문서 – 영구적인 설정 – 파일 – UTF-8 식별기호 – 항상 식별기호 제거

이렇게 선택한 다음, 한 번 저장을 해 주면 된다.

원래 UTF-8 BOM은 인코딩 인식을 편리하게 하도록 해 주기 위한 장치다. 편리를 위한 것이다.

php가 아직 불완전하기 때문에 문제가 되는 것 같다. 빨리 해결됐으면 좋겠다.