<?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系统是否也会有这样的问题。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号