diff --git a/library/think/Model.php b/library/think/Model.php index 8553fec6..e92a9344 100644 --- a/library/think/Model.php +++ b/library/think/Model.php @@ -995,7 +995,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess } // 模型更新 - $result = $this->db()->where($where)->update($data); + $result = $this->getQuery()->where($where)->update($data); // 关联更新 if (isset($relation)) { @@ -1022,11 +1022,11 @@ abstract class Model implements \JsonSerializable, \ArrayAccess return false; } - $result = $this->db()->insert($this->data); + $result = $this->getQuery()->insert($this->data); // 获取自动增长主键 if ($result && is_string($pk) && (!isset($this->data[$pk]) || '' == $this->data[$pk])) { - $insertId = $this->db()->getLastInsID($sequence); + $insertId = $this->getQuery()->getLastInsID($sequence); if ($insertId) { $this->data[$pk] = $insertId; } @@ -1114,7 +1114,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess } $result = []; - $db = $this->db(); + $db = $this->getQuery(); $db->startTrans(); try { $pk = $this->getPk(); @@ -1228,7 +1228,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess } // 删除当前模型数据 - $result = $this->db()->where($where)->delete(); + $result = $this->getQuery()->where($where)->delete(); // 关联删除 if (!empty($this->relationWrite)) { diff --git a/library/think/Paginator.php b/library/think/Paginator.php index d3547f8b..92d70f04 100644 --- a/library/think/Paginator.php +++ b/library/think/Paginator.php @@ -273,6 +273,23 @@ abstract class Paginator implements ArrayAccess, Countable, IteratorAggregate, J return $this->items->isEmpty(); } + /** + * 给每个元素执行个回调 + * + * @param callable $callback + * @return $this + */ + public function each(callable $callback) + { + foreach ($this->items as $key => $item) { + if ($callback($item, $key) === false) { + break; + } + } + + return $this; + } + /** * Retrieve an external iterator * @return Traversable An instance of an object implementing Iterator or diff --git a/library/think/Request.php b/library/think/Request.php index 1eb7f297..583dfb84 100644 --- a/library/think/Request.php +++ b/library/think/Request.php @@ -1034,7 +1034,7 @@ class Request $filter = []; } else { $filter = $filter ?: $this->filter; - if (is_string($filter)) { + if (is_string($filter) && false === strpos($filter, '/')) { $filter = explode(',', $filter); } else { $filter = (array) $filter; @@ -1060,7 +1060,7 @@ class Request // 调用函数或者方法过滤 $value = call_user_func($filter, $value); } elseif (is_scalar($value)) { - if (strpos($filter, '/')) { + if (false !== strpos($filter, '/')) { // 正则过滤 if (!preg_match($filter, $value)) { // 匹配不成功返回默认值 diff --git a/library/think/Route.php b/library/think/Route.php index a3001d8f..a5b19327 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -924,7 +924,7 @@ class Route } else { $str = $key; } - if (is_string($str) && $str && 0 !== strpos(str_replace('|', '/', $url), $str)) { + if (is_string($str) && $str && 0 !== stripos(str_replace('|', '/', $url), $str)) { continue; } self::setOption($option); diff --git a/library/think/db/Connection.php b/library/think/db/Connection.php index d2aa6ea9..908384cb 100644 --- a/library/think/db/Connection.php +++ b/library/think/db/Connection.php @@ -780,11 +780,31 @@ abstract class Connection /** * 是否断线 * @access protected - * @param \PDOException $e 异常 + * @param \PDOException $e 异常对象 * @return bool */ protected function isBreak($e) { + $info = [ + 'server has gone away', + 'no connection to the server', + 'Lost connection', + 'is dead or not enabled', + 'Error while sending', + 'decryption failed or bad record mac', + 'server closed the connection unexpectedly', + 'SSL connection has been closed unexpectedly', + 'Error writing data to the connection', + 'Resource deadlock avoided', + ]; + + $error = $e->getMessage(); + + foreach ($info as $msg) { + if (false !== stripos($error, $msg)) { + return true; + } + } return false; } diff --git a/library/think/db/Query.php b/library/think/db/Query.php index 55b70941..88fc23a1 100644 --- a/library/think/db/Query.php +++ b/library/think/db/Query.php @@ -401,7 +401,7 @@ class Query if (empty($this->options['table'])) { $this->options['table'] = $this->getTable(); } - $key = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options)); + $key = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options) . serialize($this->bind)); $result = Cache::get($key); } if (false === $result) { @@ -444,7 +444,7 @@ class Query if (empty($this->options['table'])) { $this->options['table'] = $this->getTable(); } - $guid = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options)); + $guid = is_string($cache['key']) ? $cache['key'] : md5($field . serialize($this->options) . serialize($this->bind)); $result = Cache::get($guid); } if (false === $result) { @@ -596,7 +596,7 @@ class Query } if ($lazyTime > 0) { // 延迟写入 - $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition)); + $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition) . serialize($this->bind)); $step = $this->lazyWrite('inc', $guid, $step, $lazyTime); if (false === $step) { // 清空查询条件 @@ -625,7 +625,7 @@ class Query } if ($lazyTime > 0) { // 延迟写入 - $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition)); + $guid = md5($this->getTable() . '_' . $field . '_' . serialize($condition) . serialize($this->bind)); $step = $this->lazyWrite('dec', $guid, $step, $lazyTime); if (false === $step) { // 清空查询条件 @@ -1902,6 +1902,9 @@ class Query $closure = $relation; $relation = $key; $with[$key] = $key; + } elseif (is_array($relation)) { + $subRelation = $relation; + $relation = $key; } elseif (is_string($relation) && strpos($relation, '.')) { $with[$key] = $relation; list($relation, $subRelation) = explode('.', $relation, 2); @@ -2205,7 +2208,7 @@ class Query $options['where']['AND'] = $where; } } elseif (!isset($key) && is_string($pk) && isset($options['where']['AND'][$pk])) { - $key = $this->getCacheKey($options['where']['AND'][$pk], $options); + $key = $this->getCacheKey($options['where']['AND'][$pk], $options, $this->bind); } // 生成UPDATE SQL语句 @@ -2293,7 +2296,7 @@ class Query // 判断查询缓存 $cache = $options['cache']; unset($options['cache']); - $key = is_string($cache['key']) ? $cache['key'] : md5(serialize($options)); + $key = is_string($cache['key']) ? $cache['key'] : md5(serialize($options) . serialize($this->bind)); $resultSet = Cache::get($key); } if (!$resultSet) { @@ -2385,8 +2388,9 @@ class Query * @access public * @param mixed $value 缓存数据 * @param array $options 缓存参数 + * @param array $bind 绑定参数 */ - protected function getCacheKey($value, $options) + protected function getCacheKey($value, $options, $bind = []) { if (is_scalar($value)) { $data = $value; @@ -2394,9 +2398,9 @@ class Query $data = $value[1]; } if (isset($data)) { - return 'think:' . $options['table'] . '|' . $data; + return 'think:' . (is_array($options['table']) ? key($options['table']) : $options['table']) . '|' . $data; } else { - return md5(serialize($options)); + return md5(serialize($options) . serialize($bind)); } } @@ -2424,7 +2428,7 @@ class Query // AR模式分析主键条件 $this->parsePkWhere($data, $options); } elseif (!empty($options['cache']) && true === $options['cache']['key'] && is_string($pk) && isset($options['where']['AND'][$pk])) { - $key = $this->getCacheKey($options['where']['AND'][$pk], $options); + $key = $this->getCacheKey($options['where']['AND'][$pk], $options, $this->bind); } $options['limit'] = 1; @@ -2437,7 +2441,7 @@ class Query } elseif (is_string($cache['key'])) { $key = $cache['key']; } elseif (!isset($key)) { - $key = md5(serialize($options)); + $key = md5(serialize($options) . serialize($this->bind)); } $result = Cache::get($key); } @@ -2648,7 +2652,7 @@ class Query // AR模式分析主键条件 $this->parsePkWhere($data, $options); } elseif (!isset($key) && is_string($pk) && isset($options['where']['AND'][$pk])) { - $key = $this->getCacheKey($options['where']['AND'][$pk], $options); + $key = $this->getCacheKey($options['where']['AND'][$pk], $options, $this->bind); } if (true !== $data && empty($options['where'])) { diff --git a/library/think/db/connector/Mysql.php b/library/think/db/connector/Mysql.php index 0081fb2e..dc717532 100644 --- a/library/think/db/connector/Mysql.php +++ b/library/think/db/connector/Mysql.php @@ -130,17 +130,4 @@ class Mysql extends Connection return true; } - /** - * 是否断线 - * @access protected - * @param \PDOException $e 异常对象 - * @return bool - */ - protected function isBreak($e) - { - if (false !== stripos($e->getMessage(), 'server has gone away')) { - return true; - } - return false; - } } diff --git a/tpl/think_exception.tpl b/tpl/think_exception.tpl index 2d898c30..0c9d31ed 100644 --- a/tpl/think_exception.tpl +++ b/tpl/think_exception.tpl @@ -79,7 +79,7 @@
-