PHP自学之路--------PHP数据库编程

PHP数据库编程

PHP有三种方式来操作我们的数据库:

1、mysql扩展库

2、mysqli扩展库

3、pdo

mysql扩展库和mysql数据库的区别

下面就来mysql扩展库来介绍 :

1、mysql数据库是用来存放数据的

2、mysql数据库的三层结构示意图:

  所有数据库基本上都遵循这三种结构 ,

 

3、mysql扩展库是一堆函数,是PHP设计者提供给程序员完成对mysql数据库的各种操作(CRUD)

使用PHP的mysql扩展库完成对数据库的操作:

1、环境搭建

1.1 启用mysql扩展库

[php] view plain copy
 
 print?
  1.   

        在PHP.ini文件中去配置mysql扩展库

             extension=php_mysql.dll              extension=php_mysqli.dll

        我们可以通过<?php phpinfo();?> 来查看目前支持哪些库功能

1.2 创建一张用户表,供我们使用

[php] view plain copy
 
 print?
  1. create table user1(  
  2. id int primary key auto_increment,  
  3. name varchar(32) not null,  
  4. password varchar(64) not null,  
  5. email varchar(128) not null,  
  6. age tinyint unsigned not null  
  7. )  

插入数据

 
   
[php] view plain copy
 
 print?
  1. insert into user1(name,password,email,age) value('jsh',md5('123456'),'1234567@qq.com',20)  

     
这里我们对密码进行了加密
当我们将用户名是汉字时,回报错误,需要进行设置

 

下面是具体的例子:

[php] view plain copy
 
 print?
  1. <?php  
  2.     //mysql 扩展库曹总mysql数据库步骤  
  3.   
  4.     //1 获得链接,疑问?密码在哪设置的???  
  5.     $conn=mysql_connect("192.168.1.110:3306","root","");  
  6.     if (!$conn){  
  7.         die("连接失败".mysql_error());  
  8.     }else{  
  9.         echo "连接成功<br/>";  
  10.     }  
  11.     //2 选择数据库  
  12.     mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());  
  13.   
  14.     //3 设置操作编码(可选)  
  15.     //mysql_query("set names utf8");  
  16.   
  17.   
  18.     //4 发送指令  
  19.   
  20.     $sql="select *from user1";  
  21.        
  22.     $result = mysql_query($sql,$conn) or die("Invalid query: " . mysql_error());  
  23.   
  24.     //5 接受返回结果,并处理  
  25.   
  26.     while($row= mysql_fetch_row($result)){  
  27.         //第一种遍历方法  
  28.         //echo "--$row[0]--$row[1]--$row[2]--$row[3]--$row[4]<br/>";  
  29.         //第二种遍历方法  
  30.         foreach($row as $key=>$val){  
  31.             echo "--$val";  
  32.         }  
  33.         echo "<br/>下一行:<br/>";  
  34.     }  
  35.   
  36.     //6 释放资源,关闭连接  
  37.     //释放内存,这个必须要,释放的内存资源  
  38.     mysql_free_result ($result);  
  39.     //这个可有可无,但是建议有,没有的话,运行完毕也会关闭!  
  40.     mysql_close($conn);  
  41. ?>  

打印内容:
[php] view plain copy
 
 print?
  1. 连接成功  
  2. --1--jsh--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20  
  3. 下一行:  
  4. --2--??--e10adc3949ba59abbe56e057f20f883e--1234567@qq.com--20  
  5. 下一行:  

细节:

1、$reslust 使用完毕,一定要进行释放

2、 mysql_close()如果没有的话,系统也会自动关闭

3、 从$reslust 获取行数据的时候,处理函数mysql_fetch_row($reslust)返回索引数组,还有三个方法

      (1) mysql_fetch_assoc() 返回一个关联数组:

          是按照表单元素名排序  

[php] view plain copy
 
 print?
  1. while($row= mysql_fetch_assoc($result)){  
  2.     echo $row["id"]."  ".$row["name"]."  ".$row["password"]."  ".$row["email"]."  ".$row["age"];  
  3.     echo "<br/>下一行:<br/>";  
  4. }  


 结果如下:

1 jsh e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:
2 ?? e10adc3949ba59abbe56e057f20f883e 1234567@qq.com 20
下一行:

       (2)mysql_fetch_array($result) 返回关联数组或者索引数组。这个要比上面2个都慢,一般不建议使用

       

[php] view plain copy
 
 print?
  1. while($row= mysql_fetch_array($result)){  
  2.         var_dump($row);  
  3.         echo "<br/>下一行:<br/>";  
  4.     }  

结果如下:

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) 把一行数据,当作一个对象返回。

       

[php] view plain copy
 
 print?
  1. while($row= mysql_fetch_object($result)){  
  2.     echo $row->id."   ".$row->name;  
  3.     echo "<br/>下一行:<br/>";  
  4. }  


             返回结果和第一种一样,只是取值方法不同。

  总结:4种方法,应根据具体情况进行选择,各有利弊吧! 

 

对数据库操作 增删改查 :

