/** * 获取或创建IP信息 * <p>返回数组array('id','addr','ban')</p> * @since 1 * @return array */ public function get_ip() { $ip_addr = $this->get_addr(); $re = array('id' => 0, 'ban' => '1', 'addr' => ''); if ($ip_addr != '') { $sql = 'SELECT `id`,`ip_addr`,`ip_ban` FROM `' . $this->table_name . '` WHERE `ip_addr` = ?'; $sth = $this->db->prepare($sql); $sth->bindParam(1, $ip_addr, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT); if ($sth->execute() == true) { $res = $sth->fetch(PDO::FETCH_ASSOC); if ($res['id'] > 0) { $re = array('id' => $res['id'], 'addr' => $res['ip_addr'], 'ban' => $res['ip_ban']); } else { $sql_insert = 'INSERT INTO `' . $this->table_name . '`(`id`,`ip_addr`,`ip_ban`) VALUES(NULL,?,0)'; $sth_insert = $this->db->prepare($sql_insert); $sth_insert->bindParam(1, $ip_addr, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT); if ($sth_insert->execute() == true) { $last_id = $this->db->lastInsertId(); $re = array('id' => $last_id, 'addr' => $ip_addr, 'ban' => '0'); } } } } return $re; }
/** * 将指定配置恢复到默认 * @since 1 * @param string $config_name 配置名称 * @return boolean */ public function return_default($config_name) { $sql = 'UPDATE `' . $this->table_name . '` SET `config_value` = `config_default` WHERE `config_name` = ?'; $st = $this->db->prepare($sql); $st->bindParam(1, $config_name, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT); return $st->execute(); }
/** * 将当天之前的数据归档到logs文件夹 * @since 2 * @param string $log_dir 日志保存目录路径 * @return boolean */ public function files($log_dir) { $re = false; $sql = 'SELECT `id`,`log_date`,`log_ip`,`log_message` FROM `' . $this->table_name . '` ORDER BY `log_date` ASC LIMIT ?,30'; $sth = $this->db->prepare($sql); $limit_page = 0; //遍历数据表,将记录按照时间顺序保存到文件 do { $sth->bindParam(1, $limit_page, PDO::PARAM_INT); $sth->execute(); $res = $sth->fetchAll(PDO::FETCH_ASSOC); if (is_array($res) && count($res) > 0) { foreach ($res as $k => $v) { $date_ym = substr($v['log_date'], 0, 4) . substr($v['log_date'], 5, 2); $date_d = substr($v['log_date'], 8, 2); $log_file_dir = $log_dir . DS . $date_ym; if (core_file::new_dir($log_file_dir) == false) { return $re; } $log_file = $log_file_dir . DS . $date_d . '.log'; $log_message = $v['log_date'] . "\t" . $v['log_ip'] . "\t" . $v['log_message'] . "\r\n"; if (core_file::edit_file($log_file, $log_message, true) == false) { return $re; } } } $limit_page++; } while (is_array($res) && count($res) > 0); //清空日志数据表 $sql_trash = 'TRUNCATE TABLE `' . $this->table_name . '`'; if ($this->db->exec($sql_trash) == true) { $re = true; } return $re; }
/** * 退出登陆更新用户 * @since 6 * @param int $id 用户ID * @param int $ip IP ID * @param boolean $status 用户登陆状态 * @param boolean $remember 是否记住用户 * @return boolean */ private function update_user($id, $ip = false, $status = false, $remember = false) { $return = false; $sql = 'UPDATE `' . $this->table_name_user . '` SET `user_login_date` = NOW(),`user_ip` = :ip,`user_session` = :session,`user_status` = :status,`user_remember` = :remember WHERE `id` = :id'; //如果提供了IP参数,则更新登陆相关项 $status = $status ? 1 : 0; $remember = $remember ? 1 : 0; $session = $this->get_session_id(); $sth = $this->db->prepare($sql); $sth->bindParam(':id', $id); $sth->bindParam(':ip', $ip, PDO::PARAM_INT); $sth->bindParam(':session', $session, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT); $sth->bindParam(':status', $status, PDO::PARAM_INT); $sth->bindParam(':remember', $remember, PDO::PARAM_INT); $return = $sth->execute(); return $return; }
/** * 删除上一级ID的所有子ID * @since 3 * @param int $id ID * @return boolean */ public function del_parent($id) { $return = false; $sql = 'SELECT `id` FROM `' . $this->table_name . '` WHERE `post_parent` = :id'; $sth = $this->db->prepare($sql); $sth->bindParam(':id', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT); if ($sth->execute() == true) { $res = $sth->fetchAll(PDO::FETCH_ASSOC); if ($res) { foreach ($res as $v) { $this->del_parent($v['id']); } } $sql_delete = 'DELETE FROM `' . $this->table_name . '` WHERE `id` = :id'; $sth_delete = $this->db->prepare($sql_delete); $sth_delete->bindParam(':id', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT); $return = $sth_delete->execute(); } return $return; }
/** * 生成新的备份文件 * @since 2 * @param coredb $db 数据库操作句柄 * @param string $backup_dir 备份到目录 * @param string $content_dir 文件数据目录 * @return string 备份文件路径 */ function plugbackup(&$db, $backup_dir, $content_dir) { $return = ''; $bool = false; $file_type = 'zip'; $ls_dir = $backup_dir . DS . substr(sha1(rand(1, 99999)), 0, 8); if (!corefile::is_dir($ls_dir)) { $ls_sql_dir = $ls_dir . DS . 'sql'; //创建临时目录 $bool = corefile::new_dir($ls_dir); //创建临时SQL目录 if ($bool == true) { $bool = corefile::new_dir($ls_sql_dir); } //拷贝文件数据 if ($bool == true) { $bool = corefile::copy_dir($content_dir . DS . 'files', $ls_dir . DS . 'content' . DS . 'files'); } if ($bool == true) { $bool = corefile::copy_dir($content_dir . DS . 'logs', $ls_dir . DS . 'content' . DS . 'logs'); } //依次遍历所有数据并拷贝到文件内 foreach ($db->tables as $k => $v) { //创建表目录 $v_table_dir = $ls_sql_dir . DS . $v; if ($bool == true) { $bool = corefile::new_dir($v_table_dir); } else { break; } //计算表内所有字段数据平均长度,得出最终步长 $max = 50; if ($bool == true) { $sql = 'SELECT AVG( LENGTH(`' . implode('`))+AVG(LENGTH(`', $db->fields[$k]) . '`)) as al FROM `' . $v . '`'; $sth = $db->prepare($sql); if ($sth->execute() == true) { $res = (int) $sth->fetchColumn(); if ($res > 500) { $max = 20; } elseif ($res > 1000) { $max = 10; } elseif ($res > 5000) { $max = 1; } } else { $bool = false; break; } } else { break; } //遍历数据写入文件 $p = 0; $p_bool = true; while ($p_bool) { $sql = 'SELECT * FROM `' . $v . '` ORDER BY ' . $db->fields[$k][0] . ' ASC LIMIT ' . $p * $max . ',' . $max; $sth = $db->prepare($sql); if ($sth->execute() == true) { $res = $sth->fetchAll(PDO::FETCH_ASSOC); if ($res) { $file_content = 'INSERT INTO `' . $v . '`(`' . implode('`,`', array_keys($res[0])) . '`) VALUES'; foreach ($res as $v_res) { $file_content .= '('; foreach ($v_res as $v_res_v) { if ($v_res_v == null) { $file_content .= 'NULL,'; } elseif (is_int($v_res_v) == true) { $file_content .= $v_res_v . ','; } else { $file_content .= '\'' . $v_res_v . '\','; } } $file_content = substr($file_content, 0, -1); $file_content .= '),'; } $file_content = substr($file_content, 0, -1) . ';'; $file_table_row = $v_table_dir . DS . $v . '_' . $p . '.sql'; $p_bool = corefile::edit_file($file_table_row, $file_content); $bool = $p_bool; $file_content = null; } else { $p_bool = false; $bool = true; } } else { $p_bool = false; $bool = false; } $p += 1; } } } //将临时文件压缩为压缩包 $backup_file = $backup_dir . DS . time() . '.' . $file_type; if (corefile::is_file($backup_file)) { $bool = corefile::delete_file($backup_file); } if ($bool == true) { $bool = corefile::create_zip($backup_file, $ls_dir); } if ($bool == true) { $return = $backup_file; } else { //失败删除所有临时文件 corefile::delete_file($backup_file); } //删除临时文件 corefile::delete_dir($ls_dir); return $return; }