728x90

<?php
// 절차지향 방식
$sql = "SELECT * FROM table WHERE field1 = $field1 AND field2 = '$field2' ORDER BY id";
$stmt = mysqli_query($db,$sql);

// PDO (정석대로)
$sql = "SELECT * FROM table WHERE field1 = ? AND field2 = ? ORDER BY id";
$stmt = $db->prepare($sql);
$stmt->bindParam(1, $field1, PDO::PARAM_INT);
$stmt->bindParam(2, $field2, PDO::PARAM_STR);
$stmt->execute();

// PDO (그나마 좀 간소화시킨 문법)
$sql = "SELECT * FROM table WHERE field1 = ? AND field2 = ? ORDER BY id";
$stmt = $db->prepare($sql);
$stmt->execute(array($field1, $field2));
?>

 

PDO(PHP Data Object) 방식 함수를 사용하여 만든 MemberClass 예제다.

<?php
class MemberClass {
    // 회원 정보 신규 입력
    public function storeUser($userID$userNM$email$password$telNO$mobileNO) {
        global $db;
 
        $hash = $this->hashSSHA($password);
        $encrypted_password = $hash['encrypted']; // encrypted password
        $salt = $hash['salt']; // salt
 
        try{
            $db->beginTransaction();
            $sql = "INSERT INTO members(userID, userNM, email, passwd, salt, telNO,mobileNO,created_at) VALUES(:userID,:userNM,:email,:passwd,:salt,:telNO,:mobileNO,:created_at)";
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':userID',$userID,PDO::PARAM_STR);
            $stmt->bindValue(':userNM',$userNM,PDO::PARAM_STR);
            $stmt->bindValue(':email',$email,PDO::PARAM_STR);
            $stmt->bindValue(':passwd',$encrypted_password,PDO::PARAM_STR);
            $stmt->bindValue(':salt',$salt,PDO::PARAM_STR);
            $stmt->bindValue(':telNO',$telNO,PDO::PARAM_STR);
            $stmt->bindValue(':mobileNO',$mobileNO,PDO::PARAM_STR);
            $stmt->bindValue(':created_at',date("YmdHis"));
            $result = $stmt->execute();
            $db->commit();
        } catch (PDOException $pex) {
            $db->rollBack();
            echo "에러 : ".$pex->getMessage();
        }
        // check for successful store
        if ($result) {
            $stmt = $db->prepare("SELECT * FROM members WHERE userID = :userID");
            $stmt->bindValue(':userID'$userID, PDO::PARAM_STR);
            $stmt->execute();
            $user = $stmt->fetch(PDO::FETCH_ASSOC);
 
            return $user;
        } else {
            return false;
        }
    }
 
    // 로그인 체크
    public function getUser($userID$password) {
        global $db;
        $sql = "SELECT * FROM members WHERE userID=:userID";
        $stmt = $db->prepare($sql);
        $stmt->bindValue(':userID'$userID);
        $stmt->execute();
 
        if ($user=$stmt->fetch()) {
            // verifying user password
            $salt = $user['salt'];
            $encrypted_password = $user['passwd'];
            $hash = $this->checkhashSSHA($salt$password);
            if ($encrypted_password == $hash) {
                // user authentication details are correct
                return $user;
            }
        } else {
            return NULL;
        }
    }
 
    // 안드로이드/아이폰 로그인 체크
    public function LoginUserChk($userID,$password,$deviceID){
        global $db;
        if(empty($userID|| empty($password)){
            return 0;
        } else {
            $user = $this->getUser($userID$password);
            if($user['idx']>0){
                // 장치 일련번호 체크
                if($user['phoneSE'== NULL){
                    // 신규 장치번호 입력(최초 로그인)
                    $this->LoginUserEquipInput($userID,$deviceID);
                    return $user['idx'];
                } else {
                    if($user['phoneSE'=== $deviceID){
                        return 1// 일련번호 일치
                    } else {
                        return -1//일련번호 불일치
                    }
                }
            } else {
                return 0//계정오류
            }
        }
 
    }
 
    // 장치번호 업데이트
    public function LoginUserEquipInput($userID,$deviceID){
        global $db;
        if(strlen($deviceID)>0 && is_numeric($deviceID)){ // 안드로이드폰
            $ostype = 2;
        } else if(strlen($deviceID)>30){ // 아이폰
            $ostype = 1;
        } else { // 기타
            $ostype = 0;
        }
 
        try{
            $db->beginTransaction();
            $sql='update members set phoneSE=:phoneSE, OStype=:OStype where userID=:userID';
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':phoneSE',$deviceID,PDO::PARAM_STR);
            $stmt->bindValue(':OStype',$ostype,PDO::PARAM_INT);
            $stmt->bindValue(':userID',$userID,PDO::PARAM_STR);
            $status = $stmt->execute();
            $db->commit();
            if($status == true){
                return 1;
            } else {
                return 0;
            }
        }catch (PDOException $pex) {
            $db->rollBack();
            echo "에러 : ".$pex->getMessage();
        }
    }//end
 
    // 장치번호 초기화
    public function EquipReset($userID){
        global $db;
        try{
            $db->beginTransaction();
            $ostype = 0;
            $sql='update members set phoneSE=NULL,OStype=:OStype where userID=:userID';
            $stmt = $db->prepare($sql);
            $stmt->bindValue(':OStype',$ostype,PDO::PARAM_INT);
            $stmt->bindValue(':userID',$userID,PDO::PARAM_STR);
            $status = $stmt->execute();
            $db->commit();
            if($status == true){
                return 1;
            } else {
                return 0;
            }
        } catch (PDOException $pex) {
            $db->rollBack();
            echo "에러 : ".$pex->getMessage();
        }
    }//end
 
    // 회원 가입 여부 체크
    public function isUserExisted($userID) {
        global $db;
        $stmt = $db->prepare("SELECT userID from members WHERE userID=:userID");
        $stmt->bindValue(':userID',$userID,PDO::PARAM_STR);
        $stmt->execute();
        if ($stmt->rowCount() > 0) {
            return true;
        } else {
            return false;
        }
    }
 
    // 회원 정보 삭제
    public function deleteUser($userID){
        global $db;
        try{
            $db->beginTransaction();
            $stmt = $db->prepare("delete FROM members WHERE userID=:userID");
            $stmt->bindValue(':userID',$userID,PDO::PARAM_STR);
            $stmt->execute();
            $db->commit();
        }catch (PDOException $pex) {
            $db->rollBack();
            echo "에러 : ".$pex->getMessage();
        }
    }
 
    public function hashSSHA($password) {
        $salt = sha1(rand());
        $salt = substr($salt010);
        $encrypted = base64_encode(sha1($password . $salttrue) . $salt);
        $hash = array("salt" => $salt"encrypted" => $encrypted);
        return $hash;
    }
 
    public function checkhashSSHA($salt$password) {
        $hash = base64_encode(sha1($password . $salttrue) . $salt);
        return $hash;
    }
}
?>

 

 

안드로이드와 연동하는 login.php, register.php 파일 예제는 첨부파일을 참조하면 된다.

pdo.zip
다운로드

 

조만간에 부트스트랩 registerForm.php 와 loginForm.php 파일을 간단하게 만들고, 관련 처리 기능을 만들 예정이다.

 

 

PHP 7.0 에서 mysql 기존방식은 지원을 아예 안하고 mysqli  및 pdo를 지원하므로 PDO 방식으로 코딩하는 방법을 계속 연습해두고 기능을 하나 하나 익혀두는게 나을거 같아서 정리를 해보는 중이다.

 

수정사항(2017.11.30)

회원정보 삭제 테스트를 하다보니 원하는 결과가 나오지 않아서 로직을 수정 보완했다.

// 회원 가입 여부 체크
public function isUserExisted($userID) {
    $stmt = $this -> db -> prepare("SELECT count(userID) from members WHERE userID=:userID");
    $stmt -> bindValue(':userID', $userID, PDO::PARAM_STR);
    $stmt -> execute();
    if ($row = $stmt -> fetch()) {
        return $row[0];
        // 미가입이면 0 반환, 가입이면 1 반환
    } else {
        return -1;
    }
}

// 회원 정보 삭제 : Move
public function deleteUser($userID) {
    if ($this -> isUserExisted($userID) > 0) {
        try {
            $this -> db -> beginTransaction();
            $stmt = $this -> db -> prepare("delete FROM members WHERE userID=:userID");
            $stmt -> bindValue(':userID', $userID, PDO::PARAM_STR);
            $stmt -> execute(); // 삭제할 데이터의 존재 유무에 상관없이 실행한다.
            $this -> db -> commit();
        } catch (PDOException $pex) {
            $this -> db -> rollBack();
            echo "에러 : " . $pex -> getMessage();
        }
        return 1; // 삭제 성공
    } else {
        return 0; // 삭제할 데이터가 없음
    }
}

 

블로그 이미지

Link2Me

,