《php与mysql权威指南》第三部分01
第三部分 mysql篇
第11章 mysql部署与基本使用
11.1 mysql概述
11.2 登录与退出mysql
mysql -h主机地址 -u用户名 -p用户密码
11.3 创建、删除数据库和用户
创建:create datebase [if not exists] db_name
删除:drop database [if not exists] db_name
创建新用户:create user user[identified by [password] 'password'][,user2 [identified by [pssword] 'password']]..
11.4 mysql用户管理及权限分配
mysql安装好之后有默认三个数据库
mysql:存放用户及权限相关信息
test:供用户测试用的数据库
information_schema:提供数据库其他信息(字符集,存储引擎,全局变量,数据库各表的行数及表的大小统计信息等)
mysql访问权限系统:mysql数据库
user表:全局级的,存放允许链接故武器的用户信息
db表:数据库级的存放哪个用户可以从哪些主机以哪些权限来操作哪些数据库
host表:db表的扩展,提供另外一些主机名
table_priv表:数据表级别的,设置的权限只能作用于给定数据表中的所有列
columns_priv表;数据列级别的,设置的权限只能作用于给定数据表中的特定列
procs_priv表:控制存储过程时使用
...
设置用户权限:最少权限原则
设置权限:grant 权限 on 表 to 用户@主机 identified by 用户
收回权限:revoke 权限 from 用户
删除用户:delete from user where user='用户名';
更新重新加载权限表:
---
flush privileges;
---
修改密码:
update user set password=password('密码') where user='用户名';
grant usage on *.* to '用户名' identified by '密码';
改密码后停止mysql进程,开启进程,刷新内存
---
mysqld --skip_grant_tables
mysql -u root
mysql>flush privileges
---
查找mysql的进程id号命令
---
ps aux|grep mysqld
---
11.5 mysql优化
选取最适用的字段属性
连接负载:back_log参数
最大并发连接数--->查看:max_used_connection或show status
守护进程用户:守护进程应当按非root用户的权限运行
---
.bin/mysqld_safe -user=user1 &
---
权限:经常使用简化权限来提高查询速度
使用json代替子查询的subqueries
表的优化
语句:optimize table tablename:修复数据
命令:myisamchk -r table
使用union代替手动创建的临时表
使用索引:所有的类类型都可以被索引。explain命令可以检索该索引是否正在使用中。索引提高select操作性能,降低插入删除等性能
优化的查询语句:避免查询中mysql进行自动类型转换(转换过程使索引对于优化查询无效)
使用默认值,减少insert语句所花的时间
第12章 数据库操作:PHP+mysql
12.1 mysql扩展
数据库连接:
mysql_connect():打开连接;mysql_close():关闭连接
mysql_pconnect():打开持久连接,mysql_close()不会关闭该连接
mysql_select_db('database');//选择数据库
$result=mysql_query('select * from table');
while($row=mysql_fetch_array($result,Mysql_assoc)){
print_r($row);//打印每一行数据
}
# mysql_fetch_array()以一个常量表示所返回数组的类型-->mysql_assoc->关联数组,mysql_num->索引数组,mysql_both->关联数组与索引数组混合的数组
# mysql_fetch_object():将每行的数据封装成一个对象
插入数据
创建表:
-----
create table 'table'(
'id' int(11) not null auto_increment primary key,
'title' varchar(20) not null,
...
)engine=InnoDB
-----
12.2 mysqli扩展
PHP.ini开启mysqli扩展:extension=php_mysqli.dll,
开启mysqli扩展的好处:更好的兼容性,全面支持面向对象,更快的速度,更好的安全性,支持预准备语句,改进调试功能
mysqli面向对象和面向过程编程方式
面向过程就是分析出解决问题所需要的步骤然后一步一步去实现,使用时只要一个一个一次调用即可
面向对象是以功能来划分的
1.面向对象示例代码:
-----
<?php
$mysqli=new mysqli('localhost','root','root','exer');
$query='select * from messages';
$mysqli->quert('set names utf8');
$result=$msyqli->query($query);
if($result){
while($obj=$result->fetch_object()){
var_dump($obj);
}
}else{
echo '失败';
}
$result->free();
$mysqli->close();
?>
-----
2.面向过程示例代码:
-----
<?php
$conn=mysqli_connect('localhost','root','root','exer');
if($conn){
mysqli_query($conn,'set names utf8');
$query='select * from messages';
$result=mysqli_quert($conn,$query);
while($obj=mysqli_fetch_object($result)){
var_dump($obj);
}
}else{
echo '链接失败';
}
myslqi_free_result($result);
mysqli_close($conn);
?>
-----
预准备语句:prepare-->提高语句重复使用的性能,提高数据库安全性
prepare()->进行预准备语句查询;execute()->执行该语句
1.绑定结果
-----
<?php
$mysqli=new mysqli('localhost','root','root','exer');
$mysql->set_charset('utf8');
$query='select * from messages';
$result=$mysqli->prepare($sql);
$result->execute();
$result->bind_result($id,$title,$name,$message,$date);
while($result->fetch()){
print_r($id.$title.$name.$message.$date);
}
$result->close();
$mysqli->close();
?>
-----
2.绑定参数:bind_param($format,$types,$v1,$v2...)
-----
<?php
$mysqli=new mysqli('localhost','root','root','exer');
$mysql->set_charset('utf8');
$query='insert into message values(?,?,?,?,?)';
$result=$mysqli->prepare($sql);
$id=null;$title='标题';$message='信息';$name='名字';$date=null;
$result->bind_param('issss',$id,$title,$name,$message,$date);//绑定参数
$result->execute();
$result->close();
$mysqli->close();
?>
-----
# 其中issss为后面参数的类型,id为i->int类型,s->string,D->double,b->bool
多查询:multi_query()->多个之间用;连接,
用use_result()|store_result()读取,其中use_result()更快
用more_result()查询是否还有其他结果集
用next_result()获取下一个结果集
12.3 数据库抽象层:PDO|ADODB->为解决数据库从一个数据库系统一直到另一个数据库系统的麻烦而产生的API
关系型数据库->mssql,mysql,oracle
PDO:编码一致性、灵活性、面向对象特性、高性能
开启:extension=php_pdo_mysql.dll
1.连接并查询数据库:构造函数中只需要三个参数就可以建立连接
-----
<?php
$dsn="mysql:dbname=exer;host=localhost";
try{
$pdo=new PDO($dsn,'root','root');
$sql='select * from message';
$pdo->query('set names utf8');
foreach($pdo->query($sql) as $row){
var_dump($row);
}
}catch(PDOException $e){
echo '连接失败';
var_dump($e);
}
?>
-----
# 增删改操作用exer()方法
2.取得返回结果
-----
<?php
$dsn="mysql:dbname=exer;host=localhost";
try{
$pdo=new PDO($dsn,'root','root');
$sql='select * from message';
$pdo->query('set names utf8');
$result=$pdo->query($sql);
while($row=$result->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
}catch(PDOException $e){
echo '连接失败';
var_dump($e);
}
?>
-----
# fetch()通过参数来控制数组输出的方式,默认参数为FETCH_BOTH
# fetchAll()获取一个包含所有结果的数组
# fetchColumn()获取结果集指定列的值
3.PDO错误处理:
errorCode();错误码
errorInfo();错误信息
ADODB
1.安装
2.连接数据库
$conn=NewADOConnection('mysql');
$conn->Connect($db_host,$db_user,$db_pwd,$db_name);
# 用Close()关闭数据库的连接
3.使用ADODB执行查询
-----
<?php
require_once 'adodb5/adodb.inc.php';
$conn=NewADOConnection('mysql');
$conn->Connect($db_host,$db_user,$db_pwd,$db_name);
$conn->Execute('set names utf8');
$result=$conn->GetArray('select * from message');
while(!result->EOF){
var_dump($result);
$result->MoveNext();//移动到下一条记录
}
?>
-----
# 跟踪和调试:$conn->debug=true;
4.执行增删改查:
-----
<?php
require_once 'adodb5/adodb.inc.php';
$conn=NewADOConnection('mysql');
$conn->debug=true;
$conn->Connect($db_host,$db_user,$db_pwd,$db_name);
$name='name';
$title='title';
$message='message';
$sql='insert into message values(null,...)';
$rs=$conn->Execute('set names utf8');
$rs=$conn->Execute($sql);
var_dump($rs)
?>
-----
5.公用变量
$ADODB_COUNTERCS
$ADODB_CACHE_DIR:存储的数据保存在指定的文件夹中
$ADODB_GETCH_MODE:结果集以哪种方式将数据传给数组
6.有用函数
GetMenu():建立下拉菜单
Render():分页
第13章 mysql中sql语句的应用
13.1 slq语句基本应用:增删改查
13.2 Max():
常数列的最大值:select max(price) as price from shop;
拥有某列最大值的行:select article,price from shop where price=(select max(price) from shop);
按组排列最大值:select article,max(price) as price from shop group by article;
提取某列在组间最大值:select articel,dealer,price from shop s1 where price=(select Max(s2.price) from shop s2 where s1.article=s2.article);
13.3 使用用户变量:清空用户变量来记录结果,而不必将它们保存到客户端的临时变量中
select @min_price:=min(price),@max_price:=Max(price) from shop;
13.4 使用AUTO_INCREMENT
13.5 常用字符串函数
1.concat(str1,str2...);//返回参数连接的字符串,参数可以是字段名|格式化字段表达式|普通字符串等
2.concat_ws(分隔符,str1,str2..);//返回用分隔符分隔的参数连接的字符串,参数可以是字段名|格式化字段表达式|普通字符串等
3.length(str);//返回字符串的字符长度,1个汉字算3个字符--->char_length(str);//多字节字符仅计算一次
4.left(str,len);//返回字符串str最左边的len个字符(汉字算一个)
5.right(str,pos);//返回字符串str最右边的len个字符(汉字算一个)
6.substring(str,pos);//返回从字符串str的pos位置开始到最后的子串
7.replace(str,from_str,to_str);//替换str
8.repeat(str,count);//重复字符串
9.reverse(str);//字符串翻转
13.6 日期和时间函数
1.to_days(date);//返回从0年到date的天数
2.current_date()|current_time();//取得当前的日期和时间
3.from_unixtime()|unit_timestamp();//时间戳转换
4.utc_date(),utc_time(),utc_timestamp();//获取当前utc的日期时间
5.year(),month(),day(),hour(),minite(),second();//返回所需的时间
6.adddate(time字段,num);//起始时间加上num天
7.subdate(time字段,num);//起始时间减去num天
8.datediff(d1,d2);//d1-d2的天数
13.7 导入数据
1.load date infile;//将定界文本文件导入到mysql表中
使用时设置local-infile=0选项启动mysql守护进程
示例:LOAD DATA LOCAL INFILE 'shp.txt' INTO TABLE shop FILELDS TERMINATEA BY ',' ENCLOSED BY '\' ECSAPED BY '\\' LINES TERMINATED BY '\n';
2.mysqlimport
---
mysqlinmport [options] database textfile [textfile2,...]
---
13.8 导出数据
1.select into outfile;//将查询导出到文本文件中
2.mysqldump命令:mysqldump -h host -uroot -ppass dbname table>table.sql;