php数据库接口

三套方案 mysql mysqli pdo

1、mysql扩展库 效率不怎么高的数据库

2、mysqli扩展库

3、pdo 可以操作任何一种数据库

mysql扩展库和mysqli的扩展库,扩展库就是操作数据库的一个集合

mysql数据库是用于存放数据的

可以查看php可以使用的扩展库 phpinfo();

创建新表

CREATE table  user(
  id int primary key auto_increment,
  name varchar(32) not NULL,
  PASSWORD  VARCHAR(64) not NULL,
   emial VARCHAR(128) not NULL,
  age   TINYINT UNSIGNED not NULL
) 

预先加载数据

mysql中密码的处理,对一个明文加密成一个密文,而且这个过程是不可逆的。由密文推不出明文。

INSERT INTO user(name,password,emial,age) values(‘zs’,MD5(‘123456’),’[email protected]’,12)其中md5这个函数就是实现对密码的加密

解决数据库不能插入中文

INSERT INTO user(name,password,emial,age) values(‘赵文娟’,MD5(‘123432326’),’[email protected]’,12)

中文在数据库就不能正常的显示

新建数据库的时候一定要选择正确的编码格式

php利用扩展库操作mysql

1、获取连接

connection=mysqlconnect(“127.0.0.1”,”root”,”“);if(!connection){

die(“连接失败”.mysql_error);

}

2、选择数据库

mysql_select_db(“senjintang”);

3、设置操作编码

mysql_query(“set names utf8”); 出现中文乱码的时候可以尝试使用

4、向数据库发送指令sql(ddl数据定义语言 创建表 dml数据操作语言 dql数据查询语句select dtl数据事物语句 rollback commit)

res=mysqlquery(sql,connection);5、接受返回的结果并处理while(row=mysql_fetch_row(res))echo“$row[0]??$row[1]–$row[2]??$row[3]–$row[4]”;mysqlfetchrow(res) 返回一个索引数组

mysql_fetch_assoc(res)返回一个关联数组mysqlfetcharray(res) 返回索引数组和关联数组两套

mysql_fetch_object(res)把一行数据当作一个对象mysqlfetchrow(res)返回的是结果集的下一行,会一次取出结果集中的下一行

但是这资格函数使用完以后,都必须释放资源

6、释放资源,关闭连接

mysql_free_result($res); //释放结果集

mysql_close(); //关闭连接 不是必须的,会在脚本执行完以后自动关闭

mysqli_error() 可以打印连接的错误

注意:在对数据库执行dml(非select的数据库查询以后),一定不要再进行释放资源,也就是 mysql_free_result(res);因为当前的res是一个布尔值。所以:对数据的操作严格的区分有无结果集的的返回。

对mysql数据库进行crud操作 使用的是mysql_

实现对数据库的插入操作

 //server的名称  数据库的用户名和密码
    $connection=mysql_connect("127.0.0.1","root","");
    if(!$connection){
       die("连接失败".mysql_error);
    }
    mysql_select_db("senjintang");
    mysql_query("set names utf8");
    $sql="insert into user(name,password,emial,age) values (‘小敏‘,md5(‘123‘),‘xiaoming‘,34)";
    //如果是dml操作,调用这个函数以后返回的是一个布尔值
    $res=mysql_query($sql,$connection);
    $affected_number=mysql_affected_rows($connection);
    if(!$res){
       die("操作失败".mysql_error());
    }
     if($affected_number>0){
           echo "对数据库的影响为$affected_number";
         }else{
           echo "操作没成功";
         }
    mysql_close($connection);

实现对数据库删除数据的操作

 //server的名称  数据库的用户名和密码
    $connection=mysql_connect("127.0.0.1","root","");
    if(!$connection){
       die("连接失败".mysql_error);
    }
    mysql_select_db("senjintang");
    mysql_query("set names utf8");
    $sql="delete from user where id=5";
    //如果是dml操作,调用这个函数以后返回的是一个布尔值
    $res=mysql_query($sql,$connection);
    $affected_number=mysql_affected_rows($connection);
    if(!$res){
       die("操作失败".mysql_error());
    }
     if($affected_number>0){
           echo "对数据库的影响为$affected_number";
         }else{
           echo "操作没成功";
         }
    mysql_close($connection);

