PHP + mysql 访问控制

PHP + mysql 访问控制案例:

[cce_php]

<?php
//create short names for variables
@$name = $_POST[‘name’];
@$password = $_POST[‘password’];

if ((!isset($name))||((!isset($password)))) {
?>
<h1> Please Log In </h1>
<p>This page is secret.</p>
<form method=”post” action=”secretdb.php”>
<p>Username:<input type=”text” name=”name” /></p>
<p>Password:<input type=”password” name=”password” /> </p>
<p><input type=”submit” name=”submit” value=”Log in” /></p>

</form>
<?php
} else {
$mysql = mysqli_connect(“localhost”, “webauth”, “webauth”);
if (!$mysql) {
echo “Cannot connect to database.”;
exit;
}
$selected = mysqli_select_db($mysql,”auth”);
if (!$selected) {
echo “Cannot select database.”;
exit;
}

$query = “select count(*) from authorized_users where name='”.$name.”‘ and password = ‘”.$password.”‘”;

// 可以在password之后加sha1 或md5 加密
$result = mysqli_query($mysql,$query);
if (!$result) {
echo “Cannot run query.”;
exit;
}
$row = mysqli_fetch_row($result);
$count = $row[0];

if ($count >0 ) {
echo “<h1>Here it is!</h1>
<p>I bet you are glad you can seee this secret page.</p>
“;
} else {
echo “<h1>Go Away!</h1>
<p>You are not authorized to use this resource.</p>”;
}
}
?>

[/cce_php]

 

数据库需要执行:

[cce_php]

create dateabese auth;
use auth;
create table authorized_users (name varchar(20),password varchar(40),primary key (name));
insert into authorized_users valuse (‘username’,’password’);
insert into authorized_users values (‘testuser’,sha1(‘password’));
grant select on auth.* to ‘webauth’ indentified by ‘webauth';
flush privileges;

[/cce_php]

 

mysql 存储过程

过程关键字案例:

[cce_php]

# Basic stored procedure example
delimiter //

create procedure total_orders (out total float)
BEGIN
select sum(amount) into total from orders;
END
//
delimiter;

[/cce_php]

delimiter // 设置默认语句分隔符为 //

create procedure 过程名 (参数输入或输出 参数名 参数类型)

create procedure 创建一个关键字

in 输入 out 输出 inout 输入和输出

BEGIN 和END的中间是语句块

select 查询内容 into 过程参数 from 表名;将查询内容转给过程参数

call 过程名(@t) 调用一个过程,并将值传给@t;

select @t 查看过程的值

函数案例:

[cce_php]

# Basic syntax to create a function

delimiter //

create function add_tax (price float) returns float
return price*1.1;

//

delimiter ;

[/cce_php]

 

create function 函数名 (参数名 参数类型) returns 返回参数类型

return 返回内容;

select 函数名(参数); 调用函数

查看函数或过程关键字的内容

show create procedure 过程关键字名;

show create function 函数名

 

函数使用局部变量案例:

[cce_php]

# Basic syntax to create a function

delimiter //

create function add_tax (price float) returns float
begin
declare tax float default 0.10;
return price*(1+tax);
end
//
delimiter ;

[/cce_php]

定义局部变量:

declare 变量名 变量类型 default 初值;

 

游标和控制结构案例:

[cce_php]

# Procedure to find the orderid with the largest amount
# Could be done with max, but just to illustrate stored procedure principles

delimiter //
create procedure largest_order(out largest_id int)
begin
declare this_id int;
declare this_amount float;
declare l_amount float default 0.0;
declare l_id int;

declare done int default 0;
declare cl cursor for select orderid, amount from orders;
declare continue handler for sqlstate ‘02000’ set done = 1;

open cl;
repeat
fetch cl into this_id, this_amount;
if not done then
if this_amount > l_amount then
set l_amount=this_amount;
set l_id = this_id;
end if;
end if;
until done end repeat;
close cl;

set largest_id=l_id;

end
//
delimiter ;

[/cce_php]

定义查找结束时done 值为1,用是否溢出来判断结束

declare continue handler for sqlstate ‘02000’ set done = 1;

定义一个游标,把找到的值返回游标,类似一个数组:

