thinkphp存储过程
A. thinkphp 往数据库存储的是PHP程序代码,在读取出来后不被解析而是直接输出的 有什么办法解决吗
你需要吧$shopcount赋值,并映射到html页面中才可以呀
B. thinkphp 怎么执行存储过程怎么获取存储过程返回的out参数
thinkphp;里面支持自己写sql的,你就想平常一样调用你的存储过程就行了,抛弃thinkphp的观念,这是比较笨的方法啊!哈哈
C. php 是什么是什么
PHP,是英文超文本预处理语言Hypertext Preprocessor的缩写。
一、概念。
PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。
二、解析。
PHP 独特的语法混合了C、java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
三、特点。
1、PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
2、PHP安装它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比。
3、PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多; PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。
4、支持几乎所有流行的数据库以及操作系统。最重要的是PHP可以用C、C++进行程序的扩展。
D. ThinkPHP中调用存储过程失败
首先:它得知道你将要操作的是那个库中的表吧?
其次:你在使用mysql_query时并没有创建数据模型。
比如:$User = new Model('User');或者用大D
然后就直接用了,它并不理解你在干嘛。
E. thinkphp3.2 怎么调用mysql存储过程并返回所有结果集
$model = M("");
$sql = "call 存储过程名称('{$参数1}','{$参数2}',@result)";
//echo $sql;
$ref = $model -> query($sql);
//var_mp($ref);
// 结果集视具体情况而定
$status= $ref[0]['result'];
F. thinkphp怎么加入adminer
编译
当的大小 adminer.php然后我开始增长已经意识到是明智的分割文件管理的发展。尽管如此,我仍然想要的文件我已经创建了一个编译脚本,连接起来的文件。
因为一切都是一个文件,管理员不能使用通常的URL alter.php?table=X和操作必须通过在查询字符串中。而不是常见的 ?action=alter&table=X,我有更紧凑的替代使用 ?alter=X。然后一系列中央脚本 if (isset($_GET["..."]))而不是一个大 switch ($_GET["action"])。有一个包括内部的特定功能 if这些包括编译构建过程中的一个文件:
<?php
function include_file($match) {
$file = file_get_contents($match[1]);
$token = end(token_get_all($file));
$php = (is_array($token) && in_array($token[0], array(T_CLOSE_TAG, T_INLINE_HTML)));
return "?>\n$file" . ($php ? "<?php" : "");
}
$file = preg_replace_callback('~include "([^"]+)";~', 'include_file', $file);
?>
这个代码不是普遍可用,因为它只发现 include ""变体。它将需要处理的文件token_get_all功能和找到所有包括变体。的 _once变异将会更加困难。也可以有一个全球水平返回.
管理也使用一些外部文件——样式表,快捷方���图标和图像。有几种可能的访问这些文件的方法:
他们可以集成在主HTML代码——样式表 <style>标签,利用图像 data:协议。这种方法的问题是,Internet Explorer 8 <不支持这个协议。第二个问题是,浏览器需要反复与每个页面传输这些数据。
可以从外部服务器下载的文件。会有问题,如果服务器不可用或如果计算机的运行管理是没有互联网连接。然而这种方法是使用SQL查询语法高亮显示,这是一个可选的特性——管理使用JavaScript语法高亮显示JUSH对于这个任务。
文件可以被集成的源代码和一个特殊的参数将为他们服务。你有没有注意到PHP输出的标志吗phpinfo吗?PHP从本地服务器下载它特殊的查询字符串 ?=PHP…。管理使用类似的方法,节省了Base64编码的文件的源代码(编码不是必需的,但它简化了脚本编辑共同的文本编辑器)。这种方法允许HTTP缓存管理利用的外部文件。
注意:PHP 5.3附带了一个支持PHP档案通过phar扩展。这个扩展,可以装几个文件归档和从PHP访问内部的文件归档。使用webPhar包装方法允许大多数PHP应用程序创建phar归档和有指令phpMyAdmin的版本PHP手册。管理不使用这个扩展和使用PHP > = 4.3和PHP > = 5.0。
缩小
编译脚本也贬低代码——它删除评论和修剪空白。大卫的缩小代码是基于工作Grudl谁使用它为他的才华横溢的库Texy,dibi和Nette。这个函数是比内部功能更有效php_strip_whitespace.
<?php
function php_shrink($input) {
$set = array_flip(preg_split('//', '!"#$&\'()*+,-./:;<=>?@[\]^`{|}'));
$space = '';
$output = '';
foreach (token_get_all($input) as $token) {
if (!is_array($token)) {
$token = array(0, $token);
}
if ($token[0] == T_COMMENT || $token[0] == T_WHITESPACE) {
$space = "\n";
} else {
if (isset($set[substr($output, -1)]) || isset($set[$token[1][0]])) {
$space = '';
}
$output .= $space . $token[1];
$space = '';
}
}
return $output;
}
?>
当前版本也缩短用户变量和函数的名字。它发现的变量和函数的源代码token_get_all功能和通过短标识符替换它们。缩短过程跳过内部PHP变量和函数。也有可能缩短他们但它会更复杂,它将有一个的性能损失。一些PHP变量有其超全局特性是必要的别名功能内的全球化。
内部函数可以包含在包络函数较短的名字。然而这种方法是有问题的,因为PHP函数可以有可选参数没有默认值(这个函数的例子写入文件这检测传递的参数的数量而不是它们的值)。通用函数func_get_args不使用引用相反。
替代的方法是定义一个变量为一个内部函数(例如 $fw = 'fwrite'通过这个变量)和调用的函数: $fw($fp, $string)。管理但不使用没有方法,因为它将使应用程序慢下来。
的缩小从CSS和去掉空格也PHP版本的个贬低的JavaScript代码。
文件会小得多的如果它被压缩。PHP支持几个压缩算法,但只有通过一个扩展。我在想用PHP编写的一个简单的减压函数将解压缩文件的其他部分,但需要eval解压缩代码和每个人都知道eval是恶(原因之一是不兼容PHP加速器)。因此,代码不是压缩但只有缩小。
翻译
我在英语发展管理。还有一个捷克版本(这是我的母语)从一开始就和管理目前有11种语言。所有消息是由一个简单的函数,它检查当前的语言并返回相应的翻译。
一个简单的函数检测的语言 Accept-Language标题:
<?php
function acceptable_language($translations) {
$accept_language = array();
preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$accept_language[$match[1]] = (isset($match[3]) ? $match[3] : 1);
}
arsort($accept_language);
foreach ($accept_language as $lang => $q) {
if (isset($translations[$lang])) {
return $lang;
}
$lang = preg_replace('~-.*~', '', $lang);
if (!isset($accept_language[$lang]) && isset($translations[$lang])) {
return $lang;
}
}
return false;
}
?>
这个函数的调用者保存语言一个cookie在第一次检测。用户可以随时改变语言在同一页面。保存页面语言饼干是一个非常糟糕的实践在一个公共网站,因为搜索引擎才能指数只有一个版本的页面。然而在管理可接受的,因为搜索引擎不索引页面和页面的主要内容(例如表结构)在所有的语言都是一样的。语言存储在cookie的奖励是一个简单的URL而仍有可能执行语言通过语言标识符在查询字符串中。
翻译存储在一个简单的数组,其中的关键是一个消息标识符(这是一个英语版本的消息,并使用它如果翻译不存在),该值是一个字符串翻译。值是包含一些更有趣的信息(如“一行”或“两行”)。大多数语言有不同的单数和复数形式,但有些语言(例如捷克语或俄语)使用更多的复数形式取决于数量(如捷克“皮沃- 1”,“2 piva”或“5 piv”啤酒)。消息和数据都存储在一个数组,而不是字符串和管理包含一个简单的逻辑语言选择正确的形式取决于数量。
默认情况下,管理员有所有语言。编译转换翻译数组值只和改变了标识符数字保存一些字节每个翻译大约需要4 KB。编译脚本也能够创建一个单一的语言版本,它完全消除了语言翻译功能和检测。这个文件只需要111 KB的英文版本管理1.10.1。
数据库扩展抽象
PHP允许通过三个扩展:连接到一个MySQL数据库MySQL,mysqli pdo_mysql。管理支持他们和包含这些扩展的一个简单的抽象层。这个抽象层模拟的子集mysqli和mysqli_result类为所有三个扩展。
PDO的支持是有些微妙,因为PDO使用异常来报告连接错误。管理员不能用通常的 try块来捕捉这些异常,因为它运行在PHP 4。一切都在一个文件所以PDO支持不能有条件地只包括在PHP 5。解决方案是使用set_exception_handler函数来处理连接错误。PHP 4还不支持类常量在语法层面上的源代码使用数值常量代替。
安全
最重要的部分的安全管理是惊人的防御跨站点请求伪造。CSRF攻击者可以执行操作在一个登录的用户的名字。管理员登录信息存储在一个标准的PHP会话所以可以发送cookie会话标识符和抵御CSRF是必要的。管理员发送一个令牌与每个形式和在执行操作前检查这个令牌的形式。令牌保护甚至经常被遗忘的注销动作在其他web应用程序。
非常重要的也是防止跨站点脚本。输出的HTML代码存储在数据库中可以透露敏感信息攻击者htmlspecialchars函数每输出函数逃。
管理也防止SQL注入,但它不是安全的名义——如果攻击者已经登录到管理员然后她可以执行任何SQL命令的SQL代码页。因此,防止SQL注入只是一个适当的操作与用户输入的副作用——用户可以通过任何数据到数据库中。如果管理检测magic_quotes_gpc然后它中和这个指令,并使用适当的转义函数只有当传递到MySQL的数据。
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
调用的session_regenerate_id登录后防止会话固定。
管理包含的每一个页面 robots: noindex元信息隐藏页面的搜索引擎。
登录表单
管理数据库证书保存到一个会话,检查每一页。如果数据库不能授权用户登录表单是直接显示在页面上。这种方法是更好的然后将用户重定向到一个登录页面有几个原因:
它节省了一个请求,直接登录表单发送到目标页面。
用户可以收藏任何页面,登录后直接显示。重定向到一个登录表单的方法也可以实现这一目标,但要复杂得多(登录表单需要返回的URL,检查它的有效性和重定向后登录,因为 Referer头不可靠)。
如果会话到期之前发送任何申请表然后发布数据预填充登录表单隐藏字段。
<?php
function hidden_fields($process) {
while (list($key, $val) = each($process)) {
if (is_array($val)) {
foreach ($val as $k => $v) {
$process[$key . "[$k]"] = $v;
}
} else {
echo '<input type="hidden" name="' . htmlspecialchars($key) . '" value="' . htmlspecialchars($val) . '" />';
}
}
}
hidden_fields($_POST);
?>
发送文件也保存到隐藏字段和有一个小层服务的文件带有_file美元的变量或隐藏字段。
可以不填表单通过登录 ?username=参数。用户可以使用这个特性在一个安全的环境验证由其他意思(如没有远程访问localhost或HTTP身份验证)。然而,它是不可能通过密码在GET参数这将是非常不安全的。管理员使用的价值 mysql.default_password在这种情况下配置指令。演示应用程序使用这种方法自动登录用户。
表单处理
管理POST方法发送所有动作形式。如果操作成功,那么它将浏览器重定向到一个页面显示结果的确认消息。这消息存储到一个会话变量后开始执行行动,每个HTML页面处理这个会话变量。有理论的可能性,其他管理页面打开同时在不同的浏览器选项卡可以捕获消息并显示它而不是原始页面。然而,设置消息和显示之间的时期很短所以这个概率很低。除此之外,这个巧合的结果小,用户会被告知结果,只是在不同的选项卡。
另一种可选择的方法是发送消息ID或消息本身在URL中但杂乱浏览器历史。此外,页面刷新将保持消息在页面上,这是不可取的。
如果表单操作产生的错误页面直接显示错误消息与肾上腺素的形式发送数据。不重定向浏览器的代码在这种情况下,它允许一个用户刷新页面发送数据只是暂时的错误(例如,如果它可以固定在其他浏览器选项卡)。
数据库模式
简单的数据库模式管理包含一个简单的界面的可视化数据库模式。它显示所有表的列。颜色区分列类型和箭头象征着表引用。表在屏幕上用鼠标可以移动,通过JavaScript和CSS。数据库模式页面使用一个cookie表放置保存。
出口
管理支持SQL和CSV进出口。最有趣的变体出口是使用ALTER命令。通常会有不同的生产和开发服务器上的数据库。如果你有了一些变化的数据库结构应该在发布到生产服务器然后删除旧表和创建新的不是一个选择,因为有实时数据表所示。管理员能够生成一组改变同步数据库的命令。它利用一个存储过程,探讨了生产数据库并改变它符合开发版本。创建新表像往常一样,旧表下降,缺少字段和索引。
性能
管理总是查询所有数据直接从数据库只有一个例外。获取数据库列表可能需要很长时间如果有许多服务器上的数据库,即使用户访问只有两个。因为每个页面显示数据库列表缓存是一个会话变量中。这个变量如果刷新用户创建或删除一个数据库从用户界面或SQL命令。
关闭一个会话session_write_close是一个性能优化影响不大。默认的PHP会话处理程序锁文件会话数据,从而防止web服务器为多个请求相同的用户在同一时间。这是非常重要的网站上使用框架,这是一个常见的情况。管理不使用框架,但用户仍然可以同时打开多个浏览器选项卡与管理。管理员写所有的会话数据,尽快关闭会话允许的最大并发性。
大多数用户感受到管理的平滑,甚至一个用户创建测试套件,衡量phpMyAdmin的性能比较:
性能相同操作的平均速度快了28%(2×23测试)。
登录后开始快56%(2×4测试)。
最后,了解源代码是快100%。
示范
演示是一个最好的方式来展示一些产品的特点。 我已经创建了一些样例数据库,使它从网站访问通过管理但用户已经开始腐蚀它很快。我在想定期恢复数据库,但它不会工作,因为与此同时数据库仍然会损坏。另一方面,在重置用户使用数据库将正在发生的事情感到惊讶。限制将削弱的操作演示,所以这不是一个选择。其他可能是模拟数据库访问为每个用户会话,但这将是一个非常复杂的任务,它不会出现管理的所有功能。
最后,我已经结束,为每个用户创建一个单独的数据库进入演示。脚本初始化这个数据库的示例数据后登录注销后的演示和破坏它。一个cron作业滴的用户数据库没有注销。演示用户目前��强大的特权管理的特点所以有必要限制数据库的列表不允许其他用户访问数据库。每个MySQL用户也可以修改自己的密码和演示应用程序的用户很快就发现了它。因此,演示也禁用这个特性。
我不想创建一个单独的版本的管理只是为了演示我所有定制auto_prepend_file。前缀脚本限制数据库列表,不允许改变密码,初始化演示数据库和滴。
测试和代码覆盖率
几乎所有的应用程序测试。我已经创建了测试Selenium IDE,这是一个非常方便的Firefox插件创建复杂的web应用程序测试。硒的主要优势是,它可以测试整个应用程序——从PHP服务器端HTML在客户端,它甚至可以测试JavaScript交互。管理工作没有JavaScript但更舒适的启用了JavaScript的一些特性,例如添加一个表中的字段不需要将页面发送到服务器。
Selenium IDE可以创建测试很容易。可以把记录按钮,像通常在浏览器中工作。记录测试之后可以修改如果你检查的一些特性的应用程序,那么为什么不来记录一个测试吗?
我很好奇有多少代码测试和我感兴趣的是管理的哪些部分需要更彻底的测试。它可以找到的代码覆盖率。我已经使用了Xdebug扩展,能够测量代码覆盖率。它非常适合运行单元测试,因为整个的代码覆盖率计算运行的测试。但web应用程序测试不同组合来自多个请求和代码覆盖率的计算分别为每个请求。解决方案很简单——我已经注册关闭功能保存代码覆盖一个会话和连接它与以前的结果。
管理的代码覆盖率是75%左右,这是令人满意的。相比较而言,代码覆盖率的PHP源代码是70%左右。我非常高兴当我测试存在的重构应用程序的某些部分。我很确定重构没有破坏任何东西当所有的测试已经通过了。
版本检查
有一个与项目消息和电子邮件订阅RSS提要的新版本。然而一些用户只需安装当前版本并���记它。出于这个原因,管理包含一个版本检查。
版本检查必须尽可能不引人注目的,因为有时运行管理的环境没有互联网连接或服务器可能是遥不可及的。所以检查当前版本的PHP代码不是一个选择,因为它是阻塞。此外,管理员可以禁用PHP的远程连接allow_url_fopen配置指令。因此,从JavaScript版本检查程序运行。一个简单的 <script src>阻碍(用户可以使用页面但仍在加载状态)是相同的图片。所以一个脚本加载 onload非阻塞事件。服务器部分非常简单:
<?php
header("Content-Type: text/javascript");
if (version_compare($_GET["version"], $VERSION) < 0) {
echo "document.getElementById('version').innerHTML = '$VERSION';\n";
}
echo "document.cookie = 'adminer_version=$VERSION';\n";
?>
如果当前版本是老那么脚本修改文档来显示新的版本号。客户端检查发送cookie与服务器通信只是偶尔。
设计
设计从Vlasta纽鲍尔我不是一个艺术家所以样式表来自自由平面设计师Ondřej Valka。设计是整个管理简单整洁,所以我喜欢它。然而其他用户更喜欢花哨的设计,所以他们创造了自己。设计可以很容易地集成到单个文件的编译但用户喜欢测试几个设计管理检查外部文件 adminer.css的存在。如果它确实存在,那么该脚本使用它而不是集成的CSS。
结论
这篇文章是关于管理架构,而不是对其特性。然而,它应该明确,管理支持所有MySQL特性从一个简单的表编辑,通过多个列外键、触发器、存储过程、出口、用户和流程管理MySQL 5.1事件和表分区。当然是一个普遍的非标准任务的SQL命令。
phpMyAdmin的管理不仅仅是一个紧凑的版本,它试图成为一个完全竞争选择MySQL管理和小足迹仅仅是一个愉快的奖金。
G. thinkphp5框架扩展redis类方法示例
本文实例讲述了thinkphp5框架扩展redis类方法。分享给大家供大家参考,具体如下:
笔者在开发时发现,thinkphp5的自带redis类方法,只有简单的读取缓存、写入缓存的基本方法,远不能满足我们业务的需求。redis本身支持五种数据类型,string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。redis的东西就不必再介绍了,接下来还是让我一起扩展thinkphp5的redis方法吧!
首先我们先找到缓存驱动类里的,handler()方法,这个方法是返回Redis类的实例化对象的。
这就是实例化对象,包括了options配置项、handler资源句柄、tag标签。实际上这里的handler是new
Redis()的对象实例。只要在外部拿到handler资源句柄,则可以对redis的操作进行扩展了。
在cache类里新增一个getHandler方法。
然后我们就可以在控制器调用了
打印的就是这个redis对象了
这里需要注意的是:
一个是调thinkphp5的redis的方法,就是这样用。
一个是如果你要调用原生的redis方法
基本的用法都讲完了。
接下来就愉快的开始扩展redis方法吧。
先找到这个类
这个类里并没有list的相关操作方法,那我们就来扩展list的相关方法。
这里的话,我就举一个例子了。
在控制器里去调用
这样就写入成功了。
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend
FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
您可能感兴趣的文章:针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例ThinkPHP行为扩展Behavior应用实例详解ThinkPHP应用模式扩展详解ThinkPHP框架设计及扩展详解ThinkPHP的Widget扩展实例老生常谈ThinkPHP中的行为扩展和插件(推荐)TP5(thinkPHP5)框架mongodb扩展安装及特殊操作示例thinkPHP下的widget扩展用法实例分析thinkPHP3.2.2框架行为扩展及demo示例ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】thinkphp5框架实现的自定义扩展类操作示例
H. thinkphp调用mysql存储过程 ,求助,具体点好吗,格式猜不出来…
thinkPHP的调用
$model = M("");
$data = $model -> query("CALL abcas(1,'[email protected]')");//调用存储过程
mp($data);//输出存储过程的返回值
存储过程部分
BEGIN -- 存储过程开始
START TRANSACTION; -- 开始事务
#Routine body goes here...
SET @x = 1; -- 定义变量,通过这个变量判断知道到的地方,事务成功@x返回大于0,否则返回0
update lzh_members set user_email = em where id = tid;
if row_count() > 0 then -- 判断语句是否执行成功
update lzh_members set user_type = 0 where id = tid;
if row_count() > 0 then
update lzh_members set user_type = 2 where id = tid;
if row_count() > 0 then
SET @x = 5;
select @x;
commit; -- 事务提交
ELSE
SET @x = 0;
select @x;
rollback; -- 事务回滚
end if;
ELSE
SET @x = 0;
select @x;
rollback; -- 事务回滚
end if;
ELSE
SET @x = 0;
select @x;
rollback; -- 事务回滚
end IF;
END --存储过程结束
I. thinkphp5.0中往表中添加多条记录,怎么获取到所有添加的ID
你好,用sql语句是不可能实现的,我们可以通过事务来实现,也就是说,SqlCommand的CmdText属性在一个方法当中可以赋多个SQL语句 SqlConnection sqlConnection = new SqlConnection(); ...初始化连接 // 开启事务 SqlTransaction sqlTransaction = sqlConnection.BeginTransaction(); // 将事务应用于Command SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.Transaction = sqlTransaction; sqlCommand.CmdText=第一个sql语句 sqlCommand.ExcuteNoneQuery(); sqlCommand.CmdText=第二个sql语句 sqlCommand.ExcuteNoneQuert(); try { // 利用sqlcommand进行数据操作 ... // 成功提交 sqlTransaction.Commit(); } catch(Exception ex) { // 出错回滚 sqlTransaction.Rollback(); } 如果在执行第二次SQL语句是出错了,那么就会到Catch异常中,执行回滚,那么第一次执行的也同样回滚了,所以必须2个都一行成功才往数据库中提交这里是用了2次SQL语句,如果你想用1个语句同时操控2个表的话,就要用到存储过程或者是触发器,存储过程和触发器
J. ThinkPHP 3.2 版本升级了哪些内容
[新增] 增加index连贯操作方法,用于数据集的强制索引操作
[新增] Model类增加using连贯操作用于多表操作
[新增] 增加strict连贯操作,用于设置数据写入和查询是否严格检查是否存在字段 默认情况下 不合法数据字段自动删除,如果设置了严格检查则会抛出异常。 例如: $model->strict(true)->add($data);
[新增] 增加fetchSql连贯操作
[新增] 添加yaml_parse_file()函数,解析yaml文件返回一个数组
[新增] 增加memcache Session驱动
[新增] 增加聚合模型,方便一对一的关联数据表操作
[新增] 新增TMPL_PATH常量支持 可以全局改版模板目录到模块目录之外
[新增] 增加Lite模式Db类,仅支持原生SQL操作
[新增] 数据库调试增加单独的配置参数 DB_DEBUG(如未设置依然取调试模式常量 APP_DEBUG)
[新增] 新增框架核心葡萄牙语言包
[新增] 增加COOKIE_SECURE和COOKIE_HTTPONLY配置参数
[新增] MySQL驱动增加ON DUPLICATE KEY UPDATE功能
[改进] Db类和数据库驱动类完全基于PDO重写
[改进] 添加全局过滤机制(默认关闭)
[改进] I函数增加修饰符功能和正则检测支持
[改进] 采用主从分布式数据库时,从数据库连接失败自动连接主服务器
[改进] 增加Model类对复合主键的支持
[改进] 改进Mongo模型和驱动类,使用更加方便
[改进] 改进session函数删除操作支持数组
[改进] 改进session函数对多维赋值的支持
[改进] 改进数据库字段缓存的文件标识 加上数据表前缀,避免不同前缀的表产生混淆
[改进] 针对数据库视图无主键的问题,使用默认id作为主键,与未开启DB_FIELDS_CACHE时行为一致
[改进] SAE模式惯例配置增加上传驱动设置
[改进] 改进参数绑定机制
[改进] 确保使用参数绑定后日志中生成sql语句的准确性
[改进] 模型类的setInc和setDec方法支持延迟写入,同时取消高级模型的相关方法
[改进] 日志写入的时候自动创建目录
[改进] 改进SQL缓存
[改进] 优化缓存队列功能
[改进] 路由的请求类型定义不区分大小写
[改进] 数据库驱动增加通用insertAll方法支持
[改进] 完善 url的验证正则
[改进] 单字母函数返回值类型修正以及一些拼写错误修正
[改进] 自动创建模型模块的父目录 直接调用\Think\Build::buildController和buildModel的情况下创建目录
[改进] 日志驱动增加自动目录创建支持
[改进] 自动生成的目录结构增加模块的缓存目录
[改进] mysql存储过程支持完善
[改进] Db类改进对多表更新和删除的支持,多表删除支持USING和JOIN操作
[改进] 改进parseLock的位置
[改进] Db类的update和delete方法增加多表操作的支持
[改进] 改进CURD操作 可以直接返回sql语句而不真正执行。
[改进] 插件控制器的命名空间可定义 不再局限于模块下面 增加 ADDON_PATH 用于定义插件目录 默认位于 应用目录下面的Addon
[改进] 改进静态缓存读取的有效判断对sae的支持
[改进] 日志目录分模块
[改进] 模型类的getField方法改进 支持在字段名中使用函数
[改进] 改进Db类的parseWhere方法
[改进] 改进模型的page和limit方法 改进分页类
[改进] 改进配置文件自动生成
[改进] 完善ShowPageTraceBehavior一处函数调用大小写规范
[改进] U函数支持多级控制器
[改进] send_http_status函数增加状态
[改进] 允许在项目中定义 APP 常量
[改进] 改进定义TMPL_PATH后的模板路径定义
[改进] Image类的imagick驱动save方法增加quality参数 用于图片质量设置,默认值为80
[改进] 改进Image类的JPEG图片生成质量
[改进] Gd库驱动类改进
[改进] 改进T函数对TMPL_PATH常量定义的支持
[改进] 改进I函数对path.0的支持
[改进] 改进关联模型
[改进] 改进dispatch_jump模板
[改进] 更新api模式支持配置文件的后缀定义
[改进] 改进Model类的getModelName方法对多层模型的支持
[改进] 改进cookie函数对secure和httponly的支持
[改进] 改进模板标签对命名空间的支持,写法 {$var|Org\Util\String::rand}
[改进] 改进数据表自动识别规则正则规则 可以正确识别带有数字的数据表
[改进] Model类的cache方法使用改进 cache(10) 等同于 cache(true, 10)
[修正] 修正ShowRuntime行为扩展
[修正] 修正Model类的add和addall方法中的_facade和_parseOptions的调用顺序问题
[修正] 修正使用数组方式动态指定表名后的BUG
[修正] 修正ChromShowPage行为扩展
[修正] 修正自定义公共模块路径时,加载公共模块类库失败
[修正] 修正参数绑定的一处判断
[修正] 解决PDO参数绑定后的获取最终SQL语句问题
[修正] 修正开启布局后show方法的问题
[修正] 解决调用trace()无法返回trace日志问题
[修正] 修复mongo出现错误输出的问题
[修正] 修正页面Trace的日志保存
[修正] 修正Model类的save方法
[修正] 修正令牌验证没有设置TOKEN_NAME的问题
[修正] 修复RestController中请求资源类型总是为html的bug
[修正] 修正Model类的getField方法的一处变量冲突问题
[修正] 修正Mongo驱动的page处理
[修正] 修正 extract方法 在分解变量的时候 可能导致变量被覆盖的问题
[修正] 修正Imagick类库
[修正] 修正页面trace插件开启PAGE_TRACE_SAVE后出错的问题
[修正] 修正controller方法 对不使用命名空间的支持
[修正] 修正Image类的save方法支持图片质量
[修正] 修正高级模型的乐观锁功能
[修正] 修正I函数通过FILTER_VALIDATE_EMAIL方式传入常量过滤的一处错误 并且过滤参数支持数组
[修正] 修正GIF类的架构函数
[修正] Cache类一处常量错误修正
[修正] 修改自动生成的配置文件支持CONF_EXT定义
[删除] 去掉多余的URL_404_REDIRECT配置参数
3.2.2 更新日志
[增加]配置文件增加yaml/json/xml/ini/自定义格式支持
[增加]增加load_config函数用于加载配置文件
[增加]增加CONF_EXT和CONF_PARSE常量,用于定义配置文件后缀及解析方法
[增加]模块增加状态配置文件
[增加]cookie函数增加httponly参数支持
[增加]增加COOKIE_HTTPONLY配置参数
[增加]增加插件的控制器访问支持
[增加]增加CONTROLLER_PATH常量用于定义控制器的命名空间路径
[增加]添加VAR_ADDON配置参数 用于设置默认的插件控制器命名空间变量
[增加]dispatcher类增加getSpace方法用于获取控制器的命名空间路径
[增加]I函数增加path和data类型变量的用法
[增加]引入composer支持(还需要完善)
[增加]xcahe和wincache驱动增加clear方法
[增加]自动生成机制支持多个模块的控制器和模型类的批量生成
[修正]修正上传类不能动态改变rootPath的BUG
[修正]修正RestController类的执行顺序
[修正]修正Model类的参数绑定的一处BUG
[修正]修正CronRun行为扩展一处错误
[修正]修正GIF类
[修正]修正rest控制器的encodeData方法
[修正]修正ViewModel可能因空格导致Order方法错误的bug
[修正]修正MongoModel类的写入数据的自增获取
[修正]修正第三方模板引擎驱动类
[修正]修正自动加载可能的一处导致重复加载的问题
[修正]修正__CONTROLLER__ 在URL不区分大小写情况下的获取
[修正]修正Route类中请求类型判断错误的bug
[修正]修正mysqli驱动的free方法
[改进]改进CronRun行为扩展
[改进]TOKEN_NAME 未设置时使用默认值__hash__
[改进]模类的_after_insert回调返回false后直接返回
[改进]Model类的save方法 如果data为空则不执行
[改进]Model类的delete方法 如果条件为空 则不执行删除操作
[改进]改进获取模块方法,支持驼峰法模块命名
[改进]改进模型的查询方法对表前缀的支持,使用当前模型设置的表前缀
[改进]视图模型的视图定义中的_table属性和关联模型中的relation_table 支持 __TABLE_NAME__定义方式
[改进]Model类的query和execute方法支持 __TABLE_NAME__定义方式
[改进]改进PDO驱动对pgsql字符转义的支持
[改进]改进Cookie函数对名称中包含“.”的支持
[改进]改进Sae上传驱动 增加file['url']信息存储
[改进]Page类添加默认的listRows值
[改进]改进IS_CGI常量的判断,支持fcgi
[改进]改进Db类的multiConnect方法 避免切换数据库的时候 配置数据被缓存
[改进]改进Db类对传入的参数 如果未设置数据编码,设置默认的编码为utf8
[改进]改进B方法支持对行为和扩展类的调用,需要传入完整的类名
[改进]改进验证码类 添加验证成功后是否重置session的参数 reset 默认为true
[改进]改进session和cookie函数,支持获取全部
[改进]调试模式下,错误的查询条件和非法数据写入会抛异常
[改进]改进Model类的getField方法
[调整]设置VIEW_PATH后参数后无需再定义模块子目录
[调整]为了避免和函数规则冲突,规则路由排除分隔符改为“-”
3.2.1 更新日志
[增加] 增加Rpc控制器支持
[增加] 添加原来的部分扩展类库
[增加] 增加RestController
[增加] 添加Boris行为扩展
[增加] 增加Boris第三方类库
[增加] 增加BIND_MODULE BIND_CONTROLLER BIND_ACTION 常量定义 用于在入口文件中绑定
[增加] 增加 mole_check 标签位
[增加] 增加buildLite行为 用于根据当前环境生成运行时lite文件 可以替换框架入口文件运行,提高效率
[增加] Think类增加getMap方法
[增加] C函数增加默认值功能 可以是获取配置参数的时候,当没有定义的时候获取传入的默认值
[增加] 增加Yar扩展支持
[增加] 添加jsonRPC扩展
[增加] 增加Api应用模式扩展和Mode扩展目录
[增加] 添加第三方模板引擎
[增加] 支持操作方法绑定到类
[增加] 增加Think\Auth类
[增加] 增加Hprose控制器和第三方类库包
[增加] 增加CONF_PATH常量定义
[增加] 应用和模块增加自动读取当前应用模式配置文件的功能
[修正] 修正正则路由的一个函数处理的bug
[修正] 修正模板引擎类的一处bug
[修正] 修正L函数的一处错误
[修正] 修正驱动类一处错误
[修正] 修正MongoModel一处错误
[修正] 修正Verify类对多个验证码同一个页面显示的bug
[修正] 修正找不到Log类的错误
[修正] 修正模型类的一处bug
[修正] 修正session函数一处警告错误
[修正] 修正U函数的一处警告错误
[修正] 修正compile函数的一处bug
[修正] 修正验证码的背景图片功能
[修正] Think\Image类常量修正
[修正] 修正Image类的架构方法错误
[修正] 修正Mongodb数据库驱动
[修正] 修正trace方法在CLI下面中文输出乱码
[修正] 修正控制器类当调用不存在的方法的报错
[改进] 改进操作方法的名称识别
[改进] 改进数据库驱动 支持不同的链接指定不同的charset参数
[改进] 改进get_client_ip函数
[改进] 改进L函数支持传入变量
[改进] 改进PDO驱动 当版本低于PHP5.3.6的时候禁用模拟预处理语句
[改进] 调整dispatcher类的模块、控制器和操作名获取方法
[改进] 页面trace扩展CLI下面不执行
[改进] 优化trace方法
[改进] 解决因配置文件加载顺序错误导致在SAE环境中运行出错的问题
[改进] 改进Storage类
[改进] 优化load_ext_file函数
[改进] Behavior类简化(下一版本可能会废弃)
[改进] 核心行为类简化取消对Behavior的继承
[改进] C函数并入系统函数库文件
[改进] union连贯操作方法 字符串用法支持 TABLE_NAME 方式替换
[改进] 改进Jion和table连贯操作方法,当使用TABLE_NAME解析的时候支持动态指定的表前缀
[改进] 优化U函数
[改进] 路由类改进
[改进] 改进路由的闭包支持 闭包函数如果返回布尔值 则继续执行后续 否则中止执行
[改进] 应用模式定义文件移动到MODE_PATH目录下面 便于管理
[改进] 默认URL不区分大小写
[改进] 改进路由闭包定义
[改进] 改进路由的额外参数传入
[改进] 重写查询缓存功能
[改进] 关联模型修改
[改进] Image类水印生成支持透明度参数
[改进] 改进Image驱动
[改进] 验证码类改进
[改进] 改进上传类及驱动
[改进] session驱动类接口改进 无需定义execute方法
[改进] 静态缓存仅在get请求下生效
[改进] 改进静态缓存行为
[改进] 语言文件更新
[改进] Storage类的SAE驱动更新
[改进] 英文语言包修正
[改进] 改进PDO驱动
[改进] 默认生成的测试控制器规范改进
[删除] 废除APP_FILE_CASE参数配置 改为Windows下调试模式自动开启区分大小写