对数据库的更新操作

 //server的名称  数据库的用户名和密码
    $connection=mysql_connect("127.0.0.1","root","");
    if(!$connection){
       die("连接失败".mysql_error);
    }
    mysql_select_db("senjintang");
    mysql_query("set names utf8");
    $sql="update user set age=100  where id=4";
    //如果是dml操作,调用这个函数以后返回的是一个布尔值
    $res=mysql_query($sql,$connection);
    $affected_number=mysql_affected_rows($connection);
    if(!$res){
       die("操作失败".mysql_error());
    }
     if($affected_number>0){
           echo "对数据库的影响为$affected_number";
         }else{
           echo "操作没成功";
         }
    mysql_close($connection);

上面可见代码的复用性不高,所以将对数据库的操作封装成一个工具类。

mysqltool.php

<?php
  class SqlTool{
     private $conn;
     private $host="127.0.0.1";
     private $user="root";
     private $password="";
     private $db="senjintang";
     function SqlTool(){
       $this->conn=mysql_connect($this->host,$this->user,$this->password);
       if(!($this->conn)){
          die("连接数据库发生错误".mysql_error());
       }
       mysql_select_db($this->db,$this->conn);
       mysql_query("set names utf8");
     }
     //完成slect
     public  function execute_dql($sql){
     //失败的时候就退出了
        $res=mysql_query($sql) or die(mysqli_error());
        return $res;
     }
     //完成dml
     public  function execute_dml($sql){
       $b=mysql_query($sql,$this->conn);
       if(!$b){
         return 0;   //表示失败
       }else{
         if(mysql_affected_rows($this->conn)>0){
            return 1;//表示成功
         }
         else{
            return 2;  //表示没有对数据库影响
         }
       }
     }
  }
?>

使用mysqli(improvement)来操作数据库

相当于上面的mysql的扩展库的一个增强版

mysql和mysqli的比较

1、稳定性、安全性、效率有所提高

2、mysqli提供了面向对象的编程思想。

mysqli有两套编程风格

面向对象

1、创建mysqli对象

$mysqli=new MySQLi("127.0.0.1","root","","senjintang");
     //按章是否ok
     if($mysqli->connect_error){
        die("连接失败".$mysqli->connect_error);
     }
     else{
       echo  "连接成功";
     }

2、操作数据库

 $sql="select * from user";
     $res=$mysqli->query($sql);

3、处理结果

  while($row=$res->fetch_row()){
        foreach($row as $key=>$val){
           echo $val;
        }
        echo  "<br/>";
     }

4、关闭资源

  //关闭资源   这一个步骤是必须的
     $res->free();
     //断开连接
     $mysqli->close();

使用面向对象的方式,实现利用扩展库对数据库的操作

<?php
    //防止乱码
    header("Content-type:text-html;charset=utf-8");
     $mysqli=new MySQLi("127.0.0.1","root","","senjintang");
     //按章是否ok
     if($mysqli->connect_error){
        die("连接失败".$mysqli->connect_error);
     }
     else{
       echo  "连接成功";
     }
      $mysqli->query("set names utf8");
     $sql="select * from user";
     $res=$mysqli->query($sql);
     //返回的是一个对象  mysqliResult
      echo "<br/>";
     var_dump($res);
      echo "<br/>";
     //fetch_row这是mysqliResult的一个方法
     while($row=$res->fetch_row()){
        foreach($row as $key=>$val){
           echo $val;
        }
        echo  "<br/>";
     }
     //关闭资源   这一个步骤是必须的
     $res->free();
     //断开连接
     $mysqli->close();
     //对于这种面向对象的方式,
?>

注意:防乱码

//防止乱码

header(“Content-type:text-html;charset=utf-8”);

可以保证往数据库里边插入正确的汉字

$mysqli->query(“set names utf8”);

mysql中sql语句的特别说明:

如果操作的字段类型是字符串类型的则要求我们要使用”包括,

如果操作的字段是数值型的,则可以用”包括,也可以不使用

分装mysqli的操作,实现对数据库的crud