declare 游标名 cursor for select 列名, 列名 from 表名

open 游标名; 运行游标查询

repeat …. until done and repeat; repeat循环,结尾判断循环条件;

while contition do …. end while; while 循环

loop …. end loop; loop 循环

以上两个循环没有循环条件可使用leave语句退出循环;

fetch 游标名 into 变量1, 变量2; 将游标查询到的两个值传给两个变量;

set 变量1 = 变量2; 将变量2的值传给变量1;

close 游标; 关闭一个游标;

删除一个过程或函数:

drop procedure 过程关键字

drop function 函数名

 

mysql 常用 命令

打开数据库:

use 数据库名;查看数据库的数库表:

show 数据表名;

show databases; 查看服务器上所有的数据库

show tables from 数据库名; 查看某一个数据库的数据表

show tables; 默认为查看当前打开的数据库的数据表

查看某一个数据库下某一个数据表的表结构

show columns from 数据表名 from 数据库名

show columns from 数据库名.数据表名

show columns from 数据表名; 默认为查看当前打开数据库的某一个数据表的表结构;

查看某一个数据表结构:

describe 数据表名;

describe 数据表名 列名;

更新权限:

flush privileges;

查询操作优化:

explain 放在查询命令前可以查看其处理方法

修复数据表

optimize table 数据表名;

数据库备份

mysqldump –opt –all-databases >备份数据库名.sql

在操作系统命令提示符下使用,备份所有数据库。

服务器主从服务器:

设置my.ini或my.cnf文件:

[mysqld]

log-bin

server-id=1

主设置为1 从设置为2,3.。。

 

 

 

mysql 从数库中获取数据

select 从数据库中查找数据并显示:

一. 单表查询显示:

显示一个数据表中对应列名元素:

select 列名1,列名2…..

from 表名;

显示一个数据表中所有列的内容*号为通配符,代表所有:

select *

from 表名;

显示一个数据表中指定条件的列的元素:

select *

from 表名

where 条件;

条件支持以下比较操作符:

= 等于

> 大于

< 小于

>= 大于等于

<= 小于等于

!=或 <> 不等于

IS NOT NULL 不为空

IS NULL 为空

BETWEEN 测试一个值是否大于或等于最小值并小于或等于最大值

IN 是否在一个集合中

NOT IN 是否不在一个集合中

LIKE 是否匹配一个模式 %代表任何数量的字符,_代表一个字符

NOT LIKE 是否不匹配一个模式

REGXP 是否匹配一个常规表达式

OR 或

AND 并且

二. 从多个表中获取数据

1.根据条件从多个表中显示内容

select 表名1.列名1,表名2.列名2…..

from 表名1,表名2…

where 条件;

表名.列名 从当前数据库中取出表中列的内容

数据库名.表名.列名 从指定数据库中取出表中列的内容

从需要调用哪个表就需要 from哪个表

一般条件数比表的总数少一个

倒推条件比下正推条件容易理解:

select customers.name
from customers, books, orders, order_items
where books.title like ‘%Java%’
and books.isbn = order_items.isbn
and order_items.orderid = orders.orderid
and orders.customerid = customers.customerid;

 

三. 数据库左关联

select 表名1.列名1, 表名2.列名2…

from 表名1 left join 表名2

on 条件

使用 left join 把表1和表2关联起来 在on 输入要显示的条件

select 表名1.列名1, 表名2.列名2…

from 表名1 left join 表名2

using (共用列名)

where 条件

使用using 时,多个表必须有相同的列名

使用别名 用表名 as 别名来定义表的别名

select 别名.列名

from 表名.别名(定义别名),同一个表定义两个别名常用对表自身进行查找:

select 别名1.表名,别名2,表名

from 表名 as 别名1,表名 as 别名2

where条件

 

四,数据库关联类型:

笛卡儿乘积 全完关联,所有表所有行的所有关联

交叉关联 可以使用cross join 来定义

内部关联 使用where 条件来定义

等价关联 使用 = 来定义

左关联 使用 left join 或右关联使用 right join

五.对查询到的内容排序

使用order by 子句

select 列名

from 表名

order by 排序列

其中:

order by 排序列 asc (升序,默认为升序)

