www.gusucode.com > Ectouch手机端网购商城系统PHP版源码程序 > ectouch/plugins/integrates/integrate.php
<?php /** * ECTouch Open Source Project * ============================================================================ * Copyright (c) 2012-2014 http://ectouch.cn All rights reserved. * ---------------------------------------------------------------------------- * Licensed ( http://www.ectouch.cn/docs/license.txt ) * ---------------------------------------------------------------------------- */ /* 访问控制 */ defined('IN_ECTOUCH') or die('Deny Access'); /** * ECSHOP 整合插件类的基类 */ class integrate { /* 整合对象使用的数据库主机 */ public $db_host = ''; /* 整合对象使用的数据库名 */ public $db_name = ''; /* 整合对象使用的数据库用户名 */ public $db_user = ''; /* 整合对象使用的数据库密码 */ public $db_pass = ''; /* 整合对象数据表前缀 */ public $prefix = ''; /* 数据库所使用编码 */ public $charset = ''; /* 整合对象使用的cookie的domain */ public $cookie_domain = ''; /* 整合对象使用的cookie的path */ public $cookie_path = '/'; /* 整合对象会员表名 */ public $user_table = ''; /* 会员ID的字段名 */ public $field_id = ''; /* 会员名称的字段名 */ public $field_name = ''; /* 会员密码的字段名 */ public $field_pass = ''; /* 会员邮箱的字段名 */ public $field_email = ''; /* 会员手机的字段名 */ public $field_mobile = ''; /* 会员性别 */ public $field_gender = ''; /* 会员生日 */ public $field_bday = ''; /* 注册日期的字段名 */ public $field_reg_date = ''; /* 用户设置的问题 */ public $field_passwd_question = ''; /* 是否需要同步数据到商城 */ public $need_sync = true; public $error = 0; private $db; /** * 会员数据整合插件类的构造函数 * * @access public * @param string $db_host * 数据库主机 * @param string $db_name * 数据库名 * @param string $db_user * 数据库用户名 * @param string $db_pass * 数据库密码 * @return void */ function __construct($cfg) { $this->charset = isset($cfg['db_charset']) ? $cfg['db_charset'] : 'UTF8'; $this->prefix = isset($cfg['prefix']) ? $cfg['prefix'] : ''; $this->db_name = isset($cfg['db_name']) ? $cfg['db_name'] : ''; $this->cookie_domain = isset($cfg['cookie_domain']) ? $cfg['cookie_domain'] : ''; $this->cookie_path = isset($cfg['cookie_path']) ? $cfg['cookie_path'] : '/'; $this->need_sync = true; $quiet = empty($cfg['quiet']) ? 0 : 1; /* 初始化数据库 */ $db_config = C('DB'); if (empty($cfg['db_host'])) { $this->db_name = $db_config['DB_NAME']; $this->prefix = $db_config['DB_PREFIX']; if (class_exists('ECTouch')) { // $this->db = & ECTouch::db(); $this->db = M(); } else { $this->db = $GLOBALS['db']; } } else { if (empty($cfg['is_latin1'])) { $this->db = new cls_mysql($cfg['db_host'], $cfg['db_user'], $cfg['db_pass'], $cfg['db_name'], $this->charset, NULL, $quiet); } else { $this->db = new cls_mysql($cfg['db_host'], $cfg['db_user'], $cfg['db_pass'], $cfg['db_name'], 'latin1', NULL, $quiet); } } } /** * 用户登录函数 * * @access public * @param string $username * @param string $password * * @return void */ function login($username, $password, $remember = null) { if ($this->check_user($username, $password) > 0) { if ($this->need_sync) { $this->sync($username, $password); } $this->set_session($username); $this->set_cookie($username, $remember); return true; } else { return false; } } /** * * @access public * @param * * * * * @return void */ function logout() { $this->set_cookie(); // 清除cookie $this->set_session(); // 清除session } /** * 添加一个新用户 * * @access public * @param * * * * * @return int */ function add_user($username, $password, $email, $gender = -1, $bday = 0, $reg_date = 0, $md5password = '') { /* 将用户添加到整合方 */ if ($this->check_user($username) > 0) { $this->error = ERR_USERNAME_EXISTS; return false; } /* 检查email是否重复 */ $sql = "SELECT " . $this->field_id . " FROM " . $this->table($this->user_table) . " WHERE " . $this->field_email . " = '$email'"; if ($this->db->table($this->user_table) ->field($this->field_id) ->where($this->field_email . " = '$email'") ->getOne() > 0) { $this->error = ERR_EMAIL_EXISTS; return false; } $post_username = $username; if ($md5password) { $post_password = $this->compile_password(array( 'md5password' => $md5password )); } else { $post_password = $this->compile_password(array( 'password' => $password )); } $fields = array( $this->field_name, $this->field_email, $this->field_pass ); $values = array( $post_username, $email, $post_password ); if ($gender > - 1) { $fields[] = $this->field_gender; $values[] = $gender; } if ($bday) { $fields[] = $this->field_bday; $values[] = $bday; } if ($reg_date) { $fields[] = $this->field_reg_date; $values[] = $reg_date; } $sql = "INSERT INTO " . $this->table($this->user_table) . " (" . implode(',', $fields) . ")" . " VALUES ('" . implode("', '", $values) . "')"; $this->db->query($sql); if ($this->need_sync) { $this->sync($username, $password); } return true; } /** * 编辑用户信息($password, $email, $gender, $bday) * * @access public * @param * * * * * @return void */ function edit_user($cfg) { if (empty($cfg['username'])) { return false; } else { $cfg['post_username'] = $cfg['username']; } $values = array(); if (! empty($cfg['password']) && empty($cfg['md5password'])) { $cfg['md5password'] = md5($cfg['password']); } if ((! empty($cfg['md5password'])) && $this->field_pass != 'NULL') { $values[] = $this->field_pass . "='" . $this->compile_password(array( 'md5password' => $cfg['md5password'] )) . "'"; } if ((! empty($cfg['email'])) && $this->field_email != 'NULL') { /* 检查email是否重复 */ if ($this->db->table($this->user_table) ->field($this->field_id) ->where($this->field_email . " = '$cfg[email]' " . " AND " . $this->field_name . " != '$cfg[post_username]'") ->getOne() > 0) { $this->error = ERR_EMAIL_EXISTS; return false; } // 检查是否为新E-mail if ($this->db->table($this->user_table) ->field('count(*)') ->where($this->field_email . " = '$cfg[email]' ") ->getOne() == 0) { // 新的E-mail $sql = "UPDATE " . $this->db->pre . 'users ' . " SET is_validated = 0 WHERE user_name = '$cfg[post_username]'"; $this->db->query($sql); } $values[] = $this->field_email . "='" . $cfg['email'] . "'"; } if (isset($cfg['gender']) && $this->field_gender != 'NULL') { $values[] = $this->field_gender . "='" . $cfg['gender'] . "'"; } if ((! empty($cfg['bday'])) && $this->field_bday != 'NULL') { $values[] = $this->field_bday . "='" . $cfg['bday'] . "'"; } if ($values) { $sql = "UPDATE " . $this->db->pre . $this->user_table . " SET " . implode(', ', $values) . " WHERE " . $this->field_name . "='" . $cfg['post_username'] . "' LIMIT 1"; $this->db->query($sql); if ($this->need_sync) { if (empty($cfg['md5password'])) { $this->sync($cfg['username']); } else { $this->sync($cfg['username'], '', $cfg['md5password']); } } } return true; } /** * 删除用户 * * @access public * @param * * * * * @return void */ function remove_user($id) { $post_id = $id; if ($this->need_sync || (isset($this->is_ecshop) && $this->is_ecshop)) { /* 如果需要同步或是ecshop插件执行这部分代码 */ $where = (is_array($post_id)) ? db_create_in($post_id, 'user_name') : "user_name='" . $post_id . "'"; $col = M()->table('users') ->field('user_id') ->where($where) ->limit('1') ->getCol(); if ($col) { $sql = "UPDATE " . $this->db->pre . 'users ' . " SET parent_id = 0 WHERE " . db_create_in($col, 'parent_id'); // 将删除用户的下级的parent_id 改为0 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'users ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户 $this->db->query($sql); /* 删除用户订单 */ $sql = "SELECT order_id FROM " . $this->db->pre . 'order_info ' . " WHERE " . db_create_in($col, 'user_id'); $this->db->query($sql); $col_order_id = $this->db->table('order_info') ->field('order_id') ->where(db_create_in($col, 'user_id')) ->getCol(); if ($col_order_id) { $sql = "DELETE FROM " . $this->db->pre . 'order_info ' . " WHERE " . db_create_in($col_order_id, 'order_id'); $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'order_goods ' . " WHERE " . db_create_in($col_order_id, 'order_id'); $this->db->query($sql); } $sql = "DELETE FROM " . $this->db->pre . 'booking_goods ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'collect_goods ' . " WHERE " . db_create_in($col, 'user_id'); // 删除会员收藏商品 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'feedback ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户留言 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'user_address ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户地址 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'user_bonus ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户红包 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'user_account ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户帐号金额 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'tag ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户标记 $this->db->query($sql); $sql = "DELETE FROM " . $this->db->pre . 'account_log ' . " WHERE " . db_create_in($col, 'user_id'); // 删除用户日志 $this->db->query($sql); } } if (isset($this->ecshop) && $this->ecshop) { /* 如果是ecshop插件直接退出 */ return; } $sql = "DELETE FROM " . $this->table($this->user_table) . " WHERE "; if (is_array($post_id)) { $sql .= db_create_in($post_id, $this->field_name); } else { $sql .= $this->field_name . "='" . $post_id . "' LIMIT 1"; } $this->db->query($sql); } /** * 用户绑定时同步用户数据 * * @param unknown $old_uid * @param unknown $new_uid */ function sync_user($old_uid, $new_uid) { if (! empty($old_uid) && ! empty($new_uid)) { $sql = "UPDATE " . $this->db->pre . 'users ' . " SET parent_id = " . $new_uid . " WHERE parent_id = " . $old_uid; // 将用户的下级的parent_id 改为新绑定的用户 $this->db->query($sql); /* 更改用户订单 */ $sql = "UPDATE " . $this->db->pre . 'order_info ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'booking_goods ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改用户 $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'collect_goods ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改会员收藏商品 $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'feedback ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改用户留言 $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'user_address ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改用户地址 $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'tag ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改用户标记 $this->db->query($sql); $sql = "UPDATE " . $this->db->pre . 'account_log ' . " SET user_id = " . $new_uid . " WHERE user_id = " . $old_uid; // 更改用户日志 $this->db->query($sql); } } /** * 获取指定用户的信息 * * @access public * @param * * * * * @return void */ function get_profile_by_name($username) { $post_username = $username; $sql = "SELECT " . $this->field_id . " AS user_id," . $this->field_name . " AS user_name," . $this->field_email . " AS email," . $this->field_mobile . " AS mobile," . $this->field_gender . " AS sex," . $this->field_bday . " AS birthday," . $this->field_reg_date . " AS reg_time, " . $this->field_passwd_question . " AS passwd_question," . $this->field_pass . " AS password " . " FROM " . $this->db->pre . $this->user_table . " WHERE " . $this->field_name . "='$post_username'"; $row = $this->db->getRow($sql); return $row; } /** * 获取指定用户的信息 * * @access public * @param * * * * * @return void */ function get_profile_by_id($id) { $sql = "SELECT " . $this->field_id . " AS user_id," . $this->field_name . " AS user_name," . $this->field_email . " AS email," . $this->field_mobile . " AS mobile," . $this->field_gender . " AS sex," . $this->field_bday . " AS birthday," . $this->field_reg_date . " AS reg_time, " . $this->field_passwd_question . " AS passwd_question," . $this->field_pass . " AS password " . " FROM " . $this->table($this->user_table) . " WHERE " . $this->field_id . "='$id'"; $row = $this->db->getRow($sql); return $row; } /** * 根据登录状态设置cookie * * @access public * @param * * * * * @return void */ function get_cookie() { $id = $this->check_cookie(); if ($id) { if ($this->need_sync) { $this->sync($id); } $this->set_session($id); return true; } else { return false; } } /** * 检查指定用户是否存在及密码是否正确 * * @access public * @param string $username * 用户名 * * @return int */ function check_user($username, $password = null) { $post_username = $username; /* 如果没有定义密码则只检查用户名 */ if ($password === null) { return $this->db->table($this->user_table) ->field($this->field_id) ->where($this->field_name . "='" . $post_username . "'") ->getOne(); } else { return $this->db->table($this->user_table) ->field($this->field_id) ->where($this->field_name . "='" . $post_username . "' AND " . $this->field_pass . " ='" . $this->compile_password(array( 'password' => $password )) . "'") ->getOne(); } } /** * 检查指定邮箱是否存在 * * @access public * @param string $email * 用户邮箱 * * @return boolean */ function check_email($email) { if (! empty($email)) { /* 检查email是否重复 */ if ($this->db->table($this->user_table) ->field($this->field_id) ->where($this->field_email . " = '$email' ") ->getOne() > 0) { $this->error = ERR_EMAIL_EXISTS; return true; } return false; } } /** * 检查cookie是正确,返回用户名 * * @access public * @param * * * * * @return void */ function check_cookie() { return ''; } /** * 设置cookie * * @access public * @param * * @return void */ function set_cookie($username = '', $remember = null) { if (empty($username)) { /* 摧毁cookie */ $time = time() - 3600; setcookie("ECS[user_id]", '', $time, $this->cookie_path); setcookie("ECS[password]", '', $time, $this->cookie_path); } elseif ($remember) { /* 设置cookie */ $time = time() + 3600 * 24 * 15; setcookie("ECS[username]", $username, $time, $this->cookie_path, $this->cookie_domain); $sql = "SELECT user_id, password FROM " . $this->db->pre . 'users ' . " WHERE user_name='$username' LIMIT 1"; $row = $this->db->getRow($sql); if ($row) { setcookie("ECS[user_id]", $row['user_id'], $time, $this->cookie_path, $this->cookie_domain); setcookie("ECS[password]", $row['password'], $time, $this->cookie_path, $this->cookie_domain); } } } /** * 设置指定用户SESSION * * @access public * @param * * @return void */ function set_session($username = '') { if (empty($username)) { ECTouch::sess()->destroy_session(); } else { $sql = "SELECT user_id, password, email FROM " . $this->db->pre . 'users ' . " WHERE user_name='$username' LIMIT 1"; $row = $this->db->getRow($sql); if ($row) { $_SESSION['user_id'] = $row['user_id']; $_SESSION['user_name'] = $username; $_SESSION['email'] = $row['email']; } } } /** * 在给定的表名前加上数据库名以及前缀 * * @access private * @param string $str * 表名 * * @return void */ function table($str) { return '`' . $this->db_name . '`.`' . $this->prefix . $str . '`'; } /** * 编译密码函数 * * @access public * @param array $cfg * 包含参数为 $password, $md5password, $salt, $type * * @return void */ function compile_password($cfg) { if (isset($cfg['password'])) { $cfg['md5password'] = md5($cfg['password']); } if (empty($cfg['type'])) { $cfg['type'] = PWD_MD5; } switch ($cfg['type']) { case PWD_MD5: if (! empty($cfg['ec_salt'])) { return md5($cfg['md5password'] . $cfg['ec_salt']); } else { return $cfg['md5password']; } case PWD_PRE_SALT: if (empty($cfg['salt'])) { $cfg['salt'] = ''; } return md5($cfg['salt'] . $cfg['md5password']); case PWD_SUF_SALT: if (empty($cfg['salt'])) { $cfg['salt'] = ''; } return md5($cfg['md5password'] . $cfg['salt']); default: return ''; } } /** * 会员同步 * * @access public * @param * * * * * @return void */ function sync($username, $password = '', $md5password = '') { if ((! empty($password)) && empty($md5password)) { $md5password = md5($password); } $main_profile = $this->get_profile_by_name($username); if (empty($main_profile)) { return false; } $sql = "SELECT user_name, email, password, sex, birthday" . " FROM " . $this->db->pre . 'users ' . " WHERE user_name = '$username'"; $profile = $this->db->getRow($sql); if (empty($profile)) { /* 向商城表插入一条新记录 */ if (empty($md5password)) { $sql = "INSERT INTO " . $this->db->pre . 'users ' . "(user_name, email, sex, birthday, reg_time)" . " VALUES('$username', '" . $main_profile['email'] . "','" . $main_profile['sex'] . "','" . $main_profile['birthday'] . "','" . $main_profile['reg_time'] . "')"; } else { $sql = "INSERT INTO " . $this->db->pre . 'users ' . "(user_name, email, sex, birthday, reg_time, password)" . " VALUES('$username', '" . $main_profile['email'] . "','" . $main_profile['sex'] . "','" . $main_profile['birthday'] . "','" . $main_profile['reg_time'] . "', '$md5password')"; } $this->db->query($sql); return true; } else { $values = array(); if ($main_profile['email'] != $profile['email']) { $values[] = "email='" . $main_profile['email'] . "'"; } if ($main_profile['sex'] != $profile['sex']) { $values[] = "sex='" . $main_profile['sex'] . "'"; } if ($main_profile['birthday'] != $profile['birthday']) { $values[] = "birthday='" . $main_profile['birthday'] . "'"; } if ((! empty($md5password)) && ($md5password != $profile['password'])) { $values[] = "password='" . $md5password . "'"; } if (empty($values)) { return true; } else { $sql = "UPDATE " . $this->db->pre . 'users ' . " SET " . implode(", ", $values) . " WHERE user_name='$username'"; $this->db->query($sql); return true; } } } /** * 获取论坛有效积分及单位 * * @access public * @param * * * * * @return void */ function get_points_name() { return array(); } /** * 获取用户积分 * * @access public * @param * * * * * @return void */ function get_points($username) { $credits = $this->get_points_name(); $fileds = array_keys($credits); if ($fileds) { $sql = "SELECT " . $this->field_id . ', ' . implode(', ', $fileds) . " FROM " . $this->table($this->user_table) . " WHERE " . $this->field_name . "='$username'"; $row = $this->db->getRow($sql); return $row; } else { return false; } } /** * 设置用户积分 * * @access public * @param * * * * * @return void */ function set_points($username, $credits) { $user_set = array_keys($credits); $points_set = array_keys($this->get_points_name()); $set = array_intersect($user_set, $points_set); if ($set) { $tmp = array(); foreach ($set as $credit) { $tmp[] = $credit . '=' . $credit . '+' . $credits[$credit]; } $sql = "UPDATE " . $this->table($this->user_table) . " SET " . implode(', ', $tmp) . " WHERE " . $this->field_name . " = '$username'"; $this->db->query($sql); } return true; } function get_user_info($username) { return $this->get_profile_by_name($username); } /** * 检查有无重名用户,有则返回重名用户 * * @access public * @param * * * * * @return void */ function test_conflict($user_list) { if (empty($user_list)) { return array(); } $user_list = $this->db->table($this->user_table) ->field($this->field_name) ->where(db_create_in($user_list, $this->field_name)) ->getCol(); return $user_list; } }