因為開源的原因,PHP配合MySQL資料庫搭建網站的方式還是比較流行的,特別是創業型企業。今天把PHP對MySQL資料庫的連線、查詢等操作封裝了幾個函式,方便學習。
1、 資料庫配置資訊
把資料庫的資訊單獨用一個配置檔案儲存起來,方便維護,當然也可以把系統其他的配置資訊寫檔案中,一起維護。程式碼如下:
<?php
return [
// 資料庫連線配置
'DB_CONNECT' => [
'host' => 'localhost',
'user' => 'root',
'pass' => 'root123',
'dbname' => 'test',
'port' => '3306'
],
// 資料庫字符集
'DB_CHARSET' => 'utf8',
//系統資料分頁時每頁顯示資料記錄數
'Page'=>10,
];
2、讀取配置資訊
把讀取配置資訊的操作,封裝成一個函式,方便在程式的不同地方呼叫。
<?php
/**
* 讀取配置
* @param string $name 配置項
* @return mixed 配置值
*/
function config($name) {
static $config = null;
if (!$config) {
$config = require '../config/config.php';//配置檔案的路徑要正確
}
return isset($config[$name]) ? $config[$name] : '';
}
3、資料庫相關操作
資料庫操作主要是連線資料庫、資料的增刪改查操作,採用預處理的方式執行SQL語句,可以防止SQL注入的風險。
<?php
/**
* 連線資料庫
* @return mysqli 資料庫連線
*/
function db_connect(){
static $link = null;//定義為靜態的,建立連線後,再次呼叫資料庫連線 函式時,可以直接返回資料庫連線,而不是一直生成
if (!$link) {
$config = array_merge(['host' => '', 'user' => '', 'pass' => '', 'dbname' => '', 'port' => ''], config('DB_CONNECT'));//讀取資料庫配置,並和前面的空數組合並
if (!$link = call_user_func_array('mysqli_connect', $config)) {
exit('資料庫連線失敗:' . mysqli_connect_error());
}
mysqli_set_charset($link, config('DB_CHARSET'));
}
return $link;
}
/**
* 執行SQL語句
* @param string $sql SQL語句
* @param string $type 引數繫結的資料型別(i、d、s、b)
* @param array $data 引數繫結的資料
* @return mysqli_stmt
*/
function db_query($sql, $type = '', array $data = []){
$link = db_connect();
if (!$stmt = mysqli_prepare($link, $sql)) {
exit("SQL[$sql]預處理失敗:" . mysqli_error($link));
}
if (!empty($data)) {
$args = [$stmt, $type];
foreach ($data as &$args[]);
call_user_func_array('mysqli_stmt_bind_param', $args);
}
if (!mysqli_stmt_execute($stmt)) {
exit('資料庫操作失敗:' . mysqli_stmt_error($stmt));
}
return $stmt;
}
function db_fetch_all($sql, $type = '', array $data = []){//引數同上,獲得全部結果
$stmt = db_query($sql, $type, $data);
return mysqli_fetch_all(mysqli_stmt_get_result($stmt), MYSQLI_ASSOC);
}
function db_fetch_row($sql, $type = '', array $data = []){//引數同上,獲得一條記錄
$stmt = db_query($sql, $type, $data);
return mysqli_fetch_assoc(mysqli_stmt_get_result($stmt));
}
function db_exec($sql, $type = '', array $data = []){
$stmt = db_query($sql, $type, $data);
return (strtoupper(substr(trim($sql), 0, 6)) == 'INSERT') ? mysqli_stmt_insert_id($stmt) : mysqli_stmt_affected_rows($stmt);//如果執行的是插入操作,返回插入資料的ID,否則返回所影響的記錄行數
}