<?php
      class SqlHelper{
         private $mysqli;
         //将来这些配置文件都会写在一个文件中
         private static $host="localhost";
         private static $user="root";
         private static $password="";
         private static $db="senjintang";
         public function __construct(){
            //完成初始化的操作
            $this->mysqli=new MySQLi(self::$host,self::$user,self::$password,self::$db);
            if($this->mysqli->connect_error){
                die("连接失败").$this->mysqli->connect_error;
            }
            //设置访问数据库的字符集
            //这句话的作用是保证php是以utf8的方式来操作mysql数据库
            $this->mysqli->query("set names utf8");
         }

         public function execute_dql($sql){
             $res=$this->mysqli->query($sql) or die("操作dql".$this->mysqli->error);
             return $res;
        }
          public function execute_dml($sql){
            $res=$this->mysqli->query($sql) or die("操作dql".$this->mysqli->error);
                 if(!$res){
                    return 0;  //表示失败
                 }
                 else if($this->mysqli->affected_rows>0){
                     return 1;   //表示成功执行
                 }
                 else{
                     return 2;   //表示没有收影响的行数
                 }
        }
      }

?>

mysqli的增强

mysql可以批量执行sql语句

1、批量执行dml语句

基本语法:

sqls="sql1;sql2…..”;mysqli::multiquery(sqls);

批量添加、更新、删除

<?php
  include ‘includes/header.html‘;
   $mysqli=new MySQLi("localhost","root","","senjintang");

   if($mysqli->connect_error){
     die("连接错误".$mysqli->connect_error);
   }
    $mysqli->query("set names utf8");
   $sqls=" insert into  user (name,password,emial,age) values(‘松江‘,md5(‘aaa‘),‘[email protected]‘,21);";
   $sqls.="insert into  user (name,password,emial,age) values(‘卢俊义‘,md5(‘aaa‘),‘[email protected]‘,21);";
      $sqls.="insert into  user (name,password,emial,age) values(‘赵文娟‘,md5(‘aaa‘),‘[email protected]‘,21);";
    $b=$mysqli->multi_query($sqls);
    if(!$b){
       echo  "执行失败".$mysqli->error;
    }
    else{
       echo  "执行成功";
    }
?>

这里的$sqls可以是增加、更新、删除这三种语句,但是最好不要使用select语句,接下来就是批量的执行dql语句

2、批量执行dql语句

批量执行select语句、可以一次性的返回多个结果集

<?php
  include ‘includes/header.html‘;
   $mysqli=new MySQLi("localhost","root","","senjintang");
   if($mysqli->connect_error){
     die("连接错误".$mysqli->connect_error);
   }
    $mysqli->query("set names utf8");
    //这里的sqls可以是多个sql语句但是必须用;隔开
   $sqls=" select * from user;";
   $sqls.="select * from users;";
   //如果就会取出至少一个结果集
    if($res=$mysqli->multi_query($sqls)){
    do{
           //从mysqli连接取出第一个结果集  也就是结果集的第一行
           $result=$mysqli->store_result();
           //显示mysqli result对象
           while($row=$result->fetch_row()){
              foreach($row as $key=>$val)
              {
                 echo "$key.$val<br/>";
              }
             echo "<br/>";

           }
           $result->free();
           if(!$mysqli->more_results()){
               break;
           }
           echo "新的结果集<br/>";
    }while($mysqli->next_result());
     $mysqli->close();

    };
?>

mysql的事务处理

应用场景:有一张银行账号表,id balance一段php程序来实现转账

1号账户10 元转到2号账户

<?php
  include ‘includes/header.html‘;
   $mysqli=new MySQLi("localhost","root","","senjintang");
   if($mysqli->connect_error){
     die("连接错误".$mysqli->connect_error);
   }
   $sql1="update account set balance=balance-2 where id=1";
   $sql2="update account set balance=balance+2 where id=2";
     $b1=$mysqli->query($sql1);
     $b2=$mysqli->query($sql2);
     if(!$b1||!$b2){
        echo "转账失败".$mysqli->error;
     }else{
        echo "转账成功";
     }
?>

这种情况貌似是正确的,但是现在假设一种情况,假设我们执行了第一个query以后,第二个query没有执行,这时我们需要有一种方法来控制两个query必须同时成功执行或者同时失败,

事务:用于保证数据的一致性,它由一组相关的dml语句组合成,该组的dml语句要么全部成功,要么全部失败。

1、将提交设为false

2、其中一句失败,执行回滚。两句都没有错误,实现提交

实现代码

