// 对于mysql来说, 如果字段没有设置其 default值, 则会自动 设置 default值为null。同理没有设置not null, 则会自动允许null =yes
// create table tbl_name like old_table_name: 参照一个表 创建一个新表:tbl_name不忘了写, old_table可以跨数据库
// 所谓的模型 就是指数据库中 的表. 模型名称就是数据表的名称, 模型类 就是 指对应的数据表的操作类.
其实D方法, 也可以实例化 "标准的/普通的"表类, 因为它会首先检查是否有自定义的 模型类,(在这个自定义模型类中, 可能有连接信息), 如果没有就调用基类的 ThinkModel类来实例化. 因此, 如果: 即使你在 config.php中没有配置数据库连接信息, 也能用 D方法 驱动模型类初始化实例, 但是如果用M方法就不行! 因为他只看 config.php中的配置信息
只是如果没有自定义的模型类, 使用 M方法更快, 性能更省,就没有必要使用 D方法了.
默认的是, M方法和D方法的第一个参数: 数据表名称 (模型名称)的首字母大小写 跟 模型类名称的大小写一致, 就是说即使表名称是user, 也要用 M('User'), 而不是M('user').但是 在windows下即使用小写的user好像也是可以的. 但是在linux下一定要注意一致.因此,为了保持兼容和避免出错, 还是 保持一致最好.
注意, M和D方法的 第二个参数(即模型的前缀并不是 必须的), 如果没有前缀, 第二个参数就用 空字符串.
// 关于变量的名称: 注意通常 全局函数中 的 变量的名称是可以随意取的, 没有谁来约束你! 但是在 具有继承关系的 类中, 比如 class UserModel extends Model , 模型类的 成员名称 就不是 可以任意写的了, 必须是父类的成员名称, 比如 连接成员就必须写成 $connection, 如果写成: $conn就会出错,报"无法加载数据库驱动"错误.
// code标签和pre标签, 第一: 前者的语义更强, 明确告诉浏览器这是一段程序代码, 允许浏览器可以做出自己(特有)的css样式处理, 第二, 通常在显示时code标签是在一行之内显示, 忽略空格和 换行.而pre标签, 会保留 代码中的 空格和换行. 忠实地显示代码格式。但是不要在pre标签中使用 p, div等硬换行的标签.
code标签类似于markdown中的单反引号, 而pre类似于三个反引号.
//在数据库中, 通常order排序操作是 要配合 limit操作来进行的, 才有意义. 如果只有order没有limit方法, 那么在进行 语法分析 / 查询优化 的时候, 会忽略这个order操作的.
//tp数据库的驱动层次是3层: ThinkPHP/Library/Think/Db.class.php + Think/Db/Driver.class.php + Think/Db/Driver/Mysql.class.php
//在数据库的配置中, 通常要配置 7项 内容: db_type | host port| name| user, pwd | prefix // (一定要配置数据库名称, 否则会报错: no database selected , 因为模型类的操作 只是针对数据表,没有数据库)
而db_port的值, 可以是数字 3306, 也可以是字符串 '3306'
// 数据库的模型类构造函数的原型, 是一个构造函数 __construct, 不是 同名方法:
public function __construct($name='',$tablePrefix='',$connection='') //构造函数的三个参数都有默认值,是可选的
'db_config1' => 'mysql://root:@localhost:3306/test', // 在config.php中配置这个连接 dsn名称
$User = M('User', 'dgwp_', 'db_config1');
//所谓的 内联组件: xxx-inline, 是指对于一些默认以竖直方向排列的, 变成以水平方向排列.
比如: list列表组件, 默认呢是竖直排列的, 如果以横向水平排列,就是 list-inline, 就可以做菜单导航显示
比如: dl自定义列表其: dt(title)和dd(data)默认是竖直排列的, dl-horizontal 就变成dt和dd 水平在同一行显示了.
//html的很多元素, 其实默认来说都有一定的 margin和padding, 目的是为了: 即使你没有设置任何的css, 都要保证能有一定的可视性和可阅读性. 比如:ul ol dl的数据其实有一个默认的 样式: padding-left: xx个像素.
//关于数据库的模型的操作函数,比如 select, find, 连贯方法where/limit/data等 都是针对模型类Model而言的. 所以这些方法都是在 基类 ThinkModel.class.php 类中的. 而不是在 ThinkDb.class.php文件中的
// bootstrap的carousel 轮播、幻灯片、旋转木马
包括三个部分: 轮播内容的容器; 指示器indicators; 按钮跳转.
- 通常的指示器(做按钮用的)是用 a(链接)来改装的
- data- 属性通常用来指示js脚本应用的, 比如 data-target, data-slide-to , 而类主要是用来规定显示外观的.
- carousel默认不是自动开始的, 要用 data-ride="carousel"属性 来启动或用 脚本
$('#mycarousel').carousel();
来启动 - 轮播的indicators是用来 指示显示内容 的 索引的 数字或条目, 从0 开始计算起, 他的属性是 data-target, data-slide-to(表示该索引滑动到第几个) ; 而单击调整 当前位置的 是 a标签改造的, 他的属性是
- 要注意, 占位符 是 placeholder 而不是 takeplacer
href="#mycarousel" data-slide="prev"/"next" 注意和 data-slide-to相区别
文件名最好不要用纯数字, 或用数字开头. 免得引起一些莫名其妙的问题!
// 在css中要想获得圆圈, 可以用 : border来做: 首先设置元素比如.carousel-indicators li
的高度和宽度; 然后设置元素的边框,让边框的radius刚好等于li的宽度和高度: .carousel-indicators li { 10px; height: 10px; border: 1px solid #fff; border-radius: 10px; }
如果是 激活的li则让其尺寸稍稍大一些,再设置背景的颜色为白色 .carousel .active{ 12px; height:12px; background-color: #fff;
// 所以, carousel的 indicators的样式 是在 bs中的 .carousel li中设置的,默认的边框颜色和背景颜色都是 白色,所以在白色的背景下是看不到的.
// 而indicators的内容,即使是数字1,2,3等也是看不到的,是因为在.carousel li中设置了 text-indent: -999px;的样式。 如果你确实想要显示li中的数字1,2,3等, 那么就要覆盖默认的样式: .carousel li {text-indent: 0px;}
当然要重新调整一下 其width和height和background等的属性。
但是 最好不要 用这种明显的 在 li中设置数字的做法, 因为 即使你仔细地调整 各种属性, 还是很难将数字 刚好就放在 列表的圆圈内. 所以, 没有必要必须显示 1,2 ,3等数字, 所以还是保留bs 默认 的 text-indent: -999px;属性好了.
// 注意, 在firefox的调试器中, 看到的 rules (这个是css的规则)上被横线 删除线 划掉的条目, 是指 原来具有的默认规则, 被后面的规则 所覆盖,所重写了的.
因此, 在 要重写/覆盖bs, jeasyui等框架中的 默认css规则时, 一定要把自己的 css规则文件放在这些框架的css规则的后面才行!
// carousel的ul/li 指示器indicators, 其实也是一个块, 它也可以 单独的 设置他的背景颜色, 比如: <ul class="carousel-indicators" style="background-color: #99FF99">
这么多的内容 都堆积到一个 div中, 靠的就是 设置他们的 z-index 的值不同 来实现的.
// bs中的标签属性中, 很多以data- 开头的, 就是 对应着/调用 相应的 js功能代码, 而有的属性是必须要的, 比如 role, 比如 placeholder等, 而有些 辅助类 ,比如 sr-only的类就可以不要. 通常在 label标签中设置了 sr-only类, 那么该label标签 就是不可见/隐藏的.
=============================
在bootstarp的carousel插件中, #mycarousel是外部容器 , 里面包含的 .item是它的子容器, 默认的 item子容器 并不会自动充满 外部的 carousel总容器, 而是仍然按照从上到下的布局进行排列, 但是每个item内的 .carousel-caption的内容 , 则是 以 item为父容器 而不是以 总的 #mycarousel为 父容器 进行绝对定位在 中下部位置的. 所以 要想让 carousel-caption的位置 , 在 整个父容器#mycarousel的中下部, 就要让 每个item的高度 跟 #mycarousel的高度 一样.
如果将 .carousel-caption的div>h3等内容 放在 所有 的item的外面, 则会以外部总的 #mycarousel为父容器进行绝对定位, 而且每个幻灯片上都有这种标题内容.
插件和组件的区别: 插件是动态加入的, 主要是 js效果和动态效果; 而组件主要是css实现的框架和布局.
<!doctype html>
<html lang="zh_CN"> // html的属性 lang, 明确告诉浏览器是 zh_cn
<head>
<meta charset="utf8"> // 同时用两种方法 来写 字符集编码, 主要是为了兼容一些老的浏览器.
<meta http-equiv="content-type" content="text/html; charset=utf8"> // 同时用两种方法 来写 字符集编码, 主要是为了兼容一些老的浏览器.
<meta name="viewport" content="width=device-width; initial-scale=1">
// 视口有两个属性, 一个是name='viewport', 一个是content, 其中content的内容有: 宽度width, 等于设备宽度device-width, 初始缩放比例=1
// 可以把所有的内容都放在 div中, 比如, 甚至是 br: <div> <br/></div>
<div> <br /></div>
设计的配色, 如果是默认的白色的背景,就用 浅蓝色的前景字体, 如果是白色的前景色, 为了区分块 的区域, 背景颜色就用 浅灰色 比如#eee.
pre和code其实是可以混用嵌套使用的, 比如 pre>code等.
bs的网格类布局, 就类似于 "表格", 网格 ~~~ 表格, 如同表格的结构一样, 网格也是 由: div.container > div.row > div.col-xx 构成的.
-
对于某个元素的 css类样式, 既然是写在当前元素上的,那么该css样式总是作用在当前元素自己的身上,而不是作用在他的父元素或他的子元素上, 这一点是很明显但往往容易被忽略、视而不见的
-
但是当前元素的类样式, 又不是完全跟 父元素或子元素 无关的,是有关系的, 这种相互关联 主要体现在两个方面:
一个是 “向下的”: 当前属性对子元素的 继承性;
一个是 “向上的”位置对父容器(父元素)的相对性
-
继承性: 看这种css属性是否有继承性,比如color属性,如果inherit 为 yes, 表示有继承性,即该元素的子元素如果不指定color属性, 将继承其父元素的color属性;
-
位置关联性, 主要体现在一些 跟位置相关的css属性,那么就是指 应用当前css属性的当前元素 其位置相对于 其父容器(即父元素)的位置关系: 是居于父元素的顶部、水平/垂直居中、底部等。
- 还要注意元素的默认值: 有的元素有默认值, 而有的元素是没有默认值的, 或者说默认值等于: not specified/none
========================================================
关于伪类和伪元素?
-
伪类 是表示 选择器的 某种状态, 写法是用一个冒号 :active 表示, 注意不是像其他类样式一样, 用点号表示
-
伪元素 是 表示元素的某种特殊位置, 写法是css3的两个冒号 ::before 表示, 但是为了兼容ie8以下(ie8以下不认识双冒号),大多数采用一个冒号的写法, 比如 :befor 所以, 伪类和伪元素在写法上就是一样的外貌了,所以容易搞混淆
-
最主要的是:
- 要记住有哪些伪元素和伪类
伪元素有4个 :first-letter, :first-line, :before, :after
伪类有 :active, :visited, :link, :hover, :first-child等 - 要知道 伪类可以 通过指定一个类及类样式来代替实现,所以叫伪类; 而 伪元素 则需要添加 一个 子元素才能实现,所以叫伪元素。
**伪类和 伪元素都可以放在 任意选择器的后面 比如 .clearfix:before, 这个是伪元素, a:active 这个是伪类, 再比如: p:active或 div:visited等都是有意义的 , 都是有效果的! **
pseudo: [sju:d2u] 伪: pseudo-classes, pseudo-elements
====================================
inline-level 元素, 是指内联级别的元素, 包括 四种情况: 本身就是inline元素(有img,span,i,strong等),设置了 display: inline-block的元素,设置为: display: inline-table的元素, 和 设置为display:table-cell;
thinkphp模型$_validate的错误信息如何显示在表单上? 参考: https://www.cnblogs.com/zxf100/p/6764944.html
- 连接信息的配置, 有三种情况, 一是传统的默认的分离型的, 比如 'DB_TYPE' => 'mysql'等; 一种是配置成DB_CONFIG1="..."这种形式; 另一种是直接在创建数据表对应的模型对象时直接写 "mysql://root:@...."的形式.
在写mysql://root:@localhost/test字符串的时候,如果没有用户密码, root后面就什么都不要写, 不能写空的双引号,比如 mysql://root:''@localhost....这种写法会报错
实例化模型对象的时候, 即使表的名称是小写的, 比如 user, 但是 实例化里面也要写成 "首字母大写"的样子.比如 : M('User',...)
实例化的时候 完整的函数原型是 M('模型名称', [表前缀], [连接字符串信息]); 即要指明用什么连接信息, 连接的时候, 表的前缀是什么...
注意, 在html中写的根路径"/" , 总是指的 localhost的所在的目录, 并不一定就是当前项目所在的路径
- 我们在使用框架的时候, 比如bs, easyui等的时候, 要尽量 根据/遵守 框架的使用方法, 而不要打破它的设计思想, 不要做框架 /机器等做不到的事. 比如 栅格系统中你就不要再去用表格系统了, 那样就不优雅(很别扭了)
===================================================
bs中的类,很多都是独立的,并没有固定的搭配,比如.container, .well等类,可以根据自己的需要自由组合。
而且,在bs中要有这样的意识:在一个元素中,可以在class类中指定多个互不相关的样式类,这些样式类是可以自由组合的
bs的类样式的派生关系?
bs中基础类样式,是从各种样式类中提取公共样式,大家共有的样式,而派生类则是各个元素独有的/不同的样式;
基础类样式和派生类样式是不同的, 不重复的!
使用派生类样式时,应该/必须同时、先使用基础类样式, 然后写上派生类样式
bs中的样式类,可以在基础类的基础上设置三个方面的内容,包括 颜色,大小,对齐:
比如: btn类是基础类样式,颜色: btn-primary, btn-error, btn-warning,btn-success
大小: btn-lg, btn-md, btn-sm等
位置的对齐:text-center, text-left, text-right, 这个就比写样式更简洁。
well类的样式,是有一点向外凸出的浮雕墙的样式,同时有一些内padding。
bs :要对每一个样式类,至少是常用的样式类,比如.container, .col-md等这些类的具体规则要比较熟练熟悉,
.container类 上下是没有margin的,所以看到容器是紧挨着上一个元素的,而其左右的margin是auto自动的.
它的内部,左右各有15px的padding。
而col和col之间 只有 15px的间隔...
为什么我不使用 bootstrap的栅格系统 来进行布局??
在设置tp的 数据库连接时, 有一种连接方式叫 dsn: data-system name: 是dsn,不是dns:(dns是域名系统), 这个是数据连接名称, 最后一个单词是name, 是名称, 所以是n: dsn
关于table的三种样式?
共有三种样式: table-bordered, table-condensed, table-striped.
- 注意的是, 这三种样式中, 类名 都是 -ed, 过去完成时的被动动词;
- condensed 的效果是 被压缩的, 样式是 内容四周有 5px的 内 padding! condensed和 bordered 可以同时使用!
在bs中 要使内容居中的话, 要多使用 .container类, 这个类样式, 就是 让div块的margin 上下各5px, 左右 auto。
为什么开发传统宽屏桌面, 不推荐使用bs的栅格系统布局?
- 因为 bs的栅格布局 主要是 用来进行(适应) 手机、平板等移动设备的 布局, 以移动设备的布局优先, 传统的宽屏显示器 并不适合。 因为它会自动进行 (上下方向上的)堆叠
- 最重要的是, bs的栅格堆叠 不是根据你 显示的屏幕 “物理”宽度 来确定的, 而是根据你的 显示器的“分辨率” 来确定的, 所以, 即使你的显示器在物理尺寸上很宽, 但是当你设置的分辨率是
1024*768的时候, 你使用 col-lg-6 等列的时候, 它也会发生竖直方向上的 堆叠。 这个就很让人 疑惑! - 所以 在 主要是 部署在 应用在 传统显 示器上的 web应用, 还是要用 div 或 table 来进行布局。
所以, 在web应用中, table 的作用主要有两个: 一个是用来显示或描述 确实是表格内容的; 另一个是 用来进行 布局和排版。 有时候, 表格的布局和排版 会起到很轻松的解决困难布局的问题, 如同表格在 word中 用来布局、排列多个图片一样!
- 连接信息的配置, 有三种情况, 一是传统的默认的分离型的, 比如 'DB_TYPE' => 'mysql'等; 一种是配置成DB_CONFIG1="..."这种形式; 另一种是直接在创建数据表对应的模型对象时直接写 "mysql://root:@...."的形式.
在写mysql://root:@localhost/test字符串的时候,如果没有用户密码, root后面就什么都不要写, 不能写空的双引号,比如 mysql://root:''@localhost....这种写法会报错
实例化模型对象的时候, 即使表的名称是小写的, 比如 user, 但是 实例化里面也要写成 "首字母大写"的样子.比如 : M('User',...)
实例化的时候 完整的函数原型是 M('模型名称', [表前缀], [连接字符串信息]); 即要指明用什么连接信息, 连接的时候, 表的前缀是什么...
注意, 在html中写的根路径"/" , 总是指的 localhost的所在的目录, 即: /var/www/html/这个目录. 并不是指: 当前项目所在的路径
=================================
#### div中的内容居中, 可以有两种方法: 一是使用 line-height: 跟div的高度相同; 二是使用 display: table-cell, vertical-align: middle. 但是, 使用vertical-align等都比较麻烦, 不如直接使用 内/外边距来得更方便和更灵活! 而且适用于任何地方=========================================
关于mysql中的字符串连接函数?
- mysql中的随机数 函数 rand() 不能代参, 只能产生0~1之间的随机小数. 所以要产生四位的随机数字用: round(1000+9000*rand());
- mysql中的字符串连接, 不是用 加号+, 也不是用点号, 也不是函数 strcat, 而是用 concat('..', '...', '...'), 可以直接用数字 和字符串连接
其他类似函数有: concat_ws, group_concat, repeat('abc', 3');