Correction status:qualified
Teacher's comments:
<?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; } } }
点击 "运行实例" 按钮查看在线实例
<?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系统是否也会有这样的问题。