new Image(宽度,高度) $(image).attr('src', ...).load(function(){....})
load表示浏览器从服务器下载(装载)对象完成, 这个load方法很重要, 能够由浏览器自动判断一个对象, 或者一个节点是否装载、下载完成了javascript
new Image的时候, 内存缓存中 的图像 如何装载进来, 要加入到文档的某个节点中来才能 生根,才能显示??php
使用 ajax事件:浏览器系统会自动检查 ajax的(全局)开始和结束, 以及每一次ajax请求的开始和结束,要把这些ajax事件注册到你须要显示和隐藏的节点上,这个一般是div或者下面的 图片?css
显示图片的jquery方法 一般是用show, 而隐藏的时候,须要选择恰当的方法了:html
可是, 若是你以为hide消失得太快的话, 就要用fadeout或者用 animate的方式。 animate更灵活,它支持两个参数,一个是效果的js对象, 另外一个是过渡的时间,多少毫秒(在jquery的效果函数中, 0 表示立刻显示或隐藏)前端
也能够用 一个非标准的css样式:opacity: 透明度,等于0表示隐藏, 1 表示显示, 这个非标准的css样式,能够由jquery来封装隐藏底层差别java
jquery能够缓存从服务器交互取得的数据, 这样之后若是须要再次使用这些数据的时候,就直接用本地缓存,而没必要再次从服务器上去取数据,这样反应会更快。 使用的函数是 data. data('缓存数据的名称',缓存数据内容data) 以及取数据的方法是:data(‘缓存名称');mysql
要让图片和文字同一行显示(并且高度一致), 对图片使用css的float样式??jquery
php缓存技术, (csdn thinkphp缓存技术 think2me)web
tp以及 普通浏览器是如何判断 一个请求是不是 ajax请求的?ajax
:是经过 服务器变量 $_SERVER 来判断的:
即:
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 );
if(!IS_AJAX) {$this->error('错误提示'); }
而后, 才是 对 ajax 提交的处理,一般步骤是: 第一, 逻辑执行, 准备好ajax 返回的数据data: 第二, data一般是本身 组装的数组, 这个数组 一般应该包含(固然具体是由你本身来决定的) 执行状态status (根据不一样的情形返回ok 或false), 具体的处理值; 第三, 调用 控制器的 ajaxReturn方法: $this -> ajaxReturn($data);
这里返回的是数组, 在前端的时候, 就已经被 jquery的 post或 get请求转换成json 格式的 js对象了, 就能够直接使用 js对象的点语法 或 中括号语法 了 ???
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 只是取得 结果集的 第一行数据 做为 一个 一维数组.
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的对象, 能够用 大括号 来表示, 所以, 这个大括号{ }能够看作是一个 集合! 能够将js对象, 能够看做是 不少个 属性的 集合; 也能够看作是 多个 key: value 键值对的 集合.
因此, js的对象 有多种 aliases 别名: 在用法和理解上, 就等同于 关联数组, 字典, 映射, 哈希表, 查询表等等, 均可以.
因此, js的对象 的属性, 在 引用方法上, 就有 两种方法,
一种是用 点号(点符号)来引用. 一种是用 中括号标记 来引用
可是要注意的是, 若是 使用 使用点号来引用的话, 后面的 属性名 必须是 一个 合法的 javascript标记: 若是不是合法的js标记,好比 是以"空格, 连字符- , 或数字 开头的"非标准的 javascript标记, 则只能使用 关联数组 的方式: 即用中括号的方式 来 引用.
因此 有时候, 咱们可能不知道, 不肯定 属性名是不是 合法的js标记, 推荐 从此 无论在何时, 都使用 中括号标记 来 引用 js对象的属性. 由于在中括号中的 属性名, 无论原来是什么 数字/空格/仍是对象等等, 都 会被 自动转换成 合法的js标记 字符串! 是字符串.
js对象的属性和方法 其实 并无 明显的区别, 方法在这里 只是 "能够调用"的属性 而已.
另外: js中的 eval虽然功能强大, 可是 仍是建议 "在任什么时候候都应该 避免使用"这是 MDN上 权威 站点上的原话.
<script> alert({$ok}); //这里 不加引号的话, 不会弹出, 由于会报错: {$ok} 转换后的 变量... undefined. alert({:U()}); // 这里必须加上 引号, 不然会 报错: 正则表达式... </script>
实做: 用cookie 模拟网站登录, 显式权限, 跳转, 退出, 时间设置为一周, 多个页面跟踪用户的cookie.
php中跳转, 除了用框架的 redirect, success, error等 "封装"方法, 还可使用 header方法: 即 header('location: jumpto.php'); 要注意, 只要发生 跳转后, 执行header中的 跳转后, 其后面的代码就不会再继续执行了, 相似于 die, exit等.
在原生的 php链接/登录数据库, 判断是否成功, 方法是 : 判断 sql 查询 语句执行结果 $result的 属性 num_rows 是否大于等于1.
其中 mysqli 的 fetch_assoc是获取结果集的第一行数据.
网站登陆是 用 "登陆" 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位数字.
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...
服务器向客户端发送信息,依次是 状态信息,头信息,实际内容,所以,在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, 有不少方法均可以实现).
凡是经过 地址栏输入url访问, 或者是 经过 超连接a的 get传参跳转的, 都是get访问/get请求; 只有经过表单 post提交的,才是post请求.(固然form也能够经过get请求传递数据, 可是通常不会).
关于php的鼠标/按钮操做, 不要只固定一种思路,觉得只有 button, 只有onclick, 还有新的思惟方式, 就是使用 超连接! 经过超连接a的操做, 有一个好处是, 能够 在php文件中, 经过 $_GET来获取数据并进行逻辑处理.
可是, 若是你想在 后台的 php文件中, 获取数据并处理的话, 就使用 a超连接...
当表单所在页面 被刷新的时候, 表单就会被从新载入(即从新从服务器上下载该页面/或者从缓存加载). 这时候, 原来填写的内容就会消失了, 回到空的初始页面状态.
页面的刷新(从新载入), 除了按f5外, 还有表单的再次提交, js脚本的/ php的header函数: location.href
是动做, 是操做的意思. 即: 当表单提交时, 将执行什么操做, 这个操做, 正好是 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);
isset是判断变量是否设置过, 在全部声明或定义变量的语句中, 只有 明确的说 $var=null时 isset返回false, 其余都会返回true.
可是isset只能接收 原始的 简单类型的变量, 不能接收 一个函数的返回值来 判断.
所以, 要判断一个函数的返回值 是不是 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'] 自己原生的 数组来判断. **
include的属性file, 能够有两种指定方法,一是使用 模板表达式 Home@Public(公共控制器)/header(操做), 可是这个模板表达式中的控制器和操做也只是一种形式(至关于目录结构)并不强制要求真的有 那样的控制器和操做; 另外一种方式是使用 模板文件 (要从./Application...开始指定绝对路径)
再就是 被包含的模板文件无论用 模板表达式仍是 模板文件的方式, 都必须是 *.html结尾的文件, 多是在 "模板引擎设置" 中进行了限定TMPL_template_suffix => '.html' // 默认的模板文件后缀
也就是说, 只有 .html 才被认为是模板文件, 才能被 include所用.
还能够由 include标签中, 给被包含文件传参, 要注意这个传参,不是 控制器/操做的传递变量, 在被包含文件中, 使用 中括号 方式 引用include的传参: [这里是include的传参]
get_defined_constants(true);
div和table从语义上来说: div是内容分块; table是表格, 在语义上就是用来 表达 二维数据的
在显示方法上的区别: div是即载即显示, 而table是加载彻底后 才显示.
在布局上, 先期使用table, 后来使用 table+div(因此 会看到不少 在 表格的列 td中使用 div的), 后来彻底使用div.
div+css虽然灵活, 可是也会在一些结构上引发 困惑和带来复杂度... 而css的兼容性并不太好. 并且外部引用css文件, 对后台web服务器的压力很大??
因此: 若是是一个中小型的 web应用, (或是主要给一个公司使用的)网站, 使用table来布局是合适的, 并且开发效率要快得多. 或者是 使用 table+div(表格+div结合css)是合适的.
<frame...> </frame>
的方式<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>
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自动留白.
表现。 最好是加上 min-width的css属性, 能保证页面正常。
注意div的width设为 50%, 不是指显示屏幕的50%, 而是指当前浏览器 窗口的 宽度的50%。
对于通常的前台页面, 一般的设计是: 头部或底部的宽度是100%满屏的, 中间内容是固定宽度、居中 的。
于 一个 上传文件的相关信息,又是一个数组。 而 uploadOne 是只上传一个文件, 所以返回的结果 就只是 关于这一个 上传文件的相关信
息 它就是一个一维数组。
事实上, 返回的信息, $file确实就是 对 原生的 超全局变量 $_FILES数组 的一个封装。
的格式换”处理, 所以 若是要在后台作这些 “样式”的处理并不科学, 后台只是输出原始数据, 至于具体的 表现形式,好比ymd, Y_M/d
等等, 这个仍是交给前端 模板去处理。 因此 tp为了知足这样的目的, 提供了模板变量的函数处理,默认值处理等等,好比:
{$create_time|date='Y-m-d', ###}
求时刻, 差很少就是当前脚本的执行时刻。
须是 .class.php 其余不要求, 好比 类是否要继承自 Controller等都不是命名规范中所要求的。
配置中的filter全都是 针对 I 方法进行的设置, 过滤函数有 null, default_filter, var_filter.
U 方法和I方法是tp中的核心方法。 U方法的定义规则是:
U('地址表达式', [传递的参数'], [伪静态后缀'], ['是否显示域名']
伪静态的后缀, 能够本身输入设置,好比是html, tpl等, 也能够是 false/true. 表示是否使用伪静态后缀
参数的传递, 有三种方式, 一是在地址表达式中一并写, 二是单独用字符串传递, 三是用数组进行传递. 一般推荐使用的是第三种方式, 将参
数放在 单独的数组中.
**另外, 使用U方法 生成的地址是根据 当前的url模式 自适应生成的, 即在不一样的url模式下, U方法地址均可以生成, 可是生成的地址字符串
却不同.**
I函数是为了获取 传递过来的参数, 因此会有一个默认值, 即当传递过来的参数为空的时候的默认值, 再就是一个过滤函数.