多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 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"; ~~~