<?php
  include ‘includes/header.html‘;
   $mysqli=new MySQLi("localhost","root","","senjintang");
   if($mysqli->connect_error){
     die("连接错误".$mysqli->connect_error);
   }
   $mysqli->autocommit(false);
   $sql1="update account set balance=balance-2 where id=1";
   $sql2="update account set balance=balance+2 where id=2";
     $b1=$mysqli->query($sql1);
     $b2=$mysqli->query($sql2);
     if(!$b1||!$b2){
        echo "转账失败".$mysqli->error;
        //其中有一个语句没有执行成功,执行回滚操作
        $mysqli->rollback();
     }else{
        echo "转账成功";
          //两句都成功执行实现提交操作
                $mysqli->commit();   //一旦提交就没有机会再回滚
        }
?>

在mysql的控制台中,也可以使用事务:

1、开启一个事务 : start transaction

2、做保存点 : savepoint

3、操作 : delete insert update

4.1没有问题做提交操作 commit

4.2有问题做回滚操作 rollback to savepoint

事务的特点:

1、原子性 一个事务不可以分割

2、一致性

3、隔离性

4、持久性 一旦提交,变化永久存在于数据库中

mysqli的扩展库增强之处 预处理技术

预处理:代表的是一种处理数据的技术 mysqli_stmt

需要向mysql数据库添加100个用户

1、使用for循环,循环100次,向数据库中添加100个用户

2、使用批量插入,用.连接100条sql语句,但是只执行一次sql,使用mysqli?>mutilquery(sql1);

3、使用预编译技术,该方案还可以防止sql注入攻击

补充一个关于sql语句原理的知识点:

减少连接的次数可以提高效率、减少编译的时间来提高效率,提出预编译的思想。把sql语句预先编译好,后面只需程序发送数据即可。、

步骤:

1、创建mysqli对象

2、创建预编译对象

实现代码:

<?php
//1、创建连接
    $mysqli=new MySQLi("localhost","root","","senjintang");
    //创建预编译对象

    $sql="insert into user (name,password,emial,age) values (?,?,?,?)";

    $mysqli_stmt=$mysqli->prepare($sql) or die($mysqli->error);
    //设置参数
    $name="小倩";
    $password="xiaoqian";
    $emial="[email protected]";
    $age=20;
    //参数绑定  给?赋值  这里类型和顺序都要对应
    //sssi表示字符串、字符串、字符串、整形类型
    $mysqli_stmt->bind_param("sssi",$name,$password,$emial,$age);
    //执行
    $b=$mysqli_stmt->execute();
    //其中一个不成功,会直接执行下一个
    if(!$b){
       die("操作失败21".$mysqli->error);
    }
    else{
      echo "操作成功12";
    }
    //释放资源  因为这里只是dml所以只需关闭
    $mysqli->close();

?>

从数据库查询所有id>5的用户,同时id可能会发生变化

代码实现

<?php
//1、创建连接
    $mysqli=new MySQLi("localhost","root","","senjintang");
    if($mysqli->connect_error){
       die($mysqli->connect_error);
    }
    //2、创建预编译对象
    $sql="select id,name,emial from user where id>?";
    $mysqli_stmt=$mysqli->prepare($sql) or die($mysqli->error);
    //设置参数
    $id=5;
    //参数绑定  给?赋值  这里类型和顺序都要对应
    //sssi表示字符串、字符串、字符串、整形类型
    $mysqli_stmt->bind_param("i",$id);
    //绑定结果集
    $mysqli_stmt->bind_result($id,$name,$emial);
    //取出绑定的结果集
    $mysqli_stmt->execute();
    while($mysqli_stmt->fetch()){
       echo  "<br/>--$id--$name--$emial";
    }
    //释放资源  1、释放资源   2、关闭预编译语句   3、关闭连接
    $mysqli_stmt->free_result();
    $mysqli_stmt->close();
    $mysqli->close();

?>
时间: 2024-12-14 05:53:59

php数据库接口的相关文章

c 下的通用数据库接口

在java/C#中都有类的反射,而C下是不存在的. java/C#中可以把表设计成类,而C下只能设计成结构体形式. 在java中有hibernate来操作数据库,但是在C下面怎么设计好呢? 现在,我想出了一个点子,以下使用sqlite 先创建一个结构体,表示一张数据库表的结构. typedef struct User { int id; char *name; char *password; } User; 创建表的语句: CREATE TABLE 'User' ('id'  INTEGER P

数据库接口使用说明

  1         阅读对象 需要操作mysql数据库的c语言开发人员. 2         lstorage功能 封装了mysql操作的主要功能,并对其进行了一定简化. 3         lstorage框架结构 3.1 组件列表 组件名称 组件类型 功能说明 libstorage.so 动态库 storage.h 头文件 函数声明 datastruct.h 头文件 数据结构及相关宏定义 4         功能说明 4.1 数据结构 数据结构 原始定义 说明 _sql_result t

