tp剩余未验证内容

  1. new Image(宽度,高度) $(image).attr('src', ...).load(function(){....})
    load表示浏览器从服务器下载(装载)对象完成, 这个load方法很重要, 能够由浏览器自动判断一个对象, 或者一个节点是否装载、下载完成了javascript

  2. new Image的时候, 内存缓存中 的图像 如何装载进来, 要加入到文档的某个节点中来才能 生根,才能显示??php

  3. 使用 ajax事件:浏览器系统会自动检查 ajax的(全局)开始和结束, 以及每一次ajax请求的开始和结束,要把这些ajax事件注册到你须要显示和隐藏的节点上,这个一般是div或者下面的 图片?css

显示图片的jquery方法 一般是用show, 而隐藏的时候,须要选择恰当的方法了:html

  • 能够用hide
  • 可是, 若是你以为hide消失得太快的话, 就要用fadeout或者用 animate的方式。 animate更灵活,它支持两个参数,一个是效果的js对象, 另外一个是过渡的时间,多少毫秒(在jquery的效果函数中, 0 表示立刻显示或隐藏)前端

  • 也能够用 一个非标准的css样式:opacity: 透明度,等于0表示隐藏, 1 表示显示, 这个非标准的css样式,能够由jquery来封装隐藏底层差别java

  • jquery能够缓存从服务器交互取得的数据, 这样之后若是须要再次使用这些数据的时候,就直接用本地缓存,而没必要再次从服务器上去取数据,这样反应会更快。 使用的函数是 data. data('缓存数据的名称',缓存数据内容data) 以及取数据的方法是:data(‘缓存名称');mysql

  1. 要让图片和文字同一行显示(并且高度一致), 对图片使用css的float样式??jquery

  2. php缓存技术, (csdn thinkphp缓存技术 think2me)web

  3. tp以及 普通浏览器是如何判断 一个请求是不是 ajax请求的?ajax

:是经过 服务器变量 $_SERVER 来判断的:

  1. tp是如何判断ajax提交的?
    是在文件Library/Think/App.class.php中定义的,方法是经过
  • 判断 $_SERVER变量中是否有 'HTTP_X_REQUESTED_WITH' 这个元素, 且这个元素值等于'xmlhttprequest'
  • 或者第二种方法是, 判断 $_POST或 $_GET变量中, 是否有 'ajax'这个元素.其中的ajax索引名称,是由 convention.php中的var_ajax_submit来配置的.

即:

define('IS_AJAX', 
(
(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')|| !empty(($_POST[C('VAR_AJAX_SUBMIT')])) || !empty(($_GET[C('VAR_AJAX_SUBMIT')]))

)?true:false

);
  1. 关于tp的ajax请求处理函数?
  • 首先, 要判断 当前请求是不是 ajax请求,即 if(!IS_AJAX) {$this->error('错误提示'); }
  • 而后, 才是 对 ajax 提交的处理,一般步骤是: 第一, 逻辑执行, 准备好ajax 返回的数据data: 第二, data一般是本身 组装的数组, 这个数组 一般应该包含(固然具体是由你本身来决定的) 执行状态status (根据不一样的情形返回ok 或false), 具体的处理值; 第三, 调用 控制器的 ajaxReturn方法: $this -> ajaxReturn($data);

  • 这里返回的是数组, 在前端的时候, 就已经被 jquery的 post或 get请求转换成json 格式的 js对象了, 就能够直接使用 js对象的点语法 或 中括号语法 了 ???

  1. 反射类的价值. tp框架执行过程和反射调用?

mysqli中的i是improvement改进的意思

mysqli是用面向对象的方法写的, 而mysql是用c面向过程写的. 因此, mysql中的函数都有前缀mysql_, 而mysqli中的对象中的成员方法则没有这个前缀.
mysqli使用的是 持久性性 链接

一个简单的例子:

$db = new mysqli('localhost', 'root', '123', 'testdb');
$res = $db -> query('select * from tablename');
$row = $res -> fetch_assoc();

echo $row['id'];

注意, mysqli中的 fetch_assoc 只是取得 结果集的 第一行数据 做为 一个 一维数组.

tp中的 ajaxReturn的用法, 要了解这个函数 只须要看一看它的写法就行了:

protected function ajaxReturn($data,$type='',$json_option=0) {
        if(empty($type)) $type  =   C('DEFAULT_AJAX_RETURN');
        switch (strtoupper($type)){
            case 'JSON' :
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                exit(json_encode($data,$json_option));

首先, 它是一个 protected 方法, 只能在控制器的 内部被调用;
其次, 要注意 这个函数 没有 返回值! 它的目的, 只是对要 经过ajax返回 的数据 $data 进行 一次 "格式转换" 而已. 其实, 你要处理客户端的ajax请求, 彻底 能够 不用到 这个 函数. 由于, 在 query的 $.get或 $.post的参数中, 你指定了 处理ajax请求的 服务器端方法了, 好比ajaxHandler, 那么 你直接在控制器的 ajaxHandler方法中 进行业务处理, 组装好 要返回的 数据(一般是数组$data), 而后你直接echo 这个数据就行了, 这个数据 就能够在 前端被 获取到. 或者: 在 echo以前, 你本身手动的 调用一次 json_encode, 将数组转换为 json形式/格式 的字符串string.

使用 jsonReturn只是 对 ajaxHandler中 要返回的数组 $data 进行了一次 "格式"包装而已 : 首先在头部进行了声明:header('content-type: application/json; charset=utf8'); 而后 exit(json_encode($data, $json_option); 若是是 其余非json格式, 则作相应的其余处理

json_encode($value, $option); 其中的option是常量, 主要是 指示 要转换的数据$value中 的 一些特殊符号 该如何处理. json_encode返回值是一个 string 或false.

注意 $.get或 $.post 接收到 json格式 返回的数据, 已经就是 一个 js对象了.

js对象 属性的 调用方法 !important

js的对象, 能够用 大括号 来表示, 所以, 这个大括号{ }能够看作是一个 集合! 能够将js对象, 能够看做是 不少个 属性的 集合; 也能够看作是 多个 key: value 键值对的 集合.
因此, js的对象 有多种 aliases 别名: 在用法和理解上, 就等同于 关联数组, 字典, 映射, 哈希表, 查询表等等, 均可以.

因此, js的对象 的属性, 在 引用方法上, 就有 两种方法,
一种是用 点号(点符号)来引用. 一种是用 中括号标记 来引用

可是要注意的是, 若是 使用 使用点号来引用的话, 后面的 属性名 必须是 一个 合法的 javascript标记: 若是不是合法的js标记,好比 是以"空格, 连字符- , 或数字 开头的"非标准的 javascript标记, 则只能使用 关联数组 的方式: 即用中括号的方式 来 引用.

因此 有时候, 咱们可能不知道, 不肯定 属性名是不是 合法的js标记, 推荐 从此 无论在何时, 都使用 中括号标记 来 引用 js对象的属性. 由于在中括号中的 属性名, 无论原来是什么 数字/空格/仍是对象等等, 都 会被 自动转换成 合法的js标记 字符串! 是字符串.

js对象的属性和方法 其实 并无 明显的区别, 方法在这里 只是 "能够调用"的属性 而已.

另外: js中的 eval虽然功能强大, 可是 仍是建议 "在任什么时候候都应该 避免使用"这是 MDN上 权威 站点上的原话. 

解答一个 长期的 很重大的 一个疑点: 在模板html文件中的任何地方, 包括head, title甚至是 script的脚本中, 都是 可使用 控制器传递 过来的 模板变量 和 模板函数(好比 U函数)的!

  • 可是, 要注意, 在模板中使用的 这些 变量 和函数 转换后的 内容, 若是原来的内容 是 "字符串", 则 在模板中 转化后, 是不会带 引号的! 这个在某些 场合 是会出错的. 特别是 在 script 脚本中, 使用 这些模板变量和模板函数的时候, 更容易 出错!
  • 因此, 若是确信 你要 用的是一个 字符串, 则必定要在 这些模板变量 或 模板函数 两边 加上 引号:
<script>
    alert({$ok});   //这里 不加引号的话, 不会弹出, 由于会报错:  {$ok} 转换后的 变量... undefined.
    alert({:U()});  // 这里必须加上 引号, 不然会 报错: 正则表达式...
</script>

php这种语言 自己提供了 json_encode 和 json_decode "全局函数", 将 一个 php对象 转换成 一个 json格式/形式 的 字符串, 或将 一个 json格式/形式 的 字符串 转化成一个 php的对象.

若是是输入 password 字段的 表单, 若是你的应用 很是重要,好比有资金 交易的话, 就必须部署 https协议, 不然 : password fields present on an insecure (http://) page. This is a security risk that allows user login credentials to be stolen.

 如何部署 https?


前端框架和 jquery就使用 bootstrap. 由于bs提供了统一的界面和组件ui. 并且bs正好又是创建在 jquery上的. 因此, 就这么定了, js框架用jq, ui框架用bootstrap

实做: 用cookie 模拟网站登录, 显式权限, 跳转, 退出, 时间设置为一周, 多个页面跟踪用户的cookie.

php中跳转, 除了用框架的 redirect, success, error等 "封装"方法, 还可使用 header方法: 即 header('location: jumpto.php'); 要注意, 只要发生 跳转后, 执行header中的 跳转后, 其后面的代码就不会再继续执行了, 相似于 die, exit等.

在原生的 php链接/登录数据库, 判断是否成功, 方法是 : 判断 sql 查询 语句执行结果 $result的 属性 num_rows 是否大于等于1.
其中 mysqli 的 fetch_assoc是获取结果集的第一行数据.

  • 在cookie中, 判断是不是有效的 登陆用户, 若是只是返回的id, 那么, 保持的cookie值 时, 就能够 直接 从post去获取. 而不是再去数据库查询获得.由于 post中就已经存储了用户信息了.

网站登陆是 用 "登陆" login, logout, 注册是: sign(sign up) 跟 "登录"没有任何关系.

若是是本身写的 站点页面, 没有使用框架, 那么 公共的 通用的内容, 就放在 common.inc.php文件中, 使用include机制 来包含. 好比数据库链接的代码.

在本身写的页面, 判断 要登陆的用户 在后台数据库中 是否存在, 就只是查询 用户的名称(where子句中) 所对应的id是否 存在就行了. 没必要查询更多的额外字段, 好比: select id from user_table where name= name_in_post;

html的表格, 也有 caption 属性, 相似于 html的title 标签.

必定要写 img标签的 alt属性(这个是在图片 不能显示/被禁用, 未加载进来/网速慢时 显示的 关于图片自己的描述文字信息) , 而img的 title属性 则是 提供 关于这个图片的 其余的 辅助性的 /说明用途等 的文字信息, 即: alt和 title的 语义 是不一样的.

在php代码中, 即便是 原生的 php代码中, 你能够将 变量 $var放在 大括号中, 即{$var}, 相似于 tp的写法. !注意不能是 将 大括号放在 $ 后, 好比: ${var}这样是不行的, 这个是 bash的写法. ! 可是 必须将{$var} 放在引号中, 不然会出错. 即必须是 "{$var}" 并且, 当 使用 大括号后, 里面的内容就根引号外面的内容 隔离了. 即这个时候, 你在 里面任意的使用 引号, 都是能够的, 都不会引发 引号的嵌套问题:
"{$post["name"]}" 的写法是没有问题的.

在设计mysql数据库表/中的 用户是否具备 某种 权限时, 可使用 数字 0/1 来表示 "没有/有"对应的权限就行了. 这时候,这个数据类型能够设为 tinyint. 默认的 tinyint是 tinyint(4) 表示显示时, 最多显示4位数字.

mariadb的 整数类型, 有5种: tinyint, smallint , mediumint, int, bigint(在写法上 ,都是小写, 中间没有分隔, 是一个单词). 大小依次是 1个字节(0-255), 2个字节, 3个字节, 4个字节和 8个字节.

mariadb的zerofill?

zerofill是一种 字段的 属性描述specification, 如同 unsigned. 它 而不是系统的 全局变量, 因此 你用 `show variables like '%zerofill%' 会显示 empty.

  • 好比 一个字段 用 zerofill描述: pay_type tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000' COMMENT '支付方式:1卷皮系统 2支付宝 3银联 4财付通 ……',

  • 这是一个 较好的例子, 在实际生产系统中, 定义字段的时候, 要写完整, 好比: field_name tinyint(4) unsigned zerofill/字段数据类型属性 not null/是否为空 default '0000' comment '...',

  • 数字类型括号中的数字, 根varchar(10)中的数字 其做用是不一样的! 前者只是表示 显示 宽度. 跟数据的存储个数不要紧. 后者就真的表示 容许存储的最大字符数. 注意 在mysql中 , 字符是不分("高低贵贱")的:即 一个中文字符, 英文字母, 数字, 都表示的是mysql中的 一个字符. 即varchar(10)既能够存放10个英文字母, 也能够存放10个中文汉字.

  • 要注意, 若是你插入的数据中, varchar(10)字段的内容 超过了 10, 它会自动 给你 截断的 . 即最多给你保留 10 个 mysql字符.

mariadb 修改列, 有三种状况, 使用不一样的谓词: 1. alter column column_name ... 这个是用来设置或删除默认值的; 2. change column old_name new_col_name column_definition 这个change是用来修改 列的名称的; 3. modify column col_name col_definition...


关于session和cookie?

  • 服务器向客户端发送信息,依次是 状态信息,头信息,实际内容,所以,在setcookie ,header等函数以前, 不能有实际的内容输出(由于这时候的输出内容是不能被识别的,而且会引发头部信息的错误。

  • 你能够查看cookie文本文件, 固然就能够修改这个文件的内容. 每一个cookie 是$_COOKIE的一个元素.
    同一个网站的全部cookie都是放在同一个文本文件中的. 同时,你也能够设置单独的 一个cookie为一个数组.
    当所有cookie过时后(删除), 该cookie文件就 不存在了.

  • cookie更持久, 但容易被修改, 能够经过加密的方式加强cookie的安全性
    cookie能够看作是商家给顾客发放的 会员卡, 本身保持, 而后购物时本身主动出示会员卡.

  • session更安全保存在服务器端. 但有效时间短, 一次访问网站页面关闭后,就失效. 可是session的id是保存在客户端的cookie中的.

  • 会话控制,是在多个页面中跟踪标记同一个用户, 其中的session和cookie是网站开发中不可或缺的。
    网站请求的http机制, 是无状态的, 就是指 即便 是 同一个用户 访问同一个网站的 两个 页面(即便是被看作超连接跳转)(甚至是同一个页面的刷新), 会被看作是 两个独立的请求,第一个页面的信息, 请求变量, 设置等不会被带到 第二个页面(或者刷新后的页面), 所以就须要一种信息保持机制, 就像粘贴板, 记事本同样, 当用户第一次登陆时,把这些登陆信息 记下来, 而后 当这个用户 在这个网站中 的任意一个页面时, 这些用户信息均可以被公共的使用.

  • 保持信息, 除了用cookie和session外, 还能用其余手段吗? 不能! 由于: 1. get和post只能在两个页面之间 传递数据, 而 2. 文件或数据库的保持或持久化则是全部 用户均可以被使用. 显然不行. 登陆等信息 只能被 同一个用户使用.

  • session要手动的启动, 可是 tp已经在框架启动时, 帮你启动了.

  • 要注意的是, cookie不是实时生效的, 第一次写入后, 要等到第二次访问时才能生效. 所以,要想实时生效, 能够在 form表单 提交的处理php文件中, 输出一段script, 在提交时就自动提早刷新一次: echo '<script> window.location.href = "..." </script>' (即刷新不仅是refresh, 有不少方法均可以实现).

什么事get方式访问, 什么是post?

凡是经过 地址栏输入url访问, 或者是 经过 超连接a的 get传参跳转的, 都是get访问/get请求; 只有经过表单 post提交的,才是post请求.(固然form也能够经过get请求传递数据, 可是通常不会).


关于php的鼠标/按钮操做, 不要只固定一种思路,觉得只有 button, 只有onclick, 还有新的思惟方式, 就是使用 超连接! 经过超连接a的操做, 有一个好处是, 能够 在php文件中, 经过 $_GET来获取数据并进行逻辑处理.

  • 也就是说,若是你想 在 前端, 经过js 来处理动做,就可使用 button, 使用onclick
  • 可是, 若是你想在 后台的 php文件中, 获取数据并处理的话, 就使用 a超连接...

  • 当表单所在页面 被刷新的时候, 表单就会被从新载入(即从新从服务器上下载该页面/或者从缓存加载). 这时候, 原来填写的内容就会消失了, 回到空的初始页面状态.

  • 页面的刷新(从新载入), 除了按f5外, 还有表单的再次提交, js脚本的/ php的header函数: location.href

若是表单为空提交, post对应元素 是空 仍是 isset???


form表单的action是什么意思?

是动做, 是操做的意思. 即: 当表单提交时, 将执行什么操做, 这个操做, 正好是 mvc框架中 action操做的意思,
注意, 若是action="" 就表示提交到当前页面进行处理. 在不少demo中就这样

tp框架自动 已经对session进行了启动, 在convention.php中, 有 SESSION_AUTO_START => true, 因此能够在 文件中直接使用session的函数了.
session 有缓存的, 设置, 获取等函数,
要删除某一个session, 即session数组中的某一个元素, 使用 session('name', null);
若是要删除全部的session 元素, 直接用 session(null)
要删除session文件自己, 销毁session这个数据, 用session(destroy);

tp模板中的 表单action, 图片src, 连接href等的地址, 既能够用 U函数来写, 也能够直接用 "/模块/控制器/操做" 的方式来写? 要注意的是, 地址必须从 模块开始写起, 模块/控制器是不能省略 的, 模块前面的 斜杠/ 是能够省略的. 由于默认的使用pathinfo地址模式, 用斜杠的方式 就能自动解析到跳转地址的.

isset是判断变量是否设置过, 在全部声明或定义变量的语句中, 只有 明确的说 $var=null时 isset返回false, 其余都会返回true.
可是isset只能接收 原始的 简单类型的变量, 不能接收 一个函数的返回值来 判断.

  • use ... on 把...用在 什么上面. 好比: cannot use isset() on the result of a function call.
  • 所以, 要判断一个函数的返回值 是不是 isset, 是不能用 isset(func())的, 要用 null !== func() instead. 好比: echo (isset(I('post.name')))?'设置了name':'没有设置'; 这样是错误的, 应该: echo (null!== I('post.name'):'设置':'没有设置' 或者直接用 简单变量,不要用 I函数. echo isset($_POST['name'])? '设置': '没有设置';

  • **特别注意, 判断一个变量是否设置, 最好不要用I函数, 由于 I函数有 反作用, 它会设置 一个默认值, 因此即便在 原来的 $_Post变量中没有判断的索引变量, 也老是返回true. 因此 要用 $_POST['flag'] 自己原生的 数组来判断. **

在前台页面布局的时候, 使用 frameset和 include的区别是: 前者的各个页面之间是 分离的,分隔的, 独立的; 因此frameset的各个页面中, 能够对应的 具备/ 能够执行/ 各自的控制器和操做, 在本身的操做方法中传递参数, 是能够收到的, 而include被包含时, 被包含的文件虽然是做为一个独立的文件存在, 可是并不 强制 要求 被包含的文件 具备 对应的 控制器和操做, 所以, 在被included的文件中,要使用 后台变量/模板变量如{$include} 的话, 必须由主文件中(即当前控制器的当前操做中) 给模板变量 赋值.


关于tp框架中, include标签的使用

  • include的属性file, 能够有两种指定方法,一是使用 模板表达式 Home@Public(公共控制器)/header(操做), 可是这个模板表达式中的控制器和操做也只是一种形式(至关于目录结构)并不强制要求真的有 那样的控制器和操做; 另外一种方式是使用 模板文件 (要从./Application...开始指定绝对路径)

  • 再就是 被包含的模板文件无论用 模板表达式仍是 模板文件的方式, 都必须是 *.html结尾的文件, 多是在 "模板引擎设置" 中进行了限定TMPL_template_suffix => '.html' // 默认的模板文件后缀 也就是说, 只有 .html 才被认为是模板文件, 才能被 include所用.

  • 还能够由 include标签中, 给被包含文件传参, 要注意这个传参,不是 控制器/操做的传递变量, 在被包含文件中, 使用 中括号 方式 引用include的传参: [这里是include的传参]

get_defined_constants是php语言自己提供的一个全局函数, 是: 将分组显示 系统中定义的全部常量 : 包括php核心定义的常量, php扩展定义的常量 和 用户本身的常量, 好比tp框架定义的常量就放在 'user'分类中. 这个函数有一个 可选参数: categorize? 表示是否对全部的常量进行分类, 默认是false, 因此, 要分类的话, 必须显式的传递 true参数: get_defined_constants(true);

tp模板中 若是要将 模板常量和字符串 相链接/ 拼接, 怎么写??


div和table从语义上来说: div是内容分块; table是表格, 在语义上就是用来 表达 二维数据的
在显示方法上的区别: div是即载即显示, 而table是加载彻底后 才显示.

在布局上, 先期使用table, 后来使用 table+div(因此 会看到不少 在 表格的列 td中使用 div的), 后来彻底使用div.
div+css虽然灵活, 可是也会在一些结构上引发 困惑和带来复杂度... 而css的兼容性并不太好. 并且外部引用css文件, 对后台web服务器的压力很大??
因此: 若是是一个中小型的 web应用, (或是主要给一个公司使用的)网站, 使用table来布局是合适的, 并且开发效率要快得多. 或者是 使用 table+div(表格+div结合css)是合适的.

使用frameset时的几个注意点:

  • frame自己是关闭标签, 因此 不要用 <frame...> </frame>的方式
  • 嵌套frameset时, 不要将frameset放在frame中
  • 注意frame, 和 frameset标签 各自的 属性有哪些, 不要 搞混淆了. 总之, frameset是定义 框架和框架之间的属性. 而frame 是定义 本框架内的属性 好比: marginwidth, marginheight, src, name等是 用来定义frame帧自己的属性
  • 其中,frame的属性 src和name是 必须的属性, name是用来 连接的, 即便不用也要写.
  • 最容易出错的地方, (对我来讲)就是 rows, cols中的分隔 要用逗号隔开, 即: row="300, * "不能省略逗号, 不然框架分割会无效
  • frameborder=0/1 只能设置为0或1, 表示是否显示或不显示边框. bordercolor设置边框颜色, 可是通常都不会去设置这些属性.
<frameset rows="100, *" frameborder="1" framespacing="0" >
    <frame  src="header.php" />
    <frameset cols="140, *" >
        <frame  src="navi.php" name="navi" scrolling="no" noresize="noresize" >
        <frame  src="content.php" name="content" marginwidth="50" marginheight="10" scrolling="yes" noresize="noresize" />
    </frameset>
</frameset>

在导航页面中
<body>
   <div>导航</div>

    <ul>
        <li><a href="Home/Index/dz" target="content">dz</a></li>  // 这里每一个连接项, 连接的是各自对应的文件内容.
        <li><a href="Home/Index/jz" target="content">jz</a></li>  // 最重要的是, 这里的target正是右边主div内容框架的name.
        <li><a href="Home/Index/xq" target="content">xq</a></li>
        <li><a href="Home/Index/xx" target="content">xx</a></li>
    </ul>
</body>

模板中tmpl的常量, 已经被behavior行为替换了, 替换对应 的控制器等常量了, 因此在模板中使用这些常量时, (并且模板中, 只能使用 模板常量, 而不能使用 只在php页面中使用的常量), 不能再用 $Think.const....__常量名__ 来输出了. 这样就多了, 重复了....

控制浏览器能够缩放的最小宽度和高度的js代码:

window.onresize=function(){
if(document.body.clientHeight<700){
alert('禁止缩放');
window.resizeTo(document.body.clientHeight, 300);
}
} 宽度的设置同理.

??jquery实现, 根据浏览器窗口大小, 自动缩放图片的方法?

浏览器自己就有一个 最大/最小的缩放值 (吗?)

php的魔术方法, 能够实如今类的外部 访问它的私有属性, 是 走 __get($name); 若是在 类实例化的时候, 设置了私有属性的值, 是走的 __set魔术方法.

分页类, 不一样的分页类, 在基本原理, 使用方法上都是 大同小异的, 在 最下面的 分页字符串 彻底能够 自定义 符合本身须要的 更复杂的html代码..

为何要使用框架, 框架的 开发速度更快, 你只须要专一于 业务/逻辑的实现, 其余基础结构已经帮你写好了(即便你本身从0开始写, 也差很少就是框架的这些内容, 可是还不必定写得这么好). 并且框架 更稳定/更可靠(就像给你作的厂房 电路不会扯拐, 管道不会堵塞, 不会时不时的停水停电), 更安全(病毒是由程序自动扫描你的代码) 一般不会引发厂房崩塌, 漏水漏电.

如今开发网站的分辨率通常设置为多少?
如今大多数人的电脑分辨率都不会小于1024768, (实际上更多的宽屏设置为 1600900) 因此网页的宽度设置为 1000, 1100 都是能够的, 而后两端由margin自动留白.

  1. 网页设计的宽度最好是固定值,好比1100px、1000px, 而高度自适应(不规定高度就好)。 这样能保证页面在不一样设备分辨率下都能正常

表现。 最好是加上 min-width的css属性, 能保证页面正常。

注意div的width设为 50%, 不是指显示屏幕的50%, 而是指当前浏览器 窗口的 宽度的50%。

对于通常的前台页面, 一般的设计是: 头部或底部的宽度是100%满屏的, 中间内容是固定宽度、居中 的。

  1. Think\Upload 类 upload方法,返回值是一个 二维数组, 相似于 mysql查询返回的结果集。 这个二维数组的每个 元素, 包含的是关

于 一个 上传文件的相关信息,又是一个数组。 而 uploadOne 是只上传一个文件, 所以返回的结果 就只是 关于这一个 上传文件的相关信

息 它就是一个一维数组。
事实上, 返回的信息, $file确实就是 对 原生的 超全局变量 $_FILES数组 的一个封装。

  1. tp容许在输出变量的时候, 对变量进行处理,好比我要输出 {$create_time} 的值, 可是我并不想直接输出, 我还想作一下 “输出时间

的格式换”处理, 所以 若是要在后台作这些 “样式”的处理并不科学, 后台只是输出原始数据, 至于具体的 表现形式,好比ymd, Y_M/d

等等, 这个仍是交给前端 模板去处理。 因此 tp为了知足这样的目的, 提供了模板变量的函数处理,默认值处理等等,好比:
{$create_time|date='Y-m-d', ###}

  1. tp中的NOW_TIME常量, 是在 Library\Think\App.class.php 中定义的, 是经过 $_SERVER['REQUEST_TIME'] 来定义的, 即当前脚本的请

求时刻, 差很少就是当前脚本的执行时刻。

所谓tp的命名规范, 只是说知足两点: 一是类的存放位置 要跟 命名空间namespace的声明一致, 二是, 类的结束名字(扩展名)必

须是 .class.php 其余不要求, 好比 类是否要继承自 Controller等都不是命名规范中所要求的。


  1. 配置中的filter全都是 针对 I 方法进行的设置, 过滤函数有 null, default_filter, var_filter.

  2. U 方法和I方法是tp中的核心方法。 U方法的定义规则是:
    U('地址表达式', [传递的参数'], [伪静态后缀'], ['是否显示域名']
    伪静态的后缀, 能够本身输入设置,好比是html, tpl等, 也能够是 false/true. 表示是否使用伪静态后缀
    参数的传递, 有三种方式, 一是在地址表达式中一并写, 二是单独用字符串传递, 三是用数组进行传递. 一般推荐使用的是第三种方式, 将参

数放在 单独的数组中.

**另外, 使用U方法 生成的地址是根据 当前的url模式 自适应生成的, 即在不一样的url模式下, U方法地址均可以生成, 可是生成的地址字符串

却不同.**

I函数是为了获取 传递过来的参数, 因此会有一个默认值, 即当传递过来的参数为空的时候的默认值, 再就是一个过滤函数.

相关文章
相关标签/搜索