setConnectDB(); //DB연결 } private function setConnectDB() { //DB연결 include __DIR__."/../../dbinfo.php"; $this->rwdb = mysqli_connect(MYSQL_RW_HOST, MYSQL_USER_ID, MYSQL_USER_PW, MYSQL_DB_NAME); $this->rwdb->query("set session character_set_client=utf8mb4;"); $this->rwdb->query("set session character_set_connection=utf8mb4;"); $this->db = $this->rwdb; if(defined('MYSQL_RO_HOST')) { //ReadOnly Host가 있을 경우 연결 $this->rodb = mysqli_connect(MYSQL_RO_HOST, MYSQL_USER_ID, MYSQL_USER_PW, MYSQL_DB_NAME); $this->rodb->query("set session character_set_client=utf8mb4;"); $this->rodb->query("set session character_set_connection=utf8mb4;"); } } private function query($sql, $error=false) { //쿼리 전송 if(!$sql) return false; $result = null; $data = new stdClass(); if($this->rodb && preg_match('#^select.*#i', trim($sql))) //Select 는 ReadOnly DB로 연결 $this->db = $this->rodb; else $this->db = $this->rwdb; $this->db->query("BEGIN"); //트랜젝션 시작 if($error) {//error 가 true 일 경우 에러메시지 출력 $result = $this->db->query($sql) or die($this->db->error); } else { $result = $this->db->query($sql); } if($result) { $data->db = $result; $data->insert_id = $this->db->insert_id; $this->db->query("COMMIT"); //트랜젝션 커밋 } else $this->db->query("ROLLBACK"); //트랜젝션 롤백 return $data; } //암호화 함수 private function aes_encrypt($data, $key='++!CHAINSAW!++'){ $key = substr(hex2bin(openssl_digest($key, 'sha512')),0,16); $enc = openssl_encrypt($data, "AES-128-ECB", $key, true); return strtoupper(bin2hex($enc)); } //복호화 함수 private function aes_decrypt($data, $key='++!CHAINSAW!++'){ $data = hex2bin($data); $key = substr(hex2bin(openssl_digest($key, 'sha512')),0,16); $dec = openssl_decrypt($data, "AES-128-ECB", $key, true); return $dec; } /////////////////////////////////////////////////////////////////////////// private function getLandingBySeq($seq) { //랜딩 정보 가져오기 $sql = "SELECT info.*, adv.name, adv.interlock_url, adv.agreement_url, adv.agent, med.media, med.target, med.seq AS med_seq, adv.is_stop AS adv_stop, GROUP_CONCAT(ek.keyword) AS keywords, ec.id AS pixel_id, ec.name AS pixel_name, ec.token AS access_token FROM zenith.event_information AS info LEFT JOIN zenith.event_advertiser AS adv ON info.advertiser = adv.seq LEFT JOIN zenith.event_media AS med ON info.media = med.seq LEFT JOIN zenith.event_keyword_idx AS ki ON info.seq = ki.ei_seq LEFT JOIN zenith.event_keyword AS ek ON ki.ek_seq = ek.seq LEFT JOIN zenith.event_conversion AS ec ON info.pixel_id = ec.id WHERE info.seq = {$seq}"; $result = $this->query($sql); if(!$result->db->num_rows) { throw new Exception("존재하지 않는 랜딩입니다."); //랜딩번호가 존재하지 않을경우 Exception 처리 } $this->landing = $result->db->fetch_assoc(); return $this->landing; } private function getAppsubscribeByEid($eid) { //등록 사용자 정보 가져오기 if(!$eid) return NULL; $sql = "SELECT * FROM app_subscribe WHERE eid = {$eid}"; $result = $this->query($sql); return $result; } public function send($eid) { $result = $this->getAppsubscribeByEid($eid); if($result->db) { $data = $result->db->fetch_assoc(); $data['phone'] = $this->aes_decrypt($data['phone']); $data['reg_date'] = ''; } else { echo "eid:{$eid} eid 없음
"; } $this->no = $data['event_seq']; $this->remote_addr = $data['ip']; $this->app_name = 'evt_'.$data['event_seq']; if($data['event_seq']) { $this->getLandingBySeq($data['event_seq']); if($this->landing['interlock']) { //외부연동이 true 일 경우 $eid = $data['eid']; $status = $data['status']; $interlock_file = "./data/{$this->landing['name']}/interlock.php"; if(file_exists($interlock_file)) {//외부연동 파일이 있으면 진행 include $interlock_file; if($interlock_data) echo "url:{$url}#data:{$interlock_data} 전송완료
"; else echo "eid:{$eid}#advertiser:{$this->landing['name']}#url:{$url}전송실패
"; } else echo "eid:{$eid}#advertiser:{$this->landing['name']} 외부연동파일 없음
"; } else { echo "eid:{$data['eid']}#advertiser:{$this->landing['name']} 외부연동 광고주 아님
"; } } else { echo "eid:{$data['eid']}#event_seq:{$data['event_seq']} 랜딩 정보 없음
"; } } }