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]

 

PHP 普通访问控制

普通访问控制案例:

[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=”secret.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 if (($name = ‘user’) && ($password = ‘pass’)) {
echo “<h1> Here it is!</h1>
<p>I bet you are glad you can see this secret page.</p>”;
} else {
echo “<h1>Go Away!
<p>You are not authorized to use this resource.<p>”;
}
?>

[/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.。。

 

 

 

PHP 从web 访问 mysql 插入 案例

插入执行 文件 insert_book.php

[cce_php]

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Book-O-Rama Book Entry Results</title>
</head>

<body>
<h1>Book-O-Rama Book Entry Results</h1>
<?php
// create short variable names
$isbn = $_POST[‘isbn’];
$author = $_POST[‘author’];
$title = $_POST[‘title’];
$price = $_POST[‘price’];

//判断以上输入数据是否存在
if (!$isbn || !$author || !$title || !$price) {
echo “You have not entered all the required details.<br />”.”Please go back and try again.”;
exit;
}
//对输入数据进行格式化
if (!get_magic_quotes_gpc()){
$isbn = addslashes($isbn);
$author = addslashes($author);
$title = addslashes($title);
//doubleval 将$price 转化为浮点数
$price = doubleval($price);
}
@ $db = new mysqli(‘localhost’, ‘bookorama’, ‘bookorama123′, ‘books’);

//判断链接是否成功
if (mysqli_connect_errno()) {
echo “Error: Could not connect to database. Please try again later.”;
exit;
}
//数据库插入命令
$query = “insert into books values (‘”.$isbn.”‘,'”.$author.”‘,'”.$title.”‘,'”.$price.”‘)”;

//执行数据库插入
$result = $db -> query($query);

//判断插入是否成功,并显示条数
if ($result){
echo $db->affected_rows.” book inserted into database.”;
} else {
echo “An error has occurred. The iten was not added.”;
}
$db->close();
?>
</body>
</html>

 

[/cce_php]

 

HTML 页面 newbook.html

[cce_php]

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Book-O-Rama – New Book Entry</title>
</head>

<body>
<h1>Book-O-Rama – New Book Entry</h1>

<form action=”insert_book.php” method=”post”>
<table border=”0″>
<tr>
<td>ISBN</td>
<td><input type=”text” name=”isbn” maxlength=”13″ size=”13″ /></td>
</tr>
<tr>
<td>Author</td>
<td> <input type=”text” name=”author” maxlength=”30″ size=”30″ /></td>
</tr>
<tr>
<td>Title</td>
<td> <input type=”text” name=”title” maxlength=”60″ size=”30″ /></td>
</tr>
<tr>
<td>Price $</td>
<td> <input type=”text” name=”price” maxlength=”7″ size=”7″ /></td>
</tr>
<tr>
<td colspan=”2″> <input type=”submit” value=”Register” /></td>
</tr>

</table>
</form>
</body>
</html>

 

[/cce_php]

 

PHP 从web 访问 mysql 查询 案例

案例 查询数据库内容:results.php内容

[cce_php]

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Book-O-Rama Search Results</title>
</head>

<body>
<h1>Book-O-Rama Search Results</h1>
<?php
// create short variable names
$searchtype = $_POST[‘searchtype’];
//去除字串searchterm开始和结束的空白字串
$searchterm = trim($_POST[‘searchterm’]);

//判断用户输入内容是否存在
if (!$searchtype || !$searchterm) {
echo ‘You have not entered search datails. Please go back and try again.';
exit;
}
//判断magic_quotes_gpc是否为打开,如果未打开使用addslashes进行转义
if (!get_magic_quotes_gpc()){
$searchtype = addslashes($searchtype);
$searchterm = addslashes($searchterm);
}

//链接数据库 最好以@开始
@ $db = new mysqli(‘localhost’, ‘bookorama’, ‘bookorama123′, ‘books’);

//判断链接数据库是否成功
if (mysqli_connect_errno()){
echo ‘Error: Could not connect to database. Please try again later.';
exit;
}

//数据库查询条件
$query = “select * from books where “.$searchtype.” like ‘%”.$searchterm.”%'”;

//执行数据库查询
$result = $db->query($query);

//返回查询结果行数
$num_results = $result->num_rows;

//输出查询结果行数
echo “<p> Number of books found: “.$num_results.”</p>”;

for ($i=0; $i <$num_results; $i++) {
//返回当前记录内容为row数组,字段名为元素名,字段值为元素值,也可使用 fetch_row返回数组:字段名为0,1递增,也可以使用fetch_object返回为对像,$row->title调用 并自动下移指针
$row = $result->fetch_assoc();
echo “<p><strong>”.($i+1).”.Tile: “;
echo htmlspecialchars(stripslashes($row[‘title’]));
echo “</strong><br />Auhtor: “;
echo stripslashes($row[‘author’]);
echo “<br />ISBN: “;
echo stripslashes($row[‘isbn’]);
echo “<br />Price: “;
echo stripslashes($row[‘price’]);
echo “</p>”;
}
//释放结果,关闭数据库,一般会自动关闭;
$result->free();
$db->close();

?>
</body>
</html>

[/cce_php]

查询数据库 HTML search.html

[cce_php]

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Book-O-Rama catalog Search</title>
</head>

<body>
<h1>Book-O-Rama Catalog Search</h1>

<form action=”results.php” method=”post”>
Chose Search Type:<br />
<select name=”searchtype”>
<option value=”author”>Author</option>
<option value=”title”>Title</option>
<option value=”isbn”>ISBN</option>
</select>
<br />
Enter Search Term:<br />
<input name=”searchterm” type=”text” size=”40″ />
<br />
<input type=”submit” name=”submit” value=”Search” />
</form>
</body>
</html>

[/cce_php]

 

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]

 

mysql数据库登陆设置命令

1.在系统环境变量中设置path

2.在cmd命令提示符下使用:mysql -h 主机名 -u 用户名 -p 在登陆后会提示输入密码

3.创建一个数据库:create database 数据库名; 在每个数据库结尾需要输入分号(;)

4.创建一个用户和其权限

用户权限:

select 选择

insert 插入

update 修改

delete 删除

index 创建索引

alter 改变

create 创建新的数据库或表

drop 移动或删除数库或表

all可以代表所有权限

usage 仅可以登陆权限

创建一个用户:

grant 权限名(使用,号分隔)

on 数据库名.*

to 用户名 identified by ‘用户密码';

增加用户权限

grant 权限名(使用,号分隔)

on 数据库名.*

to 用户名;

减少用户权限

revoke 权限名

on 数据库名.*

from 用户名

删除用户:

revoke all

on 数据库名.*

from 用户名

5.使用数据库

use 数据库名

或在登陆时使用

mysql -d 数据库名 -h 主机名 -u 用户名 -p

6.创建数据表:

在使用提示符下使用以下命令:

mysql -h 主机名 -u 用户名 -D 数据库名 -p < 数据库文件名.sql

以下为数据库文件案例:

[cce_php]

create table customers
( customerid int unsigned not null auto_increment primary key,
name char(50) not null,
address char(100) not null,
city char(30) not null
);

create table orders
( orderid int unsigned not null auto_increment primary key,
cusomerid int unsigned not null,
amount float(6,2),
date date not null
);

create table books
( isbn char(13) not null primary key,
author char(50),
title char(100),
price float(4,2)
);

create table order_items
( orderid int unsigned not null,a
isbn char(13) not null,
quantity tinyint unsigned,
primary key (orderid, isbn)
);

create table book_reviews
( isbn char(13) not null primary key,
review text
);

[/cce_php]

create table 数据表名 创建一个新的数据表

数据类型

int 整数

char(数字) 字符(宽度)

text 文本

float(宽度,小数点位数) 浮点小数

date 日期

varchar 根据需要分配字符空间,速度较慢

参数

not null 不为空值 使其它速度更快

auto_increment 自动增加,此列必须为索引列

primary key 主键,输入必须唯一或primary key(主键名)创建多列主键

unsigned 无符号整数,0以上数

tinyint unsigned 小整数0-255

 

7.显示数据库,数据表,查看表内容

show databases; 显示数据库 需要有显示数据库权限

show tables; 显示数据库名下的数据表,需要打开use 数据库。

discribe 数据表名 显示指定数据表内容结构

create index 创建索引

8.mysql 标识符:

database 长度64位 不包括“/ \ .”

table 长度64位 不包括“/ \ .”

column 长度64 任何字符

index 长度64 任何字符

alias 任何字符

9.列的数据类型:

数字类型:

tinyint(m) -127..128 或 0-255 非常小的整数

bit 同tinyint

bool 同tinyint

smallint(M) -32768..32767 或 0..65535 小整数

mediumint(m) -8388608..8388607 或0..16777215 中型整数

int(M) -2的31次方到2的31次方-1 或0到2的32次方-1 一般整数

integer(m) 同int

bigint(M) -2的63次方到2的63次方-1 或0到2的64次方-1

浮点数类型

float(精度) 可用于单精度或双精度

float[(M,D)] 单精度浮点数,可以指定长度或小数位数 正负1.17544351E-38 或正负3.402823466E+38

duble[(M,d)] 双精度浮点数,可以指定长度或小数位数 正负1.17976931348623157E+308 或正负2.2250738585072014E-308

double 同 duble[(M,d)]

precision 同 duble[(M,d)]

real 同 duble[(M,d)]

decimal[M,(d)] 浮点数,以char来存储 可以定义宽度

numeric 同 decimal[M,(d)]

dec 同 decimal[M,(d)]

fixed 同 decimal[M,(d)]

日期和时间类型:

date 1000-01-01 到 9999-12-31 日期 以YYYY-MM-DD显示

time -838:59:59 到838:59:59 时间 以HH:MM:SS 显示

datetime 1000-01-01 00:00:00 到9999-12-31 23:59:59 时期和时间 以YYYY-MM-DD HH:MM:SS来显示

timestamp(2-14) 显示时间 从年位开始显示2-14位时间

year(2/4) 显示年份,2位年份70-69年 四位年份1901-2155年

字符串类型:

char(M) 指定长度字串M值 0-255位

关键字: national 使用默认字符符 binary 区分大小写(默认区分大小写) ascii 使用latinl字符集 unicode 使用 ucs 字符集 varchar 可变长度 1-255个字符。

text 长文本类型,区分大小写

blob 大二进制对像,不区分大小写,可用来保存图像或声音

tinyblob 255位 小二进制大对像字段

tinytext 255位 小text字段

blob 65535位 常规大小

text 65535位 常规大小

mediumblob 16777215位 中型大小

mediumtext 16777215位 中型大小

longblob 4294967295位 长BLOB字段

longtext 4294967295 位 长TEXT字段

set 值来自一个指定集合,最大有64个元素

enum 值来自一个指定集合,最大有65535个元素