### PHP数据库编程
PHP有三种方式来操作我们的数据库:
1、mysql扩展库
2、mysqli扩展库
3、pdo
### mysql扩展库和mysql数据库的区别
下面就来mysql扩展库来介绍 :
1、mysql数据库是用来存放数据的
2、mysql数据库的三层结构示意图:
所有数据库基本上都遵循这三种结构 ,
![](https://box.kancloud.cn/2016-06-03_5750fd8eca8aa.jpg)
3、mysql扩展库是一堆函数,是PHP设计者提供给程序员完成对mysql数据库的各种操作(CRUD)
### 使用PHP的mysql扩展库完成对数据库的操作:
1、环境搭建
1.1 启用mysql扩展库
在PHP.ini文件中去配置mysql扩展库
extension=php_mysql.dll extension=php_mysqli.dll
我们可以通过<?php phpinfo();?> 来查看目前支持哪些库功能
1.2 创建一张用户表,供我们使用
~~~
create table user1(
id int primary key auto_increment,
name varchar(32) not null,
password varchar(64) not null,
email varchar(128) not null,
age tinyint unsigned not null
)
~~~
### 插入数据
~~~
insert into user1(name,password,email,age) value('jsh',md5('123456'),'1234567@qq.com',20)
~~~
这里我们对密码进行了加密
当我们将用户名是汉字时,回报错误,需要进行设置
![](https://box.kancloud.cn/2016-06-03_5750fd8ee848d.jpg)
![](https://box.kancloud.cn/2016-06-03_5750fd8f12c67.jpg)
### 下面是具体的例子:
~~~
<?php
//mysql 扩展库曹总mysql数据库步骤
//1 获得链接,疑问?密码在哪设置的???
$conn=mysql_connect("192.168.1.110:3306","root","");
if (!$conn){
die("连接失败".mysql_error());
}else{
echo "连接成功<br/>";
}
//2 选择数据库
mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());
//3 设置操作编码(可选)
//mysql_query("set names utf8");
//4 发送指令
$sql="select *from user1";
$result = mysql_query($sql,$conn) or die("Invalid query: " . mysql_error());
//5 接受返回结果,并处理
while($row= mysql_fetch_row($result)){
//第一种遍历方法
//echo "--$row[0]--$row[1]--$row[2]--$row[3]--$row[4]<br/>";
//第二种遍历方法
foreach($row as $key=>$val){
echo "--$val";
}
echo "<br/>下一行:<br/>";
}
//6 释放资源,关闭连接
//释放内存,这个必须要,释放的内存资源
mysql_free_result ($result);
//这个可有可无,但是建议有,没有的话,运行完毕也会关闭!
mysql_close($conn);
?>
~~~
打印内容:
~~~
连接成功
--1--jsh--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20
下一行:
--2--??--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20
下一行:
~~~
![](https://box.kancloud.cn/2016-06-03_5750fd8f2c551.jpg)
### 细节:
1、$reslust 使用完毕,一定要进行释放
2、 mysql_close()如果没有的话,系统也会自动关闭
3、 从$reslust 获取行数据的时候,处理函数mysql_fetch_row($reslust)返回索引数组,还有三个方法
(1) mysql_fetch_assoc() 返回一个关联数组:
是按照表单元素名排序
~~~
while($row= mysql_fetch_assoc($result)){
echo $row["id"]." ".$row["name"]." ".$row["password"]." ".$row["email"]." ".$row["age"];
echo "<br/>下一行:<br/>";
}
~~~
结果如下:
1 jsh e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:
2 ?? e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:
(2)mysql_fetch_array($result) 返回关联数组或者索引数组。这个要比上面2个都慢,一般不建议使用
~~~
while($row= mysql_fetch_array($result)){
var_dump($row);
echo "<br/>下一行:<br/>";
}
~~~
结果如下:
~~~
array(10) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(3) "jsh" ["name"]=> string(3) "jsh" [2]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" [3]=> string(14) "1234567@qq.com" ["email"]=> string(14) "1234567@qq.com" [4]=> string(2) "20" ["age"]=> string(2) "20" }
下一行:
array(10) { [0]=> string(1) "2" ["id"]=> string(1) "2" [1]=> string(2) "??" ["name"]=> string(2) "??" [2]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" [3]=> string(14) "1234567@qq.com" ["email"]=> string(14) "1234567@qq.com" [4]=> string(2) "20" ["age"]=> string(2) "20" }
~~~
(3)mysql_fetch_object($result) 把一行数据,当作一个对象返回。
~~~
while($row= mysql_fetch_object($result)){
echo $row->id." ".$row->name;
echo "<br/>下一行:<br/>";
}
~~~
返回结果和第一种一样,只是取值方法不同。
总结:4种方法,应根据具体情况进行选择,各有利弊吧!
### 对数据库操作 增删改查 :
~~~
<?php
//1 获得链接链接
$conn=mysql_connect("192.168.1.110:3306","root","");
if (!$conn){
die("连接失败".mysql_error());
}else{
echo "连接成功<br/>";
}
//2 选择数据库
mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());
//3 增加记录
// $sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)";
//4删除操作
//$sql="delete from user1 where id=3";
// 5 更新
$sql="update user1 set age=50 where id=2";
//如果是 dml操作,则返回bool
$res=mysql_query($sql,$conn);
if(!$res){
die( "操作失败<br/>".mysql_error());
}
//看看有几条数据记录
if(mysql_affected_rows($conn)>0){
echo "操作成功!<br/>";
}else{
echo "操作失败!<br/>";
}
mysql_close($conn);
?>
~~~
![](https://box.kancloud.cn/2016-06-03_5750fd8f42994.jpg)
从上面的两个文件看出,代码的复用性和可以维护性不高,在PHP变成众,通常是将对数据库的操作,封装成一个工具类,以及对数据库常用函数使用!看下面的代码?
~~~
<?php
class SqlTool{
private $conn;
//链接并选择数据库
function SqlTool($host,$user,$password,$db){
$this->conn=mysql_connect($host,$user,$password);
if(!$this->conn){
die("链接数据库失败".mysql_error());
}
mysql_select_db($db,$this->conn);
}
//查询操作
function execute_dql($sql){
$res=mysql_query($sql,$this->conn) or die("查询失败".mysql_error());
return $res;
}
//更新,删除,添加,
//rturn, 0:失败,1,成功,2:对行数没有影响
function execute_dml($sql){
$res=mysql_query($sql,$this->conn);
if(!$res){
echo "操作失败".mysql_error();
return 0;
}else{
if(mysql_affected_rows($this->conn)>0){
return 1;//成功
}else{
return 2;//没有任何记录改变
}
}
}
//下面函数,接受一个查找后的对象,然后把表头和表的内容打印出来
function show_tables_info($res){
if($res){
//获得有多少行
// mysql_affected_rows($conn)也可以但是参数是连接的对象;
$rows=mysql_num_rows($res);
//获得有多少列
$colums=mysql_num_fields($res);
//打印表头及表内容
echo "<table border=1><tr>";
for($i=0;$i<$colums;$i++){
$field_name=mysql_field_name($res,$i);
echo "<th>$field_name</th>";
}
echo "</tr>";
while($row=mysql_fetch_row($res)){
echo "<tr>";
for($i=0;$i<$colums;$i++){
echo "<td>$row[$i]</td>";
}
echo "</tr>";
}
echo"</table>";
/*mysql_fetch_field 返回一个包含字段信息的对象,具体看手册
while($field_info=mysql_fetch_field($res)){
echo $field_info->name."<br/>";
}*/
}
}
}
//创建对象
//这边析构函数使用PHP4,这里可以看析构函数介绍
$sqltool=new SqlTool("192.168.1.110:3306","root","","test");
/*
//添加对象
$sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)";
$res=$sqltool->execute_dml($sql);
echo $res."<br/>";
*/
//查找
$sql="select * from user1";
$res=$sqltool->execute_dql($sql);
/*
while($row=mysql_fetch_assoc($res)){
foreach($row as $key=>$val){
echo "[$key]=$val ";
}
echo "<br/>";
}
*/
$sqltool->show_tables_info($res);
//释放
mysql_free_result($res);
?>
~~~
看效果
![](https://box.kancloud.cn/2016-06-03_5750fd8f698d3.jpg)
补充:
习mysql数据库,常用[mysql](http://database.51cto.com/art/201009/225564.htm)命令是首先需要掌握的,下面就为您介绍了九种常用mysql命令,希望对您学习常用mysql命令方面能有所帮助。
1 .启动MYSQL服务 net start mysql
停止MYSQL服务 net stop mysql
2 . netstat –na | findstr 3306 查看被监听的端口 , findstr用于查找后面的在端口是否存在
3 . 在命令行中登陆MYSQL控制台 , 即使用 MYSQL COMMEND LINE TOOL
语法格式 mysql –user=root –password=123456 db_name
或 mysql –uroot –p123456 db_name
4 . 进入MYSQL命令行工具后 , 使用status; 或\s 查看运行环境信息
5 . 切换连接数据库的语法 : use new_dbname;
6 . 显示所有数据库 : show databases;
7 . 显示数据库中的所有表 : show tables;
8 . 显示某个表创建时的全部信息 : show create table table_name;
9 . 查看表的具体属性信息及表中各字段的描述
Describe table_name; 缩写形式 : desc table_name;
1、显示数据库
~~~
show databases;
~~~
2、选择数据库
~~~
use 数据库名;
~~~
3、显示数据库中的表
~~~
show tables;
~~~
4、显示数据表的结构
~~~
describe 表名;
~~~
5、显示表中记录
~~~
SELECT * FROM 表名
~~~
6、建库
~~~
create databse 库名;
~~~
7、建表
[![复制代码](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "复制代码")
~~~
create table 表名 (字段设定列表);
mysql> create table name(
-> id int auto_increment not null primary key ,
-> uname char(8),
-> gender char(2),
-> birthday date );
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+------------------+
| Tables_in_userdb |
+------------------+
| name |
+------------------+
1 row in set (0.00 sec)
mysql> describe name;
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uname | char(8) | YES | | NULL | |
| gender | char(2) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+---------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
注: auto_increment 自增
primary key 主键
~~~
[![复制代码](https://box.kancloud.cn/2015-10-30_5632e1b8d3b57.gif)]( "复制代码")
8、增加记录
~~~
insert into name(uname,gender,birthday) values('张三','男','1971-10-01');
~~~
9、修改记录
~~~
update name set birthday='1971-01-10' where uname='张三';
~~~
10、删除记录
~~~
delete from name where uname='张三';
~~~
11、删除表
~~~
drop table 表名
~~~
12、删除库
~~~
drop database 库名;
~~~
13、备份数据库
~~~
mysqldump -u root -p --opt 数据库名>备份名; //进入到库目录
~~~
14、恢复
~~~
mysql -u root -p 数据库名<备份名; //恢复时数据库必须存在,可以为空数据库
~~~
15、数据库授权
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
例1、增加一个用户user001密码为123456,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MySQL,然后键入以下命令:
~~~
mysql> grant select,insert,update,delete on *.* to user001@"%" Identified by "123456";
~~~
例2、增加一个用户user002密码为123456,让此用户只可以在localhost上登录,也可以设置指定IP,并可以对数据库test进行查询、插入、修改、删除的操作 (localhost指本地主机,即MySQL数据库所在的那台主机)
//这样用户即使用知道user_2的密码,他也无法从网上直接访问数据库,只能通过MYSQL主机来操作test库。
//首先用以root用户连入MySQL,然后键入以下命令:
~~~
mysql>grant select,insert,update,delete on test.* to user002@localhost identified by "123456";
~~~
- 前言
- HTML(第一天)
- HTML(第二天)
- DIV+CSS(第一天)
- DIV+CSS(第二天)
- DIV+CSS(第三天)
- DIV+CSS(第四天)
- PHP开发环境配置说明
- PHP基础数据类型及运算符介绍
- 走进PHP函数
- 走进位运算
- 走进数组及相关数组函数
- 面向对象的编程(类与对象)
- 面向对象的编程(类成员方法用法)
- 构造方法,析构方法
- static,global用法
- 静态方法
- 面向对象的编程方法
- 接口方法
- 接口VS继承、final、const
- 错误及异常处理机制、错误日志
- HTTP协议深度剖析
- 文件下载
- PHP数据库编程
- 数据库编程(2)
- 超全局变量
- Zend studio 开发环境入门
- 雇员管理系统(1)
- 雇员管理系统(2)
- 会话技术(cookie session)
- 会话技术 session场景使用介绍!
- PHP.in中session和cookie的配置说明
- PHP文件编程
- 报表及绘图技术
- 报表及绘图技术(jpgraph库使用,Linux安装及配置说明)
- XML基本语法及DTD介绍
- XML编程(Dom技术)
- XML编程(Xpath技术,simpleXml技术)基础入门
- 网上支付平台PHP版本
- javascript基础入门