본문 바로가기

개발이야기/ JSON, Ajax, PHP, ASP, JSP

[PHP] pdo 간단 사용하기 (연결, 쿼리)

무료 호스팅 서비스 hostinger를 사용하면서 예상치 않았던 난관이 있었어요


바로 서버에 php 5 가 설치되있었던건데요


이전 버전만 사용해 왔던 저는 php 5버전에서 사용되는 PDO를 이번에 익히게 되었습니다.


PDO(PHP Data Objects)란 여러가지 데이터베이스를 제어하는 방법을 표준화시킨 것으로 PDO를 사용하면 다양한 데이터베이스를 동일한 방법으로 제어할 수 있다고 합니다.



그래서 간단한 쿼리 사용 방법을 소개해보아요



1. 연결


먼저 database를 연결해야죠

기존에 해왔던 방식이에요


$db_host = "127.0.0.1";

$db_user = "유저아이디";

$db_password = "비밀번호";

$db_dbname    = "DB이름";


$db_conn    = mysql_connect($db_host, $db_user, $db_password);

mysql_select_db($db_dbname, $db_conn);


이거를 PDO 방식으로 바꿔보면


$pdo = new PDO('mysql:host='.$db_host.';dbname='.$db_dbname.';charset=utf8', $db_user, $db_password);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);




2. select


기존의 쿼리 방식은

$email ="useremail@gmail.com";

$q = "select EMAIL from users where EMAIL= "$email";

$sql_result=mysql_query($q, $db_conn);  // 쿼리를 날려서 결과를 저장하고

$count=mysql_num_rows($sql_result);     // 쿼리 결과 카운트를 하고

이런 방식이었죠


php version 5 이상에서는 변수명을 바인딩 시켜줘야해요.

$email ="useremail@gmail.com";

$dbq = $pdo->prepare("select EMAIL from users where EMAIL= :email");

$dbq->bindParam(':email', $email, PDO::PARAM_STR);   // 만약 변수가 숫자라면 PARAM_STR 대신 PARAM_INT

$dbq->execute();                                       // 쿼리 실행

$count = $dbq->rowCount();                          // 쿼리 카운트

$sql_result= $dbq->fetch(PDO::FETCH_ASSOC);   // 쿼리 결과 저장


만약 쿼리 결과가 많을 것으로 예상되면

마지막 줄에 

$sql_result= $dbq->fetchAll(PDO::FETCH_ASSOC);   // 쿼리 결과 한꺼번에 저장


이제 결과를 가져다 써야죠
$i=0;
foreach ($sql_result as $row){
  $userEmail[$i]=$row['EMAIL'];    // 쿼리 결과 중 EMAIL을 $userEmail[$i]로 저장
  $i++;
}


3. 예외처리

insert 나 update 는 결과 저장이나 카운트 없이 excute();  까지만 하면 되요


만약 기존의 코드를 그대로 사용하고 싶으시다면 예외처리가 있습니다.

바로 @

// 예외처리

$db_conn = @mysql_connect($db_host, $db_user, $db_password);

@mysql_select_db($db_dbname, $db_conn);

$sql = "Insert into users (NAME,EMAIL,PASSWORD,SALT,created_at) values('$name','$email','$password','$salt' ,NOW())";

$dbq = @mysql_query($sql, $db_conn);


4. like

한가지 더 제가 해맸던 부분이 있습니다.

바로 like 함수 인데요


기존의 like 검색을 할 때 단어 앞이나 뒤에 %를 붙여줬어요

PDO를 사용할 경우 변수 대입 부분에서는 ? 를 사용하고 변수를 바인딩 시켜줍니다.


$searchKey = "user"

// $q="select * from users where users.id LIKE '%$searchKey%' ;";   // 기존 코드

$q="select * from users where users.id LIKE ? ;";

$dbq = $pdo->prepare($q);

$dbq->execute(array("%$searchKey%"));                              // 쿼리 실행

$count = $dbq->rowCount();                                            // 쿼리 카운트

$sql_result= $dbq->fetchAll(PDO::FETCH_ASSOC);                   // 쿼리 결과 저장



그럼 20000.