order by 排序列 desc (降序)

六.分组与合计函数

计算一列的平均值:

select avg(列名)

from 表名;

根据其它列来分组浏览平均值 使用group by 子句,group by 子句后的列名必须在select 中列出:

select 列名1, avg(列名2)

from 表名

group by 列名1

根据其它列来分组浏览平均值,并使用having增加平均值的条件,

select 列名1,avg(列名2)

from 表名

group by 列名1

having 条件

常用合计函数:

avg(列) 计算列的平均值

count(项目) 计算非空的列数,增加distinct 计算不同值的列数,如果是* 计算所有行的行数

MIN 指定列的最小值

MAX 指定列的最大值

STD 指定列的标准背离值

STDDEV 与STD相同

SUN 指定列的和

输出要查询返回的行,使用limit 开始行号, 行数,limit是MYSQL的扩展于RDBMS不兼容:

select 列名

from 表名

limit 开始行号,行数;

七,子查询

把查询结果做为条件,再次进行查询:

案例:

select 列名

from 表名

where 条件 (select 列名 from 表名)

关键子查询:exists 满足条件

例:显示在表1中,满足表2条件的内容

select 列1,列2

from 表1

where exists

(select * from 表2 where 条件)

行子查询,使用 IN 在什么之中

例:

select c1,c2,c3

from t1

where (c1,c2,c3) in (select c1,c2,c3 from t2);

使用子查询内容做为临时表,使用as 临时表名定义

例:

select *

from

(select c1,c2 from t1 where 条件)

as 临时表名;

 

八.更新数据库记录

使用update 命令:

update 表名

set 列名要修改的内容

where 条件

九.修改表

alter table 表名

关键词 值;

关键词:

add 增加列 (first 列之前 after 在列之后)

modify 修改列类型

drop 删除列

change 改列名

rename 重命名一个表

十.删除操作:

delete 删除表中的记录

delete from 表名

where 条件

drop table 表名 删除一个表

drop database 数据库名 删除一个数据库

 

 

 

 

 

 

 

 

 

 

mysql数据库 insert插入命令

insert 插入数据,记录值为字符串需要加单引号或双引号,可以一次插入多行数据,每行数据需要用()括起来,()之间用逗号分开:

1.insert into 表名 values(记录值1,记录值2);

2.insert into 表名(字段名1,字段名2) values(字段值1,字段值2);

3.inset into 表名

set 字段名1 = 字段值1,字段名2=字段值2;

关键字:

low_priority 当数据不是从表格读出时,系统必须等待并且稍后插入

delayed 插入数据将被缓存

ignre 如果重复自动忽略;

案例 book_insert.sql 内容:

[cce_php]

use books;
insert into customers values
(3,’Julie Smith’, ’25 Oak Street’, ‘Airport West’),
(4, ‘Alan Wong’, ‘1/47 Haines Avenue’, ‘Box Hill’),
(5, ‘Michelle Arthur’, ‘357 North Road’, ‘Yarraville’);

insert into orders values
(NULL, 3, 69.98, ‘2007-04-02′),
(NULL, 1, 49.99, ‘2007-04-15′),
(NULL, 2, 74.98, ‘2007-04-19′),
(NULL, 3, 24.99, ‘2007-05-01′);

insert into books values
(‘0-672-31697-8′, ‘Michael morgan’, ‘Java 2 for Professional Developers’, 34.99),
(‘0-672-31745-1′, ‘Thomas Down’, ‘Installing Debian GNU/Linux’, 24.99),
(‘0-672-31509-2′, ‘Pruitt,et al.’, ‘Teach Yourself GIMP in 24 Hours’, 24.99),
(‘0-672-31769-9′, ‘Thomas Schenk’, ‘Caldera Openlinux System Administration Unleashed’, 49.99);

insert into order_items values
(1, ‘0-672-31697-8′, 2),
(2, ‘0-672-31769-9′, 1),
(3, ‘0-672-31769-9′, 1),
(3, ‘0-672-31509-2′, 1),
(4, ‘0-672-31745-1′, 3);

insert into book_reviews values
(‘0-672-31697-8′, ‘The Morgan book is clearly written and goes well beyond most of the basic Java books out there.’);

[/cce_php]