php数据库编程
php数据库编程:
目前动态网站都是基于数据库,将网站内容使用数据库管理系统去管理
用户,栏目,图片,文章,评论都是存储在数据库中
php+mysql 黄金搭档
mysql架构:
c/s client/server
mysql端口号是3306
mysql DBMS
客户端 服务器--数据库--数据表--(记录,字段)
程序员需要做到的:
1.为你的项目设计表
2.使用sql语句(sql编程)
目录结构:
my.ini bin/ data/
2.创建数据库
SQL(structured Query Language)
DDL
create database 库名
create table [库名.]表名 use库名
drop database 库名
drop table 表名
DML
insert into users(id,name) values('1','yanlei');
update users set name='aa',age='10' where id='1';
delete from 表名 where id='2';
DQL
select * from 表名;
DCL
\s 看状态
show databases 看所有库
show tables 看所有表
desc 看表结构
show variables 配置文件中的变量
DDL
CREATE TABLE [IF NOT EXISTS] 表名称(
字段名1 列类型 [属性] [索引]
字段名2 列类型 [属性] [索引]
)[表类型][表字符集];
需要自己定义名称的 是表名和字段名
SQL语句是不区分大小写的,表名就是一个文件名,windows不区分大小写,linux区分
1.一定要有意义(英文或英文组合和多个单词的缩写)
2.自己定的名称最好都小写
3.SQL都大写
数据值和列类型:
都是按空间大小来区分的
1.数值型
2.字符型
char 空间固定 255
varchar 可变长度 255
text 文本数据(文章,日记)
blob 保存二进制数据 (照片,压缩包)
3.日期型
DATE YYYY-MM-DD
TIME hh:mm:ss
DATETIME YYYY-MM-DD hh:mm:ss
TIMESTAMP YYYYMMDDhhmmss
YEAR YYYY
数据字段属性:
1.unsigned 可以让空间增加一倍,(无符号字段)
只能用在数值型;(没用负值是可以用)
2.zerofill
只能用在数值型字段,前导0
该字段自动应用unsigned
3.AUTO_INCREMENT
只能是整数,数据每增加一条就会自动加一,字段的值是不允许重复
NULL 0 留空都会在原基础上加一;
4.NULL和NOT NULL
默认是空
NULL值
尽量在创建表的时候每个字段都不要插入NULL
5.default缺省值 (默认)
可以与NOT NULL配合使用 当不插入值时 就用缺省值;
CREATE TABLE yan(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
height DOUBLE(10,2) NOT NULL DEFAULT 0.00
);
创建索引:
1.主键索引
主要作用是确定数据库表里一条特定数据记录的位置
最好为每一张数据表定义一个主键
一个表只能指定一个主键
主键的值不能为空
2.唯一索引
都可以防止创建重复的值
每一个表都可以有多个唯一索引
(unique)
3.常规索引
最重要的技术
提升数据库的性能
可以提高查找的速度,减慢数据列上插入,删除,修改速度
和表一样是独立的数据对象
可以单独使用
也可以再创建表的时候创建
index与key是同义词;一样的
index 索引名(字段名)||key 索引名(字段名)
删除索引:drop index 索引名 on 所在表名;
多列都可以创建常规索引;
4.全文索引
fulltext类型索引,MYISAM表类型使用,只有在char
varchar,text文本字符串上使用,也可以多个数据列使用
数据表类型及存储位置
mysql和大多数数据库不同,mysql有一个存储引擎概念;
mysql可以针对不同的存储引擎需求可以选择最优的存储引擎
引擎 数据表类型
12中学的有:myisam和 innodb
语法:create table ()type= innodb;
create table() engine= innodb;
myisam 表类型是默认的;
注意:在一个mysql库中可以(创建表时)指定不同表类型
myisam 表类型(强调快速读取操作)
要用OPTIMIZE TABLE 表名 ,用于整理更新操作产生的碎片;
有些功能不支持(如不支持外键)
innodb 表类型
支持一些myisam所不支持的功能
占用空间大,
如何选择:(一个数据库中可以有不同表类型的表存在)
功能 MYISAM INNODB
事务处理 NO YES
数据行锁定 NO YES
外键约束 NO YES
表空间占用 相对小 相对大 最大2倍
全文索引 YES NO
MYSQL默认字符集:
ACSII,ISO-8859-1/latin1
汉字:gb2312-80(不推荐使用),gb13000(不推荐)
GBK(可以用),GB18030(数据库支持还比较少见)
支持用的:
UTF-32,UTF-2,UTF-16,UTF-16,UTF-8(强烈推荐)
GBK 2字节 UTF8 3字节
name varchar(12) 6个汉字 GBK
name varchar(12) 4个汉字 UTF-8
数据库中的UTF-8,没有- ,是utf8;
客户端与服务器交互时:
set names 字符集 修改字符集
修改表
alter table 表名 动作
如:alter table yan add name varchar(12) not null;
更改:alter table yan modify sex char(3);(类型)
alter table yan change name username varchar(30);(能改列名)
alter table yan rename as lei;(改表名)
插入表数据insert
语法:insert into 表名 values ("","",);
所有需要写字段名的地方都不加单引号或者双引号,但所有值建议都要以字符
形式使用
update 表名 set 字段=‘值’[条件] 条件是确定要更改的记录,可以通过
条件指定一条也可以指定多条
delete from 表名 [条件]
where
select
都可以使用 各种运算符号(可以把字段当做一个变量)
语法:
SELECT [ALL][DISTINCT] //distinct 作用整个查询列表取消重复的数据
{*|table.*|[table.]field1[as alias1].....}
FROM 表名[]
[WHERE.....]
[GROUP BY...]
[HAVING....]//分组后给的条件
ORDER BY
LIMIT
使用SELECT查询语句,目的就是可以按你的想法将数据查出来,将结果
返回给你;
在SQL语句中使用表达式的列(算术运算符号,可以使用条件,逻辑运算符)
WHERE可以再SELECT UPDATE DELETE 使用
&&(AND) ||(OR) !(NOT)
=,!= <>,<,<=,IS NULL,IS NOT NULL,
BETWEEN AND,(包括边界)
LIKE,NOT LIKE(模糊查询,_(任意一个字符)和%(任意多个字符)
两个通配符号)
IN,(一个范围列表)
REGEXP RLIKE;
<=>(和=作用一样,可以比较出NULL值,=不可以)
多表查询(连接查询 起别名,简化):
order by 字段 [asc正序]desc倒序 (排序);
limit 0,n;取查询结果的个数 从0开始取,取到第n个;
count() 总数,sum()总和,avg()平均值,max()最大值,mix()最小值;
php有三种方式来操作我们的mysql数据库
1.mysql扩展库
2.mysqli扩展库
3.pdo
mysql_insert_id();id的最后值;
mysql_affected_rows();影响行数;
mysql_close;关闭数据库连接;
mysql扩展库与mysql数据库的区别:
1.mysql数据库是用于存放数据
2.mysql数据库的三层结构 客服端—>dbms->数据对象
使用php的mysql扩展库完成对mysql 操作;
启用mysql扩展库
创建一张用户表,
<?php
$conn=mysql_connect("localhost","root","") or die ('数据库连接失败');
mysql_select_db("yanlei",$conn);
mysql_query("set name utf8");
$sql="select * from user1";
$rel=mysql_query($sql,$conn);
//var_dump($rel);
while($row=mysql_fetch_row($rel)){
foreach ($row as $key => $val){
echo "$key = $val"."<br/>";
}
}
//释放资源,关闭连接
mysql_free_result($rel);
mysql_close($conn);
?>
细节:
1.使用完$rel结果集后,一定要及时释放资源
2.mysql_close($conn)没有的话,也系统也会自动关闭
$row =mysql_fetch_row($rel);二维数组,指向返回的的数组的下一行;
mysql_fetch_row($rel),返回的是一个索引数组(推荐使用)[0=>$val]
mysql_fetch_assoc($res),返回一个关联数组 ['id'=>$val]
mysql_fetch_array($res),返回索引数组和关联数组()两套
mysql_fetch_object($res),返回一行数据,当做一个对象返回;
将数据库的操作,封装成一个工具类,名字:sqltool.class.php
mysqli扩展库:
有俩套风格,面向对象 面向过程(照顾老程序员)
在php.ini文件中启用mysqli扩展库
//mysqli操作mysql数据库(面向对象风格)
//创建mysqli对象
$mysqli=new MYSQLI("localhost","root","","yanlei");
//验证是否OK
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
//操作数据库(发送sql)
$sql="select * from user1 where id=5";
//$res 是结果集 .mysqli result
$res=$mysqli->query($sql);
//var_dump($res);
//处理结果 mysql_fetch_row()
while ($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>";
}
//关闭资源
$res->free();
$mysqli->close();
在mysqli 释放结果集有3种方式,
mysqli_result::free()
mysqli_result::close()
mysqli_result::free_result()
批量处理DML
$sqls="sql语句1;sql语句2";
myslqi::multi_query($sqli)
批量处理DQL
$sqls="sql语句1;sql语句2";
myslqi::multi_query($sqli)
$result=$mysqli->store_result();
事务处理:
我们有时需要一组数据同时成功或同时失败,一保持事物的一致性;
如:网上转账,
//将提交设为false
$mysqli->autocommit(false);
.....//处理程序
if(!$b1||!$b2){
//回滚
$mysqli->rollback();
}else{
//提交
$mysqli->commit();
}
$mysqli->close();
在mysql控制台可以使用事务来操作,如:
1.开启一个事务
start transaction
2.做保存点
savepiont 保存点名称
3.操作。。。。。
4.可以回滚,可以提交
没有问题
commit
有问题
rollback to 保存点名称
事务的acrd
原子性,一致性,持久性,隔离性
mysqli扩展库的 预处理技术 mysqli stmt:
<?php
//预编译
//1.创建mysqli 对象
$mysqli=new MYSQLi("localhost","root","","yanlei");
//2.创建预编译对象
$sql="insert into user1 (name,password,email,age) values(?,?,?,?)";
$mysqli_stmt=$mysqli->prepare($sql);
//参数绑定->给?赋值这里类型和顺序都要对应;
$mysqli_stmt->bind_param("sssi",$name,$password,$email,$age);
//绑定参数
$name="小倩";
$password="xiaoqian";
$email="yanell@qq.com";
$age="200";
//执行
$b=$mysqli_stmt->execute();
//继续添加
$name="妖怪";
$password="yaoguai";
$email="yjlj@qq.com";
$age="1010";
//执行
$b=$mysqli_stmt->execute();
if(!$b){
die("操作失败".$mysqli_stmt->error);
}else{
echo "操作OK";
}
//释放资源
$mysqli->close();
?>
DQL预编译:
<?php
//预编译演示
//需求:请使用预处理的方式,从数据库查询
//使用预处理的方式,查询所有id>5的用户的id,name,email
$mysqli=new MYSQLi("localhost","root","","yanlei");
if(mysqli_connect_error()){
die(mysqli_connect_error());
}
//创建一个预定义的对象,?占位
$sql="select id,name,email from user1 where id>?";
$mysqli_stmt=$mysqli->prepare($sql);
//绑定参数
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$email);
$id=5;
//执行
$mysqli_stmt->execute();
//取出绑定值
while($mysqli_stmt->fetch()){
echo"<br/>-----$id----$name----$email";
}
echo "<br/>**********************";
$id=10;
//执行
$mysqli_stmt->execute();
//取出绑定值
while($mysqli_stmt->fetch()){
echo"<br/>-----$id----$name----$email";
}
//关闭资源
//释放结果
$mysqli_stmt->free_result();
//关闭预编译语句
$mysqli_stmt->close();
//关闭连接
$mysqli->close();
?>
预编译可以防止SQL注入攻击;
mysqli中的方法和属性:
<?php
function showtable($table_name){
$mysqli=new MYSQLi("localhost","root","","yanlei");
if(mysqli_connect_error()){
die(mysqli_connect_error());
}
$sql="select * from $table_name";
$res=$mysqli->query($sql);
//如何获取总行数和列数
echo "有行数".$res->num_rows."-列=".$res->field_count."<br/>";
echo "<table border='1'><tr>";
while($head=$res->fetch_field()){
echo "<th>{$head->name}</th>";
}
echo "<tr/>";
//循环取出数据
while($row=$res->fetch_row()){
echo "<tr>";
foreach($row as $key=>$val){
echo "<td>{$val}</td>";
}
echo "</tr>";
}
echo "</table>";
$res->free();
$mysqli->close();
}
showtable("user1");
?>
浙公网安备 33010602011771号