728x90
로그인 6개월 차단하는 기능을 구현해 달라는 요청으로 간단 구현한 사항 적어둔다.
<?php
error_reporting(0);
/*
ini_set("display_startup_errors", 1);
ini_set("display_errors", 1);
error_reporting(E_ALL);
// */
require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기
require_once $g['path_root'].'sessionChk.php'; // 세션 체크
require_once $g['path_root'].'ipFiltering.php';
require_once $g['path_class'].'dbconnect.php';
$a = new DBDataClass();
date_default_timezone_set('Asia/Seoul');
$today = date("Y-m-d"); // 오늘 날짜
// getDbUpdate($table, $set, $params, $where);
// $access // 이용권한 없음(0), 로그인 허용(1), 가입승인대기(2)
$rows = $a->getDbresult('members','admin=0','date, idx, regdate');
foreach($rows as $R):
if($R['date'] !== NULL) {
// 최근접속일자
$from_day = substr($R['date'],0,4)."-".substr($R['date'],4,2)."-".substr($R['date'],6,2);
echo $from_day.'<br />';
$from = new DateTime($from_day);
$to = new DateTime($today);
$day_diff = $from->diff($to)->days;
if($day_diff > 180){ // 6개월동안 로그인한 기록이 없으면
$SET ="access=0"; // 접속을 차단시킨다.
$params=array($R['idx']);
$a->getDbUpdate('members',$SET,$params,'idx=?');
echo 'idx : '.$R[1].'<br />';
}
} else {
// 가입일자
$from_day = substr($R['regdate'],0,4)."-".substr($R['regdate'],4,2)."-".substr($R['regdate'],6,2);
echo $from_day.'<br />';
$from = new DateTime($from_day);
$to = new DateTime($today);
$day_diff = $from->diff($to)->days;
if($day_diff > 365){
$SET ="access=2";
$params=array($R['idx']);
$a->getDbUpdate('members',$SET,$params,'idx=?');
echo 'no access : '.$R[1].'<br />';
}
}
endforeach;
?>
|
<?php
class DBDataClass {
protected $db; // 변수를 선언한 클래스와 상속받은 클래스에서 참조할 수 있다.
public function __construct() {
$this->dbConnect();
// construct 메소드는 객체가 생성(인스턴스화)될 때 자동으로 실행되는 특수한 메소드다.
}
private function dbConnect() {
require_once 'dbinfo.php';
try {
// MySQL PDO 객체 생성
$this->db = new PDO(_DSN, _DBUSER, _DBPASS);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
} catch(PDOException $ex) {
die("오류 : " . $ex->getMessage());
}
}
/*
$sql = "INSERT INTO users (name, surname, sex) VALUES (?,?,?)";
$stmt= $pdo->prepare($sql);
$stmt->execute(array($name, $surname, $sex));
*/
public function recur_quot($cnt) {
$R = array();
for ($i = 0; $i < $cnt; $i++) {
array_push($R, "?");
}
return implode(",", $R); // 배열을 문자열로
}
// 신규 자료 추가(ok)
function putDbInsert($table, $key, $params) {
try {
$this->db->beginTransaction();
$sql = "insert into " . $table . " (" . $key . ") values(" . $this->recur_quot(count($params)) . ")";
$stmt = $this->db->prepare($sql);
$status = $stmt->execute($params); // $params 는 배열 값
$this->db->commit();
return 1;
} catch (PDOException $pex) {
$this->db->rollBack();
echo "에러 : " . $pex->getMessage();
return 0;
}
}
function getDbUpdate($table, $set, $params, $where) {
$sql = "update " . $table . " set " . $set . ($where ? ' where ' . $where : '');
try {
$this->db->beginTransaction();
$stmt = $this->db->prepare($sql);
$status = $stmt->execute($params);
$this->db->commit();
return 1;
} catch (PDOException $pex) {
$this->db->rollBack();
echo "에러 : " . $pex->getMessage();
return 0;
}
}
public function putDbArray($sql, $params) {
// $params : array 를 사용해야 한다.
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리
}
// 검색조건에 일치하는 데이터 가져오기
public function getDbData($table, $where, $column, $returntype = '') {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
if ($returntype == 1) {
return $stmt->fetch(PDO::FETCH_ASSOC);
} else {
return $stmt->fetch();
}
}
// DB Query result 함수
function getDbresult($table,$where,$column) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
//echo $sql.'<br />';
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
// table 결과 조회 용도
public function getDbArray($table, $where, $column, $orderby, $rowsPage, $curPage) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '') . ($orderby ? ' order by ' . $orderby : '') . ($rowsPage ? ' limit ' . (($curPage - 1) * $rowsPage) . ', ' . $rowsPage : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리 하면 됨
}
//SQL필터링
public function getSqlFilter($sql) {
//$sql = preg_replace("/[\;]+/","", $sql); // 공백은 제거 불가
return $sql;
}
?>
|
728x90
'Web 프로그램 > PDO' 카테고리의 다른 글
PDO(PHP Data Object) NULL 반환처리 (0) | 2022.01.12 |
---|---|
PDO Update Query(비밀번호 변경 예제) (0) | 2021.03.23 |
PHP PDO 500 에러메시지 해결 (0) | 2020.03.07 |
PHP Legacy 함수를 PDO 방식 함수로 변환하기 (0) | 2019.05.20 |
[안드로이드] 회원가입폼 및 회원가입처리(PHP PDO 연동) (0) | 2017.11.20 |