kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

MySQL 触发器

一.语法:

1
2
Create trigger 触发器名 before|after 触发事件
	On 表名 for each row 执行语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mysql> create trigger books_trig1 beforeinsert
   -> on users for each row
   -> insert into trigger_time values(now());
Query OK, 0 rows affected (0.05 sec)

mysql> desc users;
+-----------+-------------+------+-----+---------+----------------+
|Field    |Type       | Null | Key | Default |Extra         |
+-----------+-------------+------+-----+---------+----------------+
| user_id   |int(10)    | NO   | PRI |NULL    |auto_increment |
| user_name | varchar(50) | NO  |    |        |               |
| user_pwd  | varchar(20) |NO  |    |        |               |
|email    | varchar(50) | NO  |    |        |               |
+-----------+-------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
 

mysql> insert into usersvalues(null,'helloc','hello','hello@qq.com');
Query OK, 1 row affected (0.05 sec)
mysql> select * from users;
+---------+-----------+----------+--------------+
| user_id | user_name | user_pwd |email       |
+---------+-----------+----------+--------------+
|     10 | helloc    |hello    | |
+---------+-----------+----------+--------------+
1 row in set (0.00 sec)

mysql> select * from trigger_time;
+---------------------+
|datetimes          |
+---------------------+
| 2011-10-29 16:27:33 |
+---------------------+
1 row in set (0.00 sec)

二.创建有多个执行语句的触发器:

语法:

1
2
3
4
5
Create trigger 触发器名 before|after 触发事件  
	On 表名 for each row  
	Begin  
		执行语句列表  
	End
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> delimiter&&
mysql> create trigger books_trig2 after delete
   -> on users for each row
   -> begin
   ->  insert into trigger_timevalues(now());
   ->  insert into trigger_timevalues(now());
   -> end&&
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;


mysql> delete from users
   -> where user_id = 10;
Query OK, 1 row affected (0.06 sec)

mysql> select * from users;
Empty set (0.00 sec)

mysql> select * from trigger_time;
+---------------------+
|datetimes          |
+---------------------+
| 2011-10-29 16:27:33 |
| 2011-10-29 16:41:16 |
| 2011-10-29 16:41:16 |
+---------------------+
3 rows in set (0.00 sec)

三.查看触发器:

语法:Show Triggers;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> show triggers\G
*************************** 1. row***************************
  Trigger: books_trig1
	Event:INSERT
	Table:users
Statement: insert into trigger_time values(now())
   Timing: BEFORE
  Created: NULL
 sql_mode:NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  Definer:
*************************** 2. row***************************
  Trigger: books_trig2
	Event:DELETE
	Table:users
Statement: begin
	   insert into trigger_time values(now());
	   insert into trigger_time values(now());
end
   Timing: AFTER
  Created: NULL
 sql_mode:NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  Definer:
2 rows in set (0.00 sec)

也可在triggers表中查看触发器信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mysql> select * frominformation_schema.triggers\G

	  --where trigger_name=‘触发器名';
*************************** 1. row***************************
	      TRIGGER_CATALOG: NULL
	       TRIGGER_SCHEMA: books
	         TRIGGER_NAME: books_trig1
	   EVENT_MANIPULATION: INSERT
	 EVENT_OBJECT_CATALOG: NULL
	  EVENT_OBJECT_SCHEMA: books
	   EVENT_OBJECT_TABLE: users
	         ACTION_ORDER: 0
	     ACTION_CONDITION: NULL
	     ACTION_STATEMENT: insert into trigger_time values(now())
	   ACTION_ORIENTATION: ROW
	        ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
	              CREATED: NULL
	             SQL_MODE: NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
	              DEFINER:
*************************** 2. row***************************
	      TRIGGER_CATALOG: NULL
	       TRIGGER_SCHEMA: books
	         TRIGGER_NAME: books_trig2
	   EVENT_MANIPULATION: DELETE
	 EVENT_OBJECT_CATALOG: NULL
	  EVENT_OBJECT_SCHEMA: books
	   EVENT_OBJECT_TABLE: users
	         ACTION_ORDER: 0
	     ACTION_CONDITION: NULL
	     ACTION_STATEMENT: begin
	   insert into trigger_time values(now());
	   insert into trigger_time values(now());
