关于php如何连贯操作类方法(以数据库为例)
关于php如何连贯操作类方法(以数据库为例)
1、下面是我写好的关于mysqli操作数据库的一些常用方法,大神请掠过
1 <?php 2 3 class Db 4 { 5 static private $config = [ 6 'datahost' => '', // 主机名 7 'dataname' => '', // 数据库名 8 'username' => '', // 用户名 9 'password' => '', // 用户密码 10 'charset' => 'utf8', // 默认字符集 11 'prefix' => '', // 表前缀 12 'dataport' => '3306', // 端口号 13 'returntype'=> MYSQLI_ASSOC,// 查询返回的类型,默认是关联数组 14 'pk' => 'id', // 默认主键名称 15 ]; 16 static private $con = null; // mysqli数据库对象 17 static public $obj = null; // Db类对象 18 static private $error= ''; // 报错信息 19 static public $data = [ 20 'name' => '', // 表名称 21 'where' => '', // 条件 22 'field' => '*', // 所需字段 23 'limit' => '', // 查询条数 24 'order' => '', // 排序 25 'group' => '', // 分组 26 'having'=> '', // having 27 'join' => '', // 内连接 28 // 'leftjoin' => '', // 左连接 29 // 'rightjoin'=> '', // 右连接 30 'on' => '', // 连接关联字段 31 'sql' => '', // 最后一次执行的sql 32 ]; // 数据集 33 34 /** 35 * 初始化 36 */ 37 private function __construct() 38 { 39 // 连接数据库操作 40 self::connect(); 41 } 42 43 /** 44 * 连接数据库 45 */ 46 static private function connect() 47 { 48 self::$con = @mysqli_connect(self::$config['datahost'], self::$config['username'], self::$config['password'], self::$config['dataname'], self::$config['dataport']); 49 if (! self::$con) 50 { 51 die('数据库连接失败'.mysqli_connect_error()); 52 } 53 // 设置字符集 54 mysqli_set_charset(self::$con, self::$config['charset']); 55 } 56 57 /** 58 * 设置变量 59 */ 60 public function __set($name, $value) 61 { 62 if (array_key_exists($name, self::$config)) 63 { 64 self::$config[$name] = $value; 65 } 66 } 67 68 /** 69 * 释放变量 70 */ 71 public function __unset($name) 72 { 73 if (array_key_exists($name, self::$config)) 74 { 75 unset(self::$config[$name]); 76 } 77 } 78 79 /** 80 * 初始化 81 * @param array $config 配置文件 82 */ 83 static public function init($config = []) 84 { 85 // 初始化配置文件 86 self::parseParams($config); 87 if (!is_object(self::$obj)) 88 { 89 self::$obj = new self; 90 } 91 return self::$obj; 92 } 93 94 /** 95 * 设置配置文件 96 * @param array $config 配置文件 97 */ 98 static private function parseParams($config) 99 { 100 // 加载调用时的config配置 101 if (is_array($config)) 102 { 103 foreach ($config as $key => $val) 104 { 105 if (array_key_exists($key, self::$config)) 106 { 107 self::$config[$key] = $val; 108 } 109 } 110 } 111 } 112 113 /** 114 * 执行一条sql语句 115 */ 116 static private function query($sql = '') 117 { 118 if (empty($sql)) 119 { 120 $query = mysqli_query(self::$con, self::$data['sql']); 121 } 122 else 123 { 124 $query = mysqli_query(self::$con, $sql); 125 } 126 return $query; 127 } 128 129 /** 130 * 释放结果集 131 */ 132 static private function free($result) 133 { 134 if (!is_bool($result)) 135 { 136 // 释放结果集 137 mysqli_free_result($result); 138 // 重置所有值 139 foreach (self::$data as $k => $v) 140 { 141 if ($k == 'field') 142 { 143 self::$data[$k] = '*'; 144 } 145 else 146 { 147 self::$data[$k] = ''; 148 } 149 } 150 } 151 } 152 153 /** 154 * 返回INSERT UPDATE DELETE 影响行数 155 */ 156 static public function rowNum() 157 { 158 if (self::$con) 159 { 160 return mysqli_affected_rows(self::$con); 161 } 162 } 163 164 /** 165 * 设置出错信息 166 */ 167 static public function setError() 168 { 169 if (self::$con) 170 { 171 self::$error = mysqli_error(self::$con); 172 } 173 } 174 175 /** 176 * 设置表名(不带前缀) 177 * @param string $table_name 表名称 178 */ 179 public function name($table_name) 180 { 181 self::$data['name'] = self::$config['prefix'].$table_name; 182 return self::$obj; 183 } 184 185 /** 186 * 设置表名(带前缀) 187 * @param tring $table_name 表名称 188 */ 189 public function table($table_name) 190 { 191 self::$data['name'] = $table_name; 192 return self::$obj; 193 } 194 195 /** 196 * 需要的字段 197 * @param string $value 需要字段,如id,username,password 198 */ 199 public function field($value) 200 { 201 self::$data['field'] = " {$value} "; 202 return self::$obj; 203 } 204 205 /** 206 * 获取指定记录 207 * @param int $star 开始位置 208 * @param int $end 结束位置 209 */ 210 public function limit($star, $end = '') 211 { 212 if (!empty($end)) 213 { 214 self::$data['limit'] = " LIMIT {$star},{$end} "; 215 } 216 else 217 { 218 self::$data['limit'] = " LIMIT {$star} "; 219 } 220 return self::$obj; 221 } 222 223 /** 224 * 查询的条件 225 * @param string 查询的条件,如:id='32' AND username='test' 226 */ 227 public function where($value) 228 { 229 if (!empty($value) && is_string($value)) 230 { 231 self::$data['where'] = " WHERE {$value} "; 232 } 233 return self::$obj; 234 } 235 236 /** 237 * 内联接 238 */ 239 public function join($value, $method = 'join') 240 { 241 if (!empty($value)) 242 { 243 switch(strtolower($method)) 244 { 245 case 'join': 246 default: 247 self::$data['join'] = " JOIN {$value} "; 248 break; 249 case 'ljoin': 250 self::$data['join'] = " LEFT JOIN {$value} "; 251 break; 252 case 'rjoin': 253 self::$data['join'] = " RIGHT JOIN {$value} "; 254 break; 255 } 256 257 } 258 return self::$obj; 259 } 260 261 /** 262 * 联接查询绑定 263 */ 264 public function on($value) 265 { 266 if (!empty($value)) 267 { 268 self::$data['on'] = " ON {$value} "; 269 } 270 return self::$obj; 271 } 272 273 /** 274 * having 筛选 275 */ 276 public function having($value) 277 { 278 // 279 return self::$obj; 280 } 281 282 /** 283 * 字段排序 284 * @param string $value 排序的字段和排序方式,如:id desc,username asc 285 */ 286 public function order($value) 287 { 288 if (!empty($value)) 289 { 290 self::$data['order'] = " ORDER BY {$value} "; 291 } 292 return self::$obj; 293 } 294 295 /** 296 * 分组 297 * @param string $value 字段分组,如:id,username 298 */ 299 public function group($value) 300 { 301 if (!empty($value)) 302 { 303 self::$data['group'] = " GROUP BY {$value} "; 304 } 305 return self::$obj; 306 } 307 308 /** 309 * 删除 310 */ 311 public function delete() 312 { 313 if (!empty(self::$data['where'])) 314 { 315 self::$data['sql'] = "DELETE FROM `".self::$data['name']."`".self::$data['where']; 316 $query = self::query(); 317 318 if (is_bool($query)) 319 { 320 self::free($query); 321 return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数 322 } 323 else 324 { 325 self::setError(); // 设置错误信息 326 return false; 327 } 328 } 329 return false; // 没有带条件的删除不能成功 330 331 } 332 333 /** 334 * 更新 335 */ 336 public function save($value) 337 { 338 if (is_string($value)) 339 { 340 if (!empty(self::$data['where'])) 341 { 342 self::$data['sql'] = "UPDATE `".self::$data['name']."` SET ".$value.self::$data['where']; 343 $query = self::query(); 344 345 if (is_bool($query)) 346 { 347 self::free($query); 348 return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数 349 } 350 else 351 { 352 self::setError(); // 设置错误信息 353 return false; 354 } 355 } 356 else 357 { 358 return false; // 没有带条件的更新不能成功 359 } 360 } 361 } 362 363 /** 364 * 新增(可以传两种值,一种是数组,一种是字段和对应的值) 365 * 数组:$data['username'] = 'abcd' 或 $data = ['username'=>'abcd'] 366 * 键值:'username', "'abcd'" 367 */ 368 public function insert() 369 { 370 if (func_num_args() === 2) // 两个参数,第一个是字段,第二个是值 371 { 372 list($field, $value) = func_get_args(); 373 self::$data['sql'] = "INSERT INTO ".self::$data['name']."({$field}) VALUES({$value})"; 374 $query = self::query(); 375 } 376 elseif(func_num_args() === 1) // 一个参数,数组 377 { 378 list($data) = func_get_args(); 379 $field = ''; 380 $value = ''; 381 if (is_array($data)) 382 { 383 foreach ($data as $key => $val) 384 { 385 $field .= "{$key},"; 386 if (is_string($val)) 387 { 388 $value .= "'{$val}',"; 389 } 390 else 391 { 392 $value .= "{$val},"; 393 } 394 } 395 $field = rtrim($field, ','); 396 $value = rtrim($value, ','); 397 self::$data['sql'] = "INSERT INTO ".self::$data['name']."({$field}) VALUES ({$value})"; 398 $query = self::query(); 399 } 400 } 401 402 if (is_bool($query)) 403 { 404 self::free($query); 405 return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数 406 } 407 else 408 { 409 self::setError(); // 设置错误信息 410 return false; 411 } 412 } 413 414 /** 415 * 获取记录数 416 * @param string $aliax 别名 417 */ 418 public function count($alias = 'num') 419 { 420 self::$data['sql'] = "SELECT COUNT(*) AS {$alias} FROM ".self::$data['name'].self::$data['where']; 421 $query = self::query(); 422 423 $result = mysqli_fetch_array($query, self::$config['returntype']); 424 425 self::free($query); 426 427 return $result[$alias]; 428 } 429 430 /** 431 * 查询一条记录 432 * @param string $id 主键字段的值 433 * @return array $result 返回结果数组 434 */ 435 public function find($id = '') 436 { 437 if (empty($id)) 438 { 439 self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."`".self::$data['where'].self::$data['order']; // sql语句 440 } 441 else 442 { 443 self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."` WHERE `".self::$config['pk']."`={$id}".self::$data['order']; 444 } 445 echo self::$data['sql']; 446 $query = self::query(); 447 448 if (!is_bool($query)) 449 { 450 $result = mysqli_fetch_array($query, self::$config['returntype']); 451 452 self::free($query); // 释放结果集 453 454 return $result; // 返回结果 455 } 456 else 457 { 458 self::setError(); 459 return ; 460 } 461 } 462 463 /** 464 * 查询记录 465 * @param string $sql 查询的sql语句 466 */ 467 public function select($sql = '') 468 { 469 if (!empty($sql)) 470 { 471 $query = self::query($sql); 472 } 473 else 474 { 475 self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."` ".self::$data['join'].self::$data['on'].self::$data['where'].self::$data['group'].self::$data['order'].self::$data['limit']; 476 $query = self::query(); 477 } 478 if (!is_bool($query)) 479 { 480 $result = mysqli_fetch_all($query, self::$config['returntype']); 481 482 self::free($query); 483 484 return $result; 485 } 486 else 487 { 488 self::setError(); 489 return ; 490 } 491 } 492 493 /** 494 * 返回错误信息 495 */ 496 public function getError() 497 { 498 return self::$error; 499 } 500 501 /** 502 * 获取当前数据库服务器版本 503 */ 504 public function getVersion() 505 { 506 if (self::$con) 507 { 508 return mysqli_get_server_info(self::$con); 509 } 510 } 511 512 /** 513 * 关闭数据库连接 514 */ 515 public function __destruct() 516 { 517 if (self::$con) 518 { 519 mysqli_close(self::$con); 520 } 521 } 522 523 /** 524 * 调用不存在的公共方法是触发 525 */ 526 public function __call($name, $arguments) 527 { 528 exit("在Core\\Db中不存在{$name}方法!"); 529 } 530 531 /** 532 * 当调用不存在的静态方法是触发 533 */ 534 static public function __callStatic($name, $params) 535 { 536 call_user_func_array(['self', 'init'], $params); 537 } 538 }
2、我们如何使用这个类
1)使用 find() 方法:
1 require 'Db.php'; 2 3 $config = [ 4 'datahost' => 'localhost', 5 'username' => 'root', 6 'password' => '12345678', 7 'charset' => 'utf8', 8 'dataname' => 'test', 9 'prefix' => 't_', 10 ]; // 这是数据库配置文件,可以写在外部 11 12 var_dump( Db::init($config)->name('user')->where("id=3")->find() );
2)使用 select($sql) 方法(查询所有记录):
1 var_dump( Db::init($config)->name('user')->where("id=3")->select() );
3)save($data)更新,insert()插入,delete()删除,join,order,group,where,name,table,limit,field等等方法,自己研究研究。
还有其他的方法,不一一列举了,看类文件一目了然。
I need you ideas!