/** * 通过多个字段名和值,查询多条记录 * @param array $params * @param string $order * @param integer $limit * @param integer $offset * @param string $option * @return array */ public function findAll(array $params = array(), $order = '', $limit = 0, $offset = 0, $option = '') { $limit = min(max((int) $limit, 1), Constant::FIND_MAX_LIMIT); $offset = max((int) $offset, 0); if (isset($params['ip_registered'])) { $ipRegistered = trim($params['ip_registered']); unset($params['ip_registered']); if ($ipRegistered !== '') { $ipRegistered = strpos($ipRegistered, '.') !== false ? Clean::ip2long($ipRegistered) : (int) $ipRegistered; if ($ipRegistered !== false) { $params['ip_registered'] = $ipRegistered; } } } $rows = $this->getDb()->findAll($params, $order, $limit, $offset, $option); return $rows; }
/** * 验证用户登录 * @param array $users * @param boolean $update * @return array */ public function checkLogin(array $users, $update = true) { $userId = isset($users['user_id']) ? (int) $users['user_id'] : 0; $loginName = isset($users['login_name']) ? $users['login_name'] : ''; $loginType = isset($users['login_type']) ? $users['login_type'] : ''; $password = isset($users['password']) ? $users['password'] : ''; $salt = isset($users['salt']) ? $users['salt'] : ''; $userName = isset($users['user_name']) ? $users['user_name'] : ''; $userMail = isset($users['user_mail']) ? $users['user_mail'] : ''; $userPhone = isset($users['user_phone']) ? $users['user_phone'] : ''; $dtRegistered = isset($users['dt_registered']) ? $users['dt_registered'] : ''; $dtLastLogin = isset($users['dt_last_login']) ? $users['dt_last_login'] : ''; $dtLastRepwd = isset($users['dt_last_repwd']) ? $users['dt_last_repwd'] : ''; $ipRegistered = isset($users['ip_registered']) ? (int) $users['ip_registered'] : 0; $ipLastLogin = isset($users['ip_last_login']) ? (int) $users['ip_last_login'] : 0; $ipLastRepwd = isset($users['ip_last_repwd']) ? (int) $users['ip_last_repwd'] : 0; $loginCount = isset($users['login_count']) ? (int) $users['login_count'] : 0; $repwdCount = isset($users['repwd_count']) ? (int) $users['repwd_count'] : 0; $groupIds = isset($users['group_ids']) ? (array) $users['group_ids'] : array(); $validMail = $users['valid_mail'] === DataUsers::VALID_MAIL_Y ? true : false; $validPhone = $users['valid_phone'] === DataUsers::VALID_PHONE_Y ? true : false; $trash = $users['trash'] === DataUsers::TRASH_N ? false : true; $forbidden = $users['forbidden'] === DataUsers::FORBIDDEN_N ? false : true; $data = array('user_id' => $userId, 'login_name' => $loginName, 'login_type' => $loginType, 'password' => $password, 'salt' => $salt, 'user_name' => $userName, 'user_mail' => $userMail, 'user_phone' => $userPhone, 'dt_registered' => $dtRegistered, 'dt_last_login' => $dtLastLogin, 'dt_last_repwd' => $dtLastRepwd, 'ip_registered' => $ipRegistered, 'ip_last_login' => $ipLastLogin, 'ip_last_repwd' => $ipLastRepwd, 'login_count' => $loginCount, 'repwd_count' => $repwdCount, 'group_ids' => $groupIds, 'valid_mail' => $validMail, 'valid_phone' => $validPhone, 'trash' => $trash, 'forbidden' => $forbidden); if ($userId <= 0 || $loginName === '') { $errNo = DataAccount::ERROR_LOGIN_FAILED; Log::warning(sprintf('Account user_id and login_name must be not empty, user_id "%d", login_name "%s"', $userId, $loginName), $errNo, __METHOD__); return array('err_no' => $errNo, 'data' => array()); } if ($trash) { $errNo = DataAccount::ERROR_USER_TRASH; Log::warning(sprintf('Account user has been trashed, user_id "%d", login_name "%s"', $userId, $loginName), $errNo, __METHOD__); return array('err_no' => $errNo, 'data' => $data); } if ($forbidden) { $errNo = DataAccount::ERROR_USER_FORBIDDEN; Log::warning(sprintf('Account user has been forbidden, user_id "%d", login_name "%s"', $userId, $loginName), $errNo, __METHOD__); return array('err_no' => $errNo, 'data' => $data); } if ($update) { $dtLastLogin = date('Y-m-d H:i:s'); $ipLastLogin = Clean::ip2long(Ap::getRequest()->getClientIp()); $loginCount += 1; $params = array('dt_last_login' => $dtLastLogin, 'ip_last_login' => $ipLastLogin, 'login_count' => $loginCount); $rowCount = $this->_users->modifyByPk($userId, $params); if ($rowCount) { $data['dt_last_login'] = $dtLastLogin; $data['ip_last_login'] = $ipLastLogin; $data['login_count'] = $loginCount; } else { Log::warning(sprintf('Account update dt_last_login|ip_last_login|login_count Failed, user_id "%d", login_name "%s"', $userId, $loginName), DataAccount::ERROR_MODIFY_LAST_LOGIN, __METHOD__); } } $errNo = DataAccount::SUCCESS_LOGIN_NUM; return array('err_no' => $errNo, 'data' => $data); }
/** * 投票-支持会员或游客、支持单选或多选 * @param string $pollKey * @param string $value * @param integer $memberId * @param integer $rankId * @return array */ public function addVote($pollKey, $value, $memberId, $rankId) { $row = Service::getInstance('Polls', 'poll')->findByPollKey($pollKey, false); if (!$row || !is_array($row) || !isset($row['poll_id']) || !isset($row['is_published'])) { $errNo = DataVote::ERROR_FAILED; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } if (!$row['is_published']) { $errNo = DataVote::ERROR_DT_PUBLISH_DOWN_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } $nowTime = date('Y-m-d H:i:s'); if ($nowTime < $row['dt_publish_up']) { $errNo = DataVote::ERROR_DT_PUBLISH_UP_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo, $row['dt_publish_up'])); } if ($row['dt_publish_down'] !== '0000-00-00 00:00:00' && $nowTime > $row['dt_publish_down']) { $errNo = DataVote::ERROR_DT_PUBLISH_DOWN_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } $checked = array(); foreach (explode(',', $value) as $_v) { if (($_v = (int) $_v) > 0 && !in_array($_v, $checked)) { $checked[] = $_v; } } $memberId = (int) $memberId; $rankId = (int) $rankId; $pollId = (int) $row['poll_id']; $optIds = array(); $visitorIp = Clean::ip2long(Ap::getRequest()->getClientIp()); $allowUnregistered = $row['allow_unregistered']; $isMultiple = $row['is_multiple']; $maxChoices = (int) $row['max_choices']; $joinType = isset($row['join_type']) ? $row['join_type'] : ''; $interval = isset($row['interval']) ? (int) $row['interval'] : 0; $mRankIds = isset($row['m_rank_ids']) ? (array) $row['m_rank_ids'] : array(); if ($allowUnregistered) { $memberId = 0; $rankId = 0; } else { if ($memberId <= 0) { $errNo = DataVote::ERROR_ALLOW_UNREGISTERED_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } if ($mRankIds !== array() && !in_array($rankId, $mRankIds)) { $errNo = DataVote::ERROR_M_RANK_ID_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } } if ($checked === array()) { $errNo = DataVote::ERROR_POLLOPTIONS_EMPTY; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } if ($isMultiple) { if ($maxChoices > 0 && count($checked) > $maxChoices) { $errNo = DataVote::ERROR_POLLOPTIONS_WRONG; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo, $maxChoices)); } } $options = Service::getInstance('Polloptions', 'poll')->findAllByPollId($pollId); foreach ($options as $row) { $optId = isset($row['option_id']) ? (int) $row['option_id'] : 0; if (in_array($optId, $checked)) { $optIds[] = $optId; } } if ($optIds === array()) { $errNo = DataVote::ERROR_POLLOPTIONS_NOT_EXISTS; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } if (!$isMultiple) { $optIds = array_shift($optIds); } $row = array(); if ($memberId > 0) { $row = $this->getMemberLogs($pollId, $memberId); } else { $row = $this->getVisitorLogs($pollId, $visitorIp); } if ($row && is_array($row) && isset($row['ts_last_modified'])) { if (($tsLastModified = (int) $row['ts_last_modified']) > 0) { $errNo = DataVote::SUCCESS_NUM; switch ($joinType) { case DataPolls::JOIN_TYPE_FOREVER: $errNo = DataVote::ERROR_JOIN_TYPE_FOREVER_WRONG; break; case DataPolls::JOIN_TYPE_YEAR: if (date('Y', $tsLastModified) === date('Y')) { $errNo = DataVote::ERROR_JOIN_TYPE_YEAR_WRONG; } break; case DataPolls::JOIN_TYPE_MONTH: if (date('Ym', $tsLastModified) === date('Ym')) { $errNo = DataVote::ERROR_JOIN_TYPE_MONTH_WRONG; } break; case DataPolls::JOIN_TYPE_DAY: if (date('Ymd', $tsLastModified) === date('Ymd')) { $errNo = DataVote::ERROR_JOIN_TYPE_DAY_WRONG; } break; case DataPolls::JOIN_TYPE_HOUR: if (date('YmdH', $tsLastModified) === date('YmdH')) { $errNo = DataVote::ERROR_JOIN_TYPE_HOUR_WRONG; } break; case DataPolls::JOIN_TYPE_INTERVAL: default: if (time() - $tsLastModified <= $interval) { $errNo = DataVote::ERROR_JOIN_TYPE_INTERVAL_WRONG; } } if ($errNo !== DataVote::SUCCESS_NUM) { return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo, $interval)); } } } if (!$this->getDb()->addVote($pollId, $optIds, $visitorIp, $memberId)) { $errNo = DataVote::ERROR_FAILED; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); } $errNo = DataVote::SUCCESS_NUM; return array('err_no' => $errNo, 'err_msg' => DataVote::getErrMsgByErrNo($errNo)); }
/** * (non-PHPdoc) * @see \libsrv\FormProcessor::_cleanPreProcess() */ protected function _cleanPreProcess(array $params) { if (isset($params['trash'])) { unset($params['trash']); } if ($this->isInsert()) { if (isset($params['salt'])) { unset($params['salt']); } if (isset($params['relation_member_id'])) { unset($params['relation_member_id']); } if (isset($params['dt_last_repwd'])) { unset($params['dt_last_repwd']); } if (isset($params['ip_last_repwd'])) { unset($params['ip_last_repwd']); } if (isset($params['repwd_count'])) { unset($params['repwd_count']); } $params['dt_registered'] = $params['dt_last_login'] = date('Y-m-d H:i:s'); $params['ip_registered'] = $params['ip_last_login'] = Clean::ip2long(Ap::getRequest()->getClientIp()); $params['login_count'] = 1; $params['salt'] = $this->_object->getSalt(); $params['login_name'] = $loginName = isset($params['login_name']) ? trim($params['login_name']) : ''; $params['login_type'] = $loginType = $this->_object->getLoginType($loginName); if ($this->_object->isMailLogin($loginType)) { if (!isset($params['member_mail']) || trim($params['member_mail']) === '') { $params['member_mail'] = $loginName; } } elseif ($this->_object->isPhoneLogin($loginType)) { if (!isset($params['member_phone']) || trim($params['member_phone']) === '') { $params['member_phone'] = $loginName; } } if (!isset($params['member_name']) || trim($params['member_name']) === '') { if ($this->_object->isMailLogin($loginType)) { $params['member_name'] = strstr($loginName, '@', true); } else { $params['member_name'] = $loginName; } } } else { $row = $this->_object->findByPk($this->id); if (!$row || !is_array($row) || !isset($row['repwd_count'])) { Log::warning(sprintf('FpPortal is unable to find the result by id "%d"', $this->id), ErrorNo::ERROR_DB_SELECT, __METHOD__); return false; } if (isset($params['login_name'])) { unset($params['login_name']); } if (isset($params['login_type'])) { unset($params['login_type']); } if (isset($params['salt'])) { unset($params['salt']); } if (isset($params['dt_registered'])) { unset($params['dt_registered']); } if (isset($params['ip_registered'])) { unset($params['ip_registered']); } $password = isset($params['password']) ? trim($params['password']) : ''; if ($password !== '') { if (!isset($params['repassword'])) { $params['repassword'] = ''; } $params['salt'] = $this->_object->getSalt(); $params['dt_last_repwd'] = date('Y-m-d H:i:s'); $params['ip_last_repwd'] = Clean::ip2long(Ap::getRequest()->getClientIp()); $params['repwd_count'] = (int) $row['repwd_count'] + 1; } else { if (isset($params['password'])) { unset($params['password']); } if (isset($params['repassword'])) { unset($params['repassword']); } if (isset($params['dt_last_repwd'])) { unset($params['dt_last_repwd']); } if (isset($params['ip_last_repwd'])) { unset($params['ip_last_repwd']); } if (isset($params['repwd_count'])) { unset($params['repwd_count']); } } } $rules = array('login_name' => 'trim', 'login_type' => 'trim', 'password' => 'trim', 'repassword' => 'trim', 'salt' => 'trim', 'member_name' => 'trim', 'member_mail' => 'trim', 'member_phone' => 'trim', 'relation_member_id' => 'intval', 'dt_registered' => 'trim', 'dt_last_login' => 'trim', 'dt_last_repwd' => 'trim', 'ip_registered' => 'intval', 'ip_last_login' => 'intval', 'ip_last_repwd' => 'intval', 'login_count' => 'intval', 'repwd_count' => 'intval', 'valid_mail' => 'trim', 'valid_phone' => 'trim', 'forbidden' => 'trim'); $ret = $this->clean($rules, $params); return $ret; }
/** * (non-PHPdoc) * @see \libsrv\FormProcessor::_cleanPreProcess() */ protected function _cleanPreProcess(array $params) { if ($this->isInsert()) { if (isset($params['last_modifier_id'])) { unset($params['last_modifier_id']); } if (isset($params['last_modifier_name'])) { unset($params['last_modifier_name']); } $params['dt_created'] = $params['dt_last_modified'] = date('Y-m-d H:i:s'); $params['ip_created'] = $params['ip_last_modified'] = Clean::ip2long(Ap::getRequest()->getClientIp()); $params['good_count'] = $params['bad_count'] = 0; $postId = isset($params['post_id']) ? (int) $params['post_id'] : 0; if ($postId <= 0) { $this->addError('post_id', Lang::_('SRV_FILTER_POST_COMMENTS_POST_ID_EXISTS')); return false; } $row = Service::getInstance('Posts', 'posts')->findByPk($postId); if (!$row || !is_array($row) || !isset($row['comment_status'])) { $this->addError('post_id', Lang::_('SRV_FILTER_POST_COMMENTS_POST_ID_EXISTS')); return false; } switch (true) { case $row['comment_status'] === DataPosts::COMMENT_STATUS_DRAFT: $params['is_published'] = DataComments::IS_PUBLISHED_N; break; case $row['comment_status'] === DataPosts::COMMENT_STATUS_PUBLISH: $params['is_published'] = DataComments::IS_PUBLISHED_Y; break; default: $this->addError('post_id', Lang::_('SRV_FILTER_POST_COMMENTS_POST_ID_POWER')); return false; } } else { if (isset($params['creator_id'])) { unset($params['creator_id']); } if (isset($params['creator_name'])) { unset($params['creator_name']); } if (isset($params['dt_created'])) { unset($params['dt_created']); } if (isset($params['ip_created'])) { unset($params['ip_created']); } $params['dt_last_modified'] = date('Y-m-d H:i:s'); $params['ip_last_modified'] = Clean::ip2long(Ap::getRequest()->getClientIp()); } $rules = array('comment_pid' => 'intval', 'post_id' => 'intval', 'author_name' => 'trim', 'author_mail' => 'trim', 'author_url' => 'trim', 'is_published' => 'trim', 'good_count' => 'intval', 'bad_count' => 'intval', 'creator_id' => 'intval', 'creator_name' => 'trim', 'last_modifier_id' => 'intval', 'last_modifier_name' => 'trim', 'dt_created' => 'trim', 'dt_last_modified' => 'trim', 'ip_created' => 'intval', 'ip_last_modified' => 'intval'); $ret = $this->clean($rules, $params); return $ret; }
/** * 第三方账号登录 * @param string $partner * @param string $openid * @return array */ public function loginByPartner($partner, $openid) { if (($partner = trim($partner)) === '') { $errNo = DataAccount::ERROR_PARTNER_EMPTY; return array('err_no' => $errNo, 'err_msg' => DataAccount::getErrMsgByErrNo($errNo), 'data' => array()); } if (($openid = trim($openid)) === '') { $errNo = DataAccount::ERROR_OPENID_EMPTY; return array('err_no' => $errNo, 'err_msg' => DataAccount::getErrMsgByErrNo($errNo), 'data' => array()); } if (!in_array($partner, DataAccount::$partners)) { $errNo = DataAccount::ERROR_PARTNER_WRONG; return array('err_no' => $errNo, 'err_msg' => DataAccount::getErrMsgByErrNo($errNo), 'data' => array()); } $loginName = $partner . '_' . $openid; $row = $this->_portal->findByLoginName($loginName); if (!$row || !is_array($row) || !isset($row['member_id'])) { $salt = $this->_portal->getSalt(); $password = $this->_portal->encrypt(String::randStr(12), $salt); $params = array('login_name' => $loginName, 'login_type' => DataPortal::LOGIN_TYPE_PARTNER, 'password' => $password, 'salt' => $salt, 'member_name' => mt_rand(100000000, 999999999), 'ip_registered' => Clean::ip2long(Ap::getRequest()->getClientIp())); if (!$this->_portal->getDb()->create($params)) { Log::warning(sprintf('Account db create failed, login_name "%s", login_type "%s"', $loginName, DataPortal::LOGIN_TYPE_PARTNER), 0, __METHOD__); } } $ret = $this->checkName($loginName); $ret['err_msg'] = DataAccount::getErrMsgByErrNo($ret['err_no']); if ($ret['err_no'] !== DataAccount::SUCCESS_LOGIN_NUM) { return $ret; } $ret = $this->checkLogin($ret['data'], true); $ret['err_msg'] = DataAccount::getErrMsgByErrNo($ret['err_no']); if ($ret['err_no'] !== DataAccount::SUCCESS_LOGIN_NUM) { return $ret; } $ret = $this->setIdentity($ret['data'], false); $ret['err_msg'] = DataAccount::getErrMsgByErrNo($ret['err_no']); return $ret; }
/** * (non-PHPdoc) * @see \libsrv\FormProcessor::_cleanPreProcess() */ protected function _cleanPreProcess(array $params) { if (isset($params['trash'])) { unset($params['trash']); } if (isset($params['category_name'])) { unset($params['category_name']); } if (isset($params['creator_name'])) { unset($params['creator_name']); } if (isset($params['last_modifier_name'])) { unset($params['last_modifier_name']); } if ($this->isInsert()) { if (isset($params['last_modifier_id'])) { unset($params['last_modifier_id']); } if (isset($params['last_modifier_name'])) { unset($params['last_modifier_name']); } $params['dt_created'] = $params['dt_last_modified'] = date('Y-m-d H:i:s'); $params['ip_created'] = $params['ip_last_modified'] = Clean::ip2long(Ap::getRequest()->getClientIp()); if (!isset($params['sort'])) { $params['sort'] = 10000; } } else { $row = $this->_object->findByPk($this->id); if (!$row || !is_array($row) || !isset($row['creator_id']) || !isset($row['allow_other_modify'])) { Log::warning(sprintf('FpPosts is unable to find the result by id "%d"', $this->id), ErrorNo::ERROR_DB_SELECT, __METHOD__); return false; } $creatorId = isset($row['creator_id']) ? (int) $row['creator_id'] : 0; $lastModifierId = isset($params['last_modifier_id']) ? (int) $params['last_modifier_id'] : 0; if ($creatorId !== $lastModifierId) { if ($row['allow_other_modify'] !== DataPosts::ALLOW_OTHER_MODIFY_Y) { $this->addError('allow_other_modify', Lang::_('SRV_FILTER_POSTS_ALLOW_OTHER_MODIFY_POWER')); } } if (isset($params['creator_id'])) { unset($params['creator_id']); } if (isset($params['creator_name'])) { unset($params['creator_name']); } if (isset($params['dt_created'])) { unset($params['dt_created']); } if (isset($params['ip_created'])) { unset($params['ip_created']); } if (isset($params['module_id'])) { unset($params['module_id']); } $params['dt_last_modified'] = date('Y-m-d H:i:s'); $params['ip_last_modified'] = Clean::ip2long(Ap::getRequest()->getClientIp()); } $rules = array('title' => 'trim', 'alias' => 'trim', 'keywords' => 'trim', 'sort' => 'intval', 'category_id' => 'intval', 'module_id' => 'intval', 'password' => 'trim', 'picture' => 'trim', 'is_head' => 'trim', 'is_recommend' => 'trim', 'is_jump' => 'trim', 'jump_url' => 'trim', 'is_published' => 'trim', 'dt_publish_up' => 'trim', 'dt_publish_down' => 'trim', 'comment_status' => 'trim', 'allow_other_modify' => 'trim', 'hits' => 'intval', 'praise_count' => 'intval', 'comment_count' => 'intval', 'creator_id' => 'intval', 'last_modifier_id' => 'intval'); $ret = $this->clean($rules, $params); return $ret; }