end
	   ACTION_ORIENTATION: ROW
	        ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
	              CREATED: NULL
	             SQL_MODE: NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
	              DEFINER:
2 rows in set (1.61 sec)

四.触发器的作用:

1
在MySQL中,触发器执行的顺序是Before触发器、表操作(insert、update和delete)和After触发器。

五.删除触发器:

1
DROP TRIGGER触发器名;

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
delimiter |
create trigger submit_update
after update
on submit
for each row
begin
if OLD.status<>40 AND NEW.status=40 then
	update contestinfo set accept = accept+1 where contestinfo.contestid=NEW.contestid and contestinfo.pid=NEW.pid;
elseif OLD.status=40 AND NEW.status<>40 then
	update contestinfo set accept = accept-1 where contestinfo.contestid=NEW.contestid and contestinfo.pid=NEW.pid;
end if;
end
|
delimiter ;

PHP排序函数详解

在PHP中,对数组排序的函数有以下几个:

  1. sort(array &$array[, int $sort_flags ])函数,该函数只对数组值进行排序,数组索引将随排序后自动分配。可选的第二个参数分别是SORT_REGULAR,SORT_NUMERIC,SORT_STRING,SORT_LOCAL_STRING。在对含有混合类型值的数组排序时要小心,因为 sort() 可能会产生不可预知的结果。
  2. rsort(array &$array[, int $sort_flags ]),与sort()相同,只不过排序顺序相反,rsort()从高到低。
  3. asort(array &$array[, int $sort_flags ]),键值排序,对于要求保持数组索引和键值不变,可以使用该函数。
  4. ksort(array &$array[, int $sort_flags ]),对数组索引排序,主要运用于关联数组。
  5. krsort(&array[, int $sort_flags ]),与ksort相同,只是排序顺序相反,从高到低排序。
  6. arsort(array &$array[, int $sort_flags ]),与asort()相同,只是排序顺序相反,从高到低排序。
  7. natsort(array &$array),用自然排序算法对数组排序。本函数实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键/值的关联,这被称为“自然排序”。
  8. natcasesort(array &$array),和natsort()相同,只不过在排序时不区分大小写。
  9. usort( array &$array , callback $cmp_function ),本函数将用用户自定义的比较函数对一个数组中的值进行排序。如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。 比较函数必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于,等于或大于零的整数。此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。 当usort()用于多维数组排序时,自定义排序函数的参数包含到数组第一个索引的引用。 对于CI框架usort($file_list, ‘cmp_func’); 更改为usort($file_list, array($this, ‘cmp_func’));
  10. uksort(array &$array , callback $cmp_function ),与usort相同,只不过对数组索引排序。
  11. uasort ( array &$array , callback $cmp_function ),与sort相同,在排序时保持索引关联

在网页中嵌入CKeditor编辑器

1.

http://ckeditor.com/download 上下载最新版本的CKeditor。将下载的文件解压,然后将4M多的文件减肥:可以删掉samples、source、tests这三个无用的文件夹;打开lang文件夹,删掉除languages.js、en.js、zh-cn.js以外的所有文件;如果你不用office2003和v2两种皮肤,可以把skin目录下的这两个目录也都删掉。这样就做的了准备工作。
将ckeditor压缩包解压放在网站根目录下的“ckeditor”文件夹里: 引入ckeditor.js文件:

1
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>

你也可以将这些文件放在你网站的其他任何一个地方,默认为“ckeditor”。

2. 在要使用ckeditor编辑器的地方插入脚本:

1
2
3
4
<script type="text/javascript">CKEDITOR.replace( '多行文本的name',{skin : "kama",width:520} );</script>
如:
<textarea cols="80" rows="10" name="message">Please input the content in here</textarea>
<script type="text/javascript">CKEDITOR.replace( 'message',{skin : "kama",width:520} );</script>