[php] view plain copy
 
 print?
  1. <?php  
  2.     //1 获得链接链接  
  3.     $conn=mysql_connect("192.168.1.110:3306","root","");  
  4.     if (!$conn){  
  5.         die("连接失败".mysql_error());  
  6.     }else{  
  7.         echo "连接成功<br/>";  
  8.     }  
  9.     //2 选择数据库  
  10.     mysql_select_db('test', $conn) or die ('Can\'t use test: ' . mysql_error());  
  11.   
  12.   
  13.     //3 增加记录  
  14.    // $sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)";  
  15.   
  16.   
  17.     //4删除操作  
  18.     //$sql="delete from user1  where id=3";  
  19.   
  20.     // 5 更新  
  21.   
  22.     $sql="update  user1 set age=50 where id=2";  
  23.     //如果是 dml操作,则返回bool  
  24.     $res=mysql_query($sql,$conn);  
  25.   
  26.     if(!$res){  
  27.         die( "操作失败<br/>".mysql_error());  
  28.     }  
  29.     //看看有几条数据记录  
  30.     if(mysql_affected_rows($conn)>0){  
  31.         echo "操作成功!<br/>";  
  32.     }else{  
  33.         echo "操作失败!<br/>";  
  34.     }  
  35.   
  36.     mysql_close($conn);  
  37. ?>  


从上面的两个文件看出,代码的复用性和可以维护性不高,在PHP变成众,通常是将对数据库的操作,封装成一个工具类,以及对数据库常用函数使用!看下面的代码?

[php] view plain copy
 
 print?
  1. <pre name="code" class="php"></pre><pre name="code" class="php"><?php  
  2.   
  3.     class SqlTool{  
  4.          private $conn;  
  5.          //链接并选择数据库  
  6.          function SqlTool($host,$user,$password,$db){  
  7.              $this->conn=mysql_connect($host,$user,$password);  
  8.              if(!$this->conn){  
  9.                  die("链接数据库失败".mysql_error());  
  10.              }  
  11.              mysql_select_db($db,$this->conn);  
  12.          }  
  13.   
  14.          //查询操作  
  15.          function execute_dql($sql){  
  16.              $res=mysql_query($sql,$this->conn) or die("查询失败".mysql_error());  
  17.              return $res;  
  18.          }  
  19.   
  20.          //更新,删除,添加,  
  21.          //rturn, 0:失败,1,成功,2:对行数没有影响   
  22.          function execute_dml($sql){  
  23.              $res=mysql_query($sql,$this->conn);  
  24.              if(!$res){  
  25.                  echo "操作失败".mysql_error();  
  26.                  return 0;  
  27.              }else{  
  28.                  if(mysql_affected_rows($this->conn)>0){  
  29.                      return 1;//成功  
  30.                  }else{  
  31.                      return 2;//没有任何记录改变  
  32.                  }  
  33.              }  
  34.          }  
  35.   
  36.          //下面函数,接受一个查找后的对象,然后把表头和表的内容打印出来  
  37.          function show_tables_info($res){  
  38.              if($res){  
  39.   
  40.                  //获得有多少行  
  41.                 // mysql_affected_rows($conn)也可以但是参数是连接的对象;  
  42.                  $rows=mysql_num_rows($res);   
  43.                  //获得有多少列  
  44.                  $colums=mysql_num_fields($res);  
  45.                   //打印表头及表内容  
  46.                   echo "<table border=1><tr>";  
  47.   
  48.                   for($i=0;$i<$colums;$i++){  
  49.                       $field_name=mysql_field_name($res,$i);  
  50.                        echo "<th>$field_name</th>";  
  51.                   }  
  52.                   echo "</tr>";  
  53.                   while($row=mysql_fetch_row($res)){  
  54.                       echo "<tr>";  
  55.                       for($i=0;$i<$colums;$i++){  
  56.                           echo "<td>$row[$i]</td>";  
  57.                       }  
  58.                       echo "</tr>";  
  59.                   }  
  60.   
  61.                   echo"</table>";  
  62.                  /*mysql_fetch_field 返回一个包含字段信息的对象,具体看手册 
  63.                  while($field_info=mysql_fetch_field($res)){ 
  64.                      echo $field_info->name."<br/>"; 
  65.                  }*/  
  66.              }  
  67.          }  
  68.   
  69.     }  
  70.   
  71.     //创建对象  
  72.     //这边析构函数使用PHP4,这里可以看析构函数介绍  
  73.     $sqltool=new SqlTool("192.168.1.110:3306","root","","test");  
  74. /* 
  75.     //添加对象 
  76.     $sql="insert into user1 (name,password,email,age) values ('peipei',md5('woaini'),'peipei@163.com',29)"; 
  77.     $res=$sqltool->execute_dml($sql); 
  78.     echo $res."<br/>"; 
  79. */  
  80.     //查找  
  81.     $sql="select * from user1";  
  82.   
  83.     $res=$sqltool->execute_dql($sql);  
  84.    /* 
  85.     while($row=mysql_fetch_assoc($res)){ 
  86.         foreach($row as $key=>$val){ 
  87.             echo "[$key]=$val  "; 
  88.         } 
  89.         echo "<br/>"; 
  90.     } 
  91.     */  
  92.   
  93.     $sqltool->show_tables_info($res);  
  94.     //释放  
  95.     mysql_free_result($res);  
  96. ?></pre><br>  
  97. <pre></pre>  
  98. <pre></pre>  
  99. <pre></pre>  
  100. <pre></pre>  
看效果
 
补充:

MySQL数据库,常用mysql命令是首先需要掌握的,下面就为您介绍了九种常用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、建表

复制代码
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    主键
复制代码

 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";
posted @ 2016-12-29 11:26  天涯海角路  阅读(163)  评论(0)    收藏  举报