1. new Image(宽度,高度) $(image).attr('src', ...).load(function(){....})

    load表示浏览器从服务器下载(装载)对象完成, 这个load方法很重要, 可以由浏览器自动判断一个对象, 或者一个节点是否装载、下载完成了

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

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

显示图片的jquery方法 通常是用show, 而隐藏的时候,需要选择恰当的方法了:

  • 可以用hide

  • 但是, 如果你觉得hide消失得太快的话, 就要用fadeout或者用 animate的方式。 animate更灵活,它支持两个参数,一个是效果的js对象, 另一个是过渡的时间,多少毫秒(在jquery的效果函数中, 0 表示马上显示或隐藏)

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

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

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

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

  3. tp以及 普通浏览器是如何判断 一个请求是否是 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函数是为了获取 传递过来的参数, 所以会有一个默认值, 即当传递过来的参数为空的时候的默认值, 再就是一个过滤函数.

tp剩余未验证内容的更多相关文章

  1. tp剩余未验证内容-8

    模型类的自动验证? 分为自动验证, 和 动态验证(手工验证), 前者的验证规则是定义在模型类中的, 所以要自己创建 扩展的/继承的模型类, 同时用 D方法实例化模型类 而动态验证是 先调用 valid ...

  2. tp剩余未验证内容-7

    bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...

  3. tp剩余未验证内容-6

    杂项 系统中的电感线圈元件, 虽然不消耗电能, 但是会 占用系统的容量(相当于占用资源但是不做事), 会使系统 的发电量的使用效率降低, 线路损耗增大, 发出同样有功用电量所需的设备容量扩大 将感性元 ...

  4. tp剩余未验证内容-4

    关于pop-up被blocked的问题 首先 这个pop-up的功能叫 popup blocker , 它是浏览器(包括ff, chrome等) 自身 所内置 的一个功能, 不是 安装的外部 插件/或 ...

  5. tp剩余未验证内容-3

    为什么有时候会 出现 "上传文件保存错误"? public function save($file, $replace=true){ /* 移动文件 */ if (!move_up ...

  6. tp剩余未验证内容-2

    如何设置一个 "资源" (文件/图片/zip/视频等)在点击时, 自动开始下载? 通常只要在这些地方, 设置 一个链接a, 让href等于这个资源就行了. 这样当点击这个资源时, ...

  7. tp剩余未验证内容-5

    经过实践, ie678是不能正确显示解析bs的,所以要用ff和chrome浏览器. page-header类是有特殊样式的 在标题下有一条浅色的细线条,源代码中有: border-bottom: 1p ...

  8. tp未验证内容-9

    在tp的数据库配置中, convention.php中所有的选项都没有设置,要自己在Home/conf/config.php中自己设置, 注意几个地方,一是数据库的名字是: db_name,不是db_ ...

  9. angularJs按需加载代码(未验证)

    一网友写的AngularJs按需加载代码,但未验证,放着备用.   application.config(               function($routeProvider) {       ...

随机推荐

  1. C#6.0中10大新特性的应用和总结

    微软发布C#6.0.VS2015等系列产品也有一段时间了,但是网上的教程却不多,这里真对C#6.0给大家做了一些示例,分享给大家.   微软于2015年7月21日发布了Visual Studio 20 ...

  2. 配置hdfs之后发现9000端口未被监听[玄学]

    1. 按照apache的官网的文档配置hdfs 2. 在 core-site.xml 中配置了 fs.defaultFS 的值为 hdfs://0.0.0.0:9000 3. 执行 start-dfs ...

  3. HTML5特性&&canvas

    1.HTML5是由W3C(万维网联盟,专注于XHTML 2.0)和WHATWG(专注于web表单和应用程序)共同合作的结果,2014年10月完成标准制定! 主要设计目的:为了在移动设备上支持多媒体. ...

  4. Linux 进程间通讯

    一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  5. ReactiveCocoa(I)

    ReactiveCocoa常见类 1. RAC中最核心的类RACSiganl: RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据 解析: 信号类 ...

  6. 虚拟机连不上网 Xshell连不上虚拟机

    以centos7 为例 1,确定network connection 为NAT 2, 打开网络连接中心 Control Panel\Network and Internet\Network Conne ...

  7. python csv文件转换成xml, 构建新xml文件

    csv文件 code from xml.etree.ElementTree import Element,ElementTree,tostring import json,csv def csvtox ...

  8. python os.path.expanduser()

    # Expand the user's home directory

  9. python安装cv2

    pip install opencv-python

  10. 【转】SQLyog SSH 密钥登陆认证提示: No supported authentication methods available 解决方法

    问题背景: 问题原因: SQLyog不支持非标准的的私钥格式 解决方案: 使用puttyGen重新导入原来的私钥,然后重新保存成PPK证书文件,最后用SQLyog加载该PPK文件即可. 效果截图: 原 ...