金笛中间件:基于数据库接口的短信猫通信软件

金笛短信中间件的作用 一个可靠的系统,需要7*24小时不间断工作,短信猫在运行中,会碰到CMS ERROR,这些错误和运营商有关,需要根据不同的错误信息对设备运行状态做相应调整.很多客户花费了大量的人力和时间才能比较好地达到目标,这牵涉到了具体开发人员的水平,毕竟需要开发人员很好地去研究短信猫特性,反复做简单测试没问题后才能正常使用.短信猫需要长时间不间断运行,这对于整个行业应用来说,短信更多的是补充和扩展,往往在正式运行后出现一些没有测试到的问题,导致运行不稳定,容易丢包.死机等. 金笛短信猫

关于框架数据库接口开发的心得

背景 最近一直使用PhalApi开发接口,由于业务需求需要用到mongodb,发现框架内就没有mongo的驱动,心血来潮想要自己加上mongo驱动,但是悲剧的发现,框架作者居然没有给出一个db的接口.好吧,完全自己来!由于我也是第一次尝试去写框架的数据库接口,不知道从何下手,就是一个字“瞎”.但是为了实现数据库接口的编写,我想到了“借鉴”,所以,去github上clone了TP,CI,YII分别分析了这些框架的数据库部分是如何设计的,然后就有了本文. 学习 看完了YII的相关数据库驱动,大概总结

Python与数据库[1] -&gt; 数据库接口/DB-API -&gt; 通用标准

数据库接口 / DB-API 在Python中,数据库是通过适配器(Adaptor)来连接访问数据库的,适配器通常与数据库客户端接口(通常为C语言编写)想连接,而不同的适配器都会尽量满足相同的DB-API标准. 为了保证不同数据库的数据库接口能够通用于适配器,以减少使用不同数据库接口是需要对代码进行大幅改动,Python的DB-SIG(数据库特殊兴趣小组)制定了DB-API的标准,该API为不同的关系数据库提供了一致的接口,使得使用不同数据库的代码间移植变得更加简单.数据库接口目前的版本为DB-

Java se课程设计详解——数据库接口类(1)

开始做课程设计的时候根本无从下手,后来查阅资料后发现是先从数据库开始的.整个课程设计需要用到的如下图,今天总结一下数据库接口! 数据库接口需要用到两个类,一个是DAO.java,另一个是properties.java. 1.properties.java文件 因为使用 JDBC 操作数据库,基本流程是相同的,只是操作的内容不同,因此,可将数据库的连接和有关操作封装成类,后续操作数据库时只要调用相关类的方法即可. 步骤 (1)先创建一个以properties 为后缀的文件,比如my.propert

c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)

在java/C#中都有类的反射,而C下是不存在的. java/C#中能够把表设计成类.而C下仅仅能设计成结构体形式. 在java中有hibernate来操作数据库,可是在C以下怎么设计好呢? 如今,我想出了一个点子,下面使用sqlite 先创建一个结构体.表示一张数据库表的结构. typedef struct User { int id; char *name; char *password; } User; 创建表的语句: CREATE TABLE 'User' ('id'  INTEGER

数据库接口开发

业务系统最简单实现:使用定时任务调用存储过程提取变更数据然后写入到接口数据库, 我们这边可以随时进行数据抽取,你也不用担心其他人动你的业务库而导致其它问题. 其它办法: 1.做个双机数据库,我们读从库. 2.每天备份数据库然后倒入到接口库.导出sql并恢复至备份库.建议不要因为一部分工作量,然后给业务系统带来风险. 方案1:实现方法 http://wenku.it168.com/d_001192171.shtml 如果用这种办法,需要准备服务器安装数据等工作 安装数据库

Python与数据库[1] -&gt; 数据库接口/DB-API -&gt; SQL Server 适配器

SQL_Server适配器 / SQL_Server Adapter 1 环境配置 / Environment Configuration 安装SQL_Server的Python适配器包 pip install pymssql Note: 此处采用远程数据库服务器,因此未安装本地SQL_Server 2 SQL_Server实例 / SQL_Server Examples 由于远程数据库账号仅具有读取权限,因此此处示例基本以读取为主. 查看数据库 / Show Database 利用适配器的基本