登录  /  注册
博主信息
博文 42
粉丝 3
评论 2
访问量 31254
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP第二十七天作业-封装数据操作函数实现增删改查操作-2018-05-10
HeartofSunny的博客
原创
1607人浏览过

封装函数funpdo.php

<?php
//封装数据库函数文件

//连接数据库方法
if(!function_exists('connect')){
    function connect($dbname,$type='mysql',$host, $charset, $port,$user,$pass){
        $dsn = "{$type}:host={$host}; dbname={$dbname}; charset={$charset}; port={$port}";//数据源
        $username = 'root'; //数据库用户名
        $password = 'root';     //数据库密码
        //配置连接属性
        $optin = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//设置错误模式
            PDO::ATTR_CASE => PDO::CASE_NATURAL,//数据库表字段保持不变
            PDO::ATTR_EMULATE_PREPARES => true, //启用PDO模拟
            //PDO::Mysql_ => true, //启用持久性连接
        ];

        try{
            //实例化PDO类,创建PDO对象
            $pdo = new PDO($dsn,$username,$password,$optin);
        } catch (PDOException $e){
            die('Connect ERROR!:'.$e->getMessage());
        }

        return $pdo;
    }
}

//新增数据
if(!function_exists('insert')){
    function insert($pdo,$table,$data=[]){
        //创建sql语句
        $sql = "INSERT IGNORE {$table} SET ";
        foreach (array_keys($data) as $field){
            $sql .= $field.'=:'.$field.', ';
        }
        //去掉尾部逗号,并添加分号结束
        $sql = rtrim(trim($sql),',').';';
        //创建PDO预处理对象
        $stmt = $pdo->prepare($sql);

        //绑定参数到预处理对象
        foreach ($data as $field => $value){
            $stmt->bindValue(":{$field}",$value);
        }

        //执行新增操作
        if($stmt->execute()){
            if($stmt->rowCount()>0){
                return true;
            }
        }else{
            return false;
        }
    }
}

//更新数据
if(!function_exists('update')){
    function update($pdo,$table,$data=[],$where=''){
        //创建sql语句
        $sql = "UPDATE {$table} SET ";
        foreach (array_keys($data) as $field){
            $sql .= $field.'=:'.$field.', ';
        }
        //去掉尾部逗号,并添加分号结束
        $sql = rtrim(trim($sql),',');

        //添加更新条件
        if(!empty($where)){
            $sql .= ' WHERE '. $where;
        }else{
            return false;
        }
        //创建PDO预处理对象
        $stmt = $pdo->prepare($sql);

        //绑定参数到预处理对象
        foreach ($data as $field => $value){
            $stmt->bindValue(":{$field}",$value);
        }

        //执行新增操作
        if($stmt->execute()){
            if($stmt->rowCount()>0){
                return true;
            }
        }else{
            return false;
        }
    }
}

//查询单条数据
if (!function_exists('find')) {

    function find($pdo,$table,$fields, $where='') {
        //创建SQL语句
        $sql = 'SELECT ';
        if (is_array($fields)) {
            foreach ($fields as $field) {
                $sql .= $field.', ';
            }
        } else {
            $sql .= $fields;
        }
        $sql = rtrim(trim($sql),',');
        $sql .= '  FROM '.$table;
        //添加查询条件
        if(!empty($where)) {
            $sql .= '  WHERE '. $where;
        }
        $sql .= '  LIMIT 1';
        //去掉尾部逗号,并添加分号结束
        $sql = rtrim(trim($sql),',').';';

        //创建PDO预处理对象
        $stmt = $pdo->prepare($sql);


        //执行查询操作
        if($stmt->execute()){
            if($stmt->rowCount()>0){
                $stmt->setFetchMode(PDO::FETCH_ASSOC);
                return $stmt->fetch();
            }
        } else {
            return false;
        }
    }
}

