$_SERVER的几个元素:
script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php
path_info: 是从控制器/操作方法开始到最后的内容,包括路径参数但是不包括动态参数
php_self则是所有的url地址内容中除了主机后的部分, 但不包括动态查询参数
request_uri 则是所有的url地址内容中除了主机后的部分, 包括动态查询参数
query_string就是动态查询参数, 即 问号后面? 的内容(不包括问号)
比如:
对于这个url地址而言, http://localhost/index.php/home/index/foo/name/obama/age/20?a=1
'REQUEST_METHOD' => string 'GET' (length=3)
'QUERY_STRING' => string 'a=1' (length=3)
'REQUEST_URI' => string '/index.php/home/index/foo/name/obama/age/20?a=1' (length=47)
'SCRIPT_NAME' => string '/index.php' (length=10)
'PATH_INFO' => string 'index/foo/name/obama/age/20' (length=27)
'PATH_TRANSLATED' => string 'C:wampwwwhomeindexfoo
ameobamaage20' (length=44)
'PHP_SELF' => string '/index.php/home/index/foo/name/obama/age/20' (length=43)
类的操作方法, 中, 可以包含/也可以不包含 显示模板的语句(show/display语句). 但是, show和dislay只是一个普通的方法名, 它可以在操作函数的任何地方调用, 甚至你可以在同一个操作 中, 多次地 调用show 和display方法 都可以, 但是 如果在操作函数中, 使用了die语句后, 后面的语句和后置方法 _after_method方法将都不会执行.
关于连贯操作和不使用连贯操作.
order,limit, where等叫做连贯操作. 连贯操作本身是不分先后顺序的. 因为他们返回的都是模型对象本身
但是 select操作必须放在最后, 因为select操作不是连贯操作, 他返回的是结果集, 不是模型对象本身, 不是return $this;
在进行curd操作的时候, 如果不习惯连贯操作,也可以将条件放在 select, delete等操作的参数中,使用数组的形式, 其中,数组的"索引"名称就是 连贯操作的 方法名,比如:
$u -> select(array('where'=>'name="foo"', 'order' => 'create_time', 'limit' => 10));
where 的条件 连贯操作
支持三种格式的形式
- 字符串格式, 比如:
$Model -> where('name="foo" and age=20 or addr <> "chengdu" ') ->select()
字符串格式也支持数据类型的识别, 外面用双引号, 里面的数据类型中, 如果是字符串就用单引号表示. 同样的, 反过来使用单引号或双引号也是一样的. 当然更好的是使用格式预处理的方式, 支持%d, %s, %f. 预处理后面的变量可以使用数组, 也可以直接使用逗号分隔, 但是要注意, 字符串表达式还是要用and 或 or 等符号进行连接
$m -> where("name='%s' and age=%d", array($name, $age)) -> select();
- 数组格式
使用拼装/ 拼接数组的方式, 数组元素的名称就是字段名, 值就是条件. 然后在$m -> where($map) -> select();
- 使用表达式
上面的使用字符串方式,写法不是很方便, 使用数组方式又只能表示 "相等" 的条件, 要使用 更复杂的条件,比如 不等, 大于, between, in等条件, 就要用 "表达式"
格式是: 前面的数组的名称, 是字段名, 后面的条件值用数组表示, 数组的第一个元素是表达式符号(用符号表示), 包括: eq, neq, gt, egt, elt(注意大于等于不是ge, 而是egt), between, not between, in 等, 第二个元素就是表达式的值.比如:
$cond['name'] = array('eq', 'foo);
$cond['age'] = array('between','10,20');
$m -> where($cond) -> where($map) -> select();
- where支持 多次调用, 但是只能是数组多次调用, 如果where条件是字符串, 则只能使用一次
Where 条件表达式格式为:
1. 三个元素, 是为了支持and,or,xor逻辑操作,前面两个元素必须是数组的, 表示多个条件之间的逻辑组合
1. 两个元素, 支持普通的条件表达式,两个元素都用字符串表示,第一个元素是'in,not in, between, not between,like'等形式, 后一个元素是字符串,比如'1,8', '1,3,5' 或数字 10等
1. 其中,in 和 between的数字字符串 也可以用array表示. 比如
$map['id'] = array('not in','1,5,8');
$map['id'] = array('not in',array('1','5','8'));
1. 当然, 也可以将表达式符号和数字写在一起, 用exp表示: $map['id'] = array('exp', 'in(1,3,5)');
关于 异或 的意思和应用
xor(异或) xor 两个输入中只有一个是true时,结果为true,否则为false
在编程中, 如果要进行逻辑判断, 判断两个条件中, “有且只有一个条件为true”时, 就可以使用 这个 xor的逻辑运算符。
模型类并非必须定义(但是控制器的类必须显示的定义, 必须继承自 ThinkController类), 只有当 模型中, 存在自定义的 业务逻辑(就是模型类 需要 添加/增加/自定义一些 基类ThinkModel 中没有的成员方法)时, 或需要
增加一些自定义的成员属性比如 $_validate, $_auto
等时, 才需要自定义模型类. 通常如果只是对模型表进行 curd操作时, 基类提供的成员方法就已经足够了.
前缀DB_PREFIX指的是默认的 "表前缀" 是表前缀, 不是数据库的前缀, 数据库本身是不需要什么前缀的, 比如demo数据库. 如果是模型 <-> 表的前缀跟默认的不同, 则需要自定义成员属性$tablePrefix
数据库的连接信息有三种配置形式
- 一是传统的使用数组配置方式 可以在convention.php 也可以在 应用配置或模块配置 文件中设置
- 二是使用字符串的方式:
$conn = "mysql://root:123@127.0.0.1:3306/demo#utf8"
- 三是使用配置"常量"的方式, 在配置文件中, 设置一个常量
DB_CONFIG1
的数组变量, 然后在实例化中, 直接用这个DB_CONFIG1
注意, M方法有三个参数, '模型名称', '表前缀', '连接参数'. 本来应该是 C('DB_COFNIG1'), 但是M方法会自动去获取配置参数, 所以不必使用C,直接用这个DB_CONFIG1...
当然 一般的数据库连接都使用 默认的/常规的 配置就行了, 很少使用自定义的 连接参数, 只有在 跨项目, 操作其他数据库, 非当前数据库的时候, 才使用 $conn自定义连接.
php中的运算符?
-
算数运算符, /是求商, %是求模(即求余数); 字符串运算符包括. .=, 自增运算符 ++$a; $b--; 比较运算符,
-
逻辑运算符: 支持单词和 符号两种形式: 其中单词形式的是 VB风格的: and(两者都为true), or(至少有一个为true), xor(表示: 有且只有一个为true时返回true). **符号形式的是 c/c++/java风格的有 &&, || , ! **
但是, 这两种逻辑运算符的优先级是不同的. 符号形式的&& 和 || 比单词形式的优先级更高. -
数组运算符支持: +, == === !=
-
更重要的是, php还支持 对变量的 按位 运算. 包括 &, |, ^(按位异或) , ~(按位 非) 移位运算(<<, >>) . 按位运算只有符号形式, 没有单词形式, 注意和 &&, || , ! 的区别
-
注意, 在tp的xml标签
<if condition="..">
中, 如果要使用 运算符, 要使用 字符型 or, and xor 不能使用 && || 等之类的符号.
- 首先, 字符串都要被转换成 整数来进行 比较 和 运算;
- 其次, 字符串转换的规则是 两点
- 一是,如果包含 小数点, e 或 E 则转换为 浮点数,float, 进行运算后, 得到的结果就是 float 浮点数, 用 gettype($var) 得到的结果就是double。
- 二是, 字符串转换成整数,结果以 “开头的字符为准” 如果开头的不是合法的数字或数字0,则转换为整数0. (注意, 开头的数字0会被忽略...)
如何计算 按位取反的结果: $a=8; echo ~$a;
在数值范围内,~a = -(a+1)
8的二进制是1000,补满32位(对于32位系统),也就是前面 28个0 1000
取反后 28个1 0111
第一位是符号位 1代表负数,剩下的 (27个1 0111 这个就是补码)
负数是用补码表示的,补码是原码取反+1,也就是说 27个1 0111 是某个数的补码,那倒推回去,这个数就是补码-1后取反,也就是 27个1 0110取反,得到27个0 1001,也就是9,再加上前面的符号位,得到-9
:补码 等于 原码取反加1;
: 原码就等于 补码 减1 取反。
为什么要使用 join操作?
-
join的目的并不是要把多个表要连接起来, 而是 因为要查询的数据 分布在多个表中, 我们要从多个表里面取数据, 但是 连接取数 不是任意的 取数据的, 而是有依据的, 依据是 这两个表 中的 某个 关键字段 (比如用户id )要有相同的值, 这样取出的数据才有 实际意 义, 才有现实意义, 表示的是 这些数据是 相关的, 这些数据 才是表示/描述的是 同一个人的信息. 依据是用 ON 来描述的.
-
join操作可以单独地 设置 前面那个表的 alias, 也可以 不用设置表的别名.
-
在table和join连贯 操作中, 使用的表 名称 都要用 全名, 比如 think_user, think_dept. 但是可以用 下划线加全大写的方式 来表示这些表名. 比如: USER, DEPT
-
关于操作类型, 有四种连接方式, inner join (就等于join , 这是默认的连接方式), left join, right join, full join.
-
表示 其他连接方式的时候, 有两种方式, 一种是 在前面说明, 即join的第一个参数前面, 另一种方式是 在join 后面, join的第二个参数规定连接方式, 为 left, right, full . 比如
$Model -> join('left join放在前面 __DEPT__ dept on __USER__.id = dept.id'); $Model -> join('__DEPT__ dept on __USER__.id=dept.id', 'left' 第二个参数);
#### 关于jquery的知识点 1. 将jquery对象转换为dom的方法有两种, 一种是 - 使用 数组下标的方式 $('p')[0], [1], [2], 这是因为 jquery对象其实是一个数组 是一个 html元素的 数组, 即 `Array
<script>
$('a').click(function(){
$('span').get(1).innerHTML='test';
$('span')[1].style.color='red';
});
</script>
- :not是一个基本过滤器, 选中除了所说的条件之外的所有元素. 这个否定条件可以是多个, 每个否定条件之间 要用 逗号来分开! 注意是逗号, 不能用空格, 如果用空格, 将会把它看成是一个否定条件! 比如:
$('span:not(".sp1, .sp2")').html('<b>test</b>').css('border', '2px solid gold');
将选中除了有 sp1类或者 sp2类的所有span, 但是如果是:$('span:not(".sp1 .sp2")').html('<b>test</b>').css('border', '2px solid gold');
的话, 将 只会除去 class类为 ".sp1 .sp2" 层级的span元素.
not方法的用法也是一样的