这样就将name为message的多行文本替换成了ckeditor编辑器形式的输入框

3.获取内容:

1
2
3
<?php
$message=$_POST['message'];
?>

4.自定义ckeditor

4-1.设置编辑器皮肤、宽高

如:

1
2
3
4
5
6
7
8
9
10
<textarea  cols="90" rows="10" id="content" name="content">cftea</textarea>
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
<script type="text/javascript">
<!--
CKEDITOR.replace("content",
	{
		skin: "kama", width:700, height:300
	});
//-->
</script>

Ubuntu下安装MySQL获得 mysql.h

先安装MySQL

1
sudo apt-get install mysql-server mysql-client

再装开发包

1
sudo apt-get install libmysqlclient15-dev

安装完以后,C代码里添加头文件

1
#include <mysql.h>   还是 #include<mysql/mysql.h>

编译方法:

1
gcc $(mysql_config --cflags) xxx.c -o xxx $(mysql_config --libs)

CodeIgniter用钩子实现基于URL的权限控制

基于URL权限系统:

例如游客只能访问音乐模块的index,list,search方法。而注册用户除上述功能之外还能访问create,update,delete方法。那么我们可以在控制器之行之前判断当前用户是否具备访问该控制器的权限。

实现:

直接上代码:

1.system/application/config/hooks.php中添加钩子声明:
1
2
3
4
5
6
$hook['post_controller_constructor'] = array(
	'class' => 'Acl',
	'function' => 'filter',
	'filename' => 'acl.php',
	'filepath' => 'hooks',
);
2.system/application/config/config.php中让钩子系统生效
1
$config['enable_hooks'] = TRUE;
3.然后在config中新建acl.php权限系统配置文件,当然你也可以放在数据库中。

//游客权限映射

1
2
3
4
5
$config['acl']['visitor'] = array(
	'' => array('index'),//首页
	'music' => array('index', 'list'),
	'user' => array('index', 'login', 'register')
);

//管理员

1
2
$config['acl']['admin'] = array(
);

//————-配置权限不够的提示信息及跳转url——————//

1
2
3
4
5
6
7
8
9
10
$config['acl_info']['visitor'] = array(
	'info' => '需要登录以继续',
	'return_url' => 'user/login'
);
$config['acl_info']['more_role'] = array(
	'info' => '需要更高权限以继续',
	'return_url' => 'user/up'
);
/* End of file acl.php */
/* Location: ./application/config/acl.php */
4.system/application/hooks目录下添加acl.php逻辑处理文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Acl
{
	private $url_model;//所访问的模块,如:music
	private $url_method;//所访问的方法,如:create
	private $url_param;//url所带参数 可能是 1 也可能是 id=1&name=test
	private $CI;
 
	function Acl()
	{
		$this->CI = & get_instance();

		if (!session_id()) session_start();

		$url = $_SERVER['PHP_SELF'];
		$arr = explode('/', $url);
		$arr = array_slice($arr, array_search('index.php', $arr) + 1, count($arr));
		$this->url_model = isset($arr[0]) ? $arr[0] : '';
		$this->url_method = isset($arr[1]) ? $arr[1] : 'index';
		$this->url_param = isset($arr[2]) ? $arr[2] : '';
	}
	function filter()
	{
		$user = $this->CI->session->userdata('user');
		if (empty($user)) {//游客visitor
			$role_name = 'visitor';
		} else {
			$role_name = $user->role;
		}

		$this->CI->load->config('acl');
		$acl = $this->CI->config->item('acl');
		$role = $acl[$role_name];
		$acl_info = $this->CI->config->item('acl_info');

		if (array_key_exists($this->url_model, $role) && in_array($this->url_method, $role[$this->url_model])) {
			;
		} else {//无权限,给出提示,跳转url
			$_SESSION['info'] = $acl_info[$role_name]['info'];
			redirect($acl_info[$role_name]['return_url']);
		}
	}
}