//查询多条记录
if(!function_exists('select')){
    function select($pdo,$table,$fields, $where='',$order='') {
        //创建SQL语句
        $sql = 'SELECT ';
        if (is_array($fields)) {
            foreach ($fields as $field) {
                $sql .= $field.', ';
            }
        } else {
            $sql .= $fields;
        }
        $sql = rtrim(trim($sql),',');
        $sql .= '  FROM '.$table;
        //添加查询条件
        if(!empty($where)) {
            $sql .= '  WHERE '. $where;
        }

        //添加排序条件
        if(!empty($order)) {
            $sql .= ' order by '.$order;
        }

        //去掉尾部逗号,并添加分号结束
        $sql = rtrim(trim($sql),',').';';

        //创建PDO预处理对象
        $stmt = $pdo->prepare($sql);


        //执行查询操作
        if($stmt->execute()){
            if($stmt->rowCount()>0){
                $stmt->setFetchMode(PDO::FETCH_ASSOC);
                return $stmt->fetchAll();
            }
        } else {
            return false;
        }
    }
}

//删除数据
if(!function_exists('delete')){
    function delete($pdo,$table,$where=''){
        //创建sql语句
        $sql = "DELETE FROM {$table} ";

        //添加删除条件
        if(!empty($where)) {
            $sql .= 'WHERE '. $where;
        }else{
            exit('条件不能为空');
        }

        //去掉尾部逗号,并添加分号结束
        $sql = rtrim(trim($sql),',');

        //创建PDO预处理对象
        $stmt = $pdo->prepare($sql);

        //执行新增操作
        if($stmt->execute()){
            if($stmt->rowCount()>0){
                return true;
            }
        }else{
            return false;
        }
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

操作增删该查index.php

<?php
//导入数据库操作函数库
require 'lib/funpdo.php';
//连接数据库
$type = 'mysql';
$host = 'www.develop.ss';
$dbname = 'php';
$charset = 'utf8';
$port = 3306;
$usr = 'root';
$pass = 'root';
$pdo = connect($dbname,$type,$host,$charset,$port,$usr,$pass);

//新增操作
$table = 'staff';
$data = ['name'=>'test','sex'=>1,'age'=>50,'salary'=>6000];
//insert($pdo,$table,$data);

//更新操作
$table = 'staff';
$where = 'staff_id=25';
$data = ['name'=>'test','sex'=>1,'age'=>50,'salary'=>5000];
//update($pdo,$table,$data,$where);

//单条查询操作
$table = 'staff';
$fields = ['name','age','salary'];
$fields = 'name,salary';
$where = 'age > 40';
//echo '<pre>'.print_r(find($pdo, $table, $fields, $where),true).'</pre>';

//多条查询操作
$table = 'staff';
$fields = ['name','age','salary'];
$fields = '*';
$where = 'age < 40';
$order = 'name asc';
//echo '<pre>'.print_r(select($pdo, $table, $fields, $where, $order),true).'</pre>';

//删除数据操作
$table = 'staff';
$where = 'staff_id = 26';
delete($pdo,$table,$where);

运行实例 »

点击 "运行实例" 按钮查看在线实例

总结:

    在实现这些功能过程中,我遇到一个问题,就是每次在增删改查的任何过程中都会先报错误:

    PDO::__construct(): MySQL server has gone away

    然后再刷新几次就可以正常运行,开始以为是我的代码问题,改来改去也是还是一直报这个错误,最后,终于找到了解决的方法

       当 PHP 使用PDO访问数据库且脚本需要长时间执行时,频繁会遇见’ MySQL server has gone away’的错误。分析问题产生原因:因为脚本较长时间未与数据库进行通信,导致数据库连接超时与服务器断开连接导致,这时使用断开的数据库连接操作数据库(CRUD),就会产生’ MySQLserver has gone away’的错误提示。解决之道在于长时间运行的脚本需要与服务器保持心跳,一旦检测到连接断开,则需要重新连接数据库。

        以上是网上查到的资料,但是我在PDO的设置代码中已经有了PDO::ATTR_PERSISTENT => true,启用持久性连接的设置,但是还是会断开数据库的链接。

        最后,我把这行PDO::ATTR_PERSISTENT => true代码注释后,终于正常运行了,分析的结果是:应该是你的环境配置不支持性能更佳的长连接,这个程序默认是开启MySQL长连接的。

        由于我是用的linux系统运行的,未在windows下运行,所以不知道在windows系统是否也会有这样的问题。

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学