0%

[PHP]練習解答 01 常用自訂函式

先宣告全部函式都會用到的資料庫連線設定及建立PDO資料庫物件

1
2
$dsn="mysql:host=localhost;charset=utf8;dbname=dbname";
$pdo=new PDO($dsn,'root','password');

all()-給定資料表名和條件後,會回傳符合條件的所有資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* $table - 資料表名稱 字串型式
* ...$arg - 參數型態
* 1. 沒有參數,撈出資料表全部資料
* 2. 一個參數:
* a. 陣列 - 撈出符合陣列key = value 條件的全部資料
* b. 字串 - 撈出符合SQL字串語句的全部資料
* 3. 二個參數:
* a. 第一個參數必須為陣列,同2-a描述
* b. 第二個參數必須為字串,同2-b描述
*/

function all($table,...$arg){
global $pdo;

//建立共有的基本SQL語法
$sql="SELECT * FROM $table ";

//依參數數量來決定進行的動作因此使用switch...case
switch(count($arg)){
case 1:

//判斷參數是否為陣列
if(is_array($arg[0])){

//使用迴圈來建立條件語句的字串型式,並暫存在陣列中
foreach($arg[0] as $key => $value){

$tmp[]="`$key`='$value'";

}

//使用implode()來轉換陣列為字串並和原本的$sql字串再結合
$sql.=" WHERE ". implode(" AND " ,$tmp);
}else{

//如果參數不是陣列,那應該是SQL語句字串,因此直接接在原本的$sql字串之後即可
$sql.=$arg[0];
}
break;
case 2:

//第一個參數必須為陣列,使用迴圈來建立條件語句的陣列
foreach($arg[0] as $key => $value){

$tmp[]="`$key`='$value'";

}

//將條件語句的陣列使用implode()來轉成字串,最後再接上第二個參數(必須為字串)
$sql.=" WHERE ". implode(" AND " ,$tmp) . $arg[1];
break;

//執行連線資料庫查詢並回傳sql語句執行的結果
}

//fetchAll()加上常數參數FETCH_ASSOC是為了讓取回的資料陣列中
//只有欄位名稱,而沒有數字的索引值
return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);

}

find()-會回傳資料表指定條件的單筆資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* $table - 資料表名稱 字串型式
* $arg 參數型態
* 1. 陣列 - 撈出符合陣列key = value 條件的單筆資料
* 2. 字串 - 必須是資料表的id,數字型態,且資料表有id這個欄位
*/

function find($table,$arg){
global $pdo;

$sql="SELECT * FROM $table WHERE ";
if(is_array($arg)){

foreach($arg as $key => $value){

$tmp[]="`$key`='$value'";

}

$sql.=implode(" AND " ,$tmp);

}else{

$sql.=" `id`='$arg'";

}

return $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
}

update()-給定資料表的條件後,會去更新相應的資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* $table - 資料表名稱 字串型式
* $cols - 陣列 - 更新指定欄位的值
* 陣列中必須有一個欄位是'id',才能指定該id的資料進行更新
*/

//更新指定id的單筆資料
function update($table,$cols){
global $pdo;

foreach($cols as $key => $value){

if($key!='id'){

$tmp[]="`$key`='$value'";
}

}

$sql.="UPDATE $table SET ".implode(" AND " ,$tmp)." WHERE `id`='{$cols['id']}'";

return $pdo->exec($sql);
}

/**
* $table - 資料表名稱 字串型式
* $cols - 陣列 - 更新指定欄位的值
* $where - 陣列 - 更新的條件,以陣列方式存放
*/

//更新指定條件的多筆資料
function update($table,$cols,$where){
global $pdo;

foreach($cols as $key => $value){

$tmp_cols[]="`$key`='$value'";
}

foreach($where as $key => $value){

$tmp_where[]="`$key`='$value'";
}

$sql.="UPDATE $table SET ".implode("," ,$tmp_cols)." WHERE `".implode(" AND " ,$tmp_where).;

return $pdo->exec($sql);
}

insert()-給定資料內容後,會去新增資料到資料表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* $table - 資料表名稱 字串型式
* $arg - 陣列 - 新增資料指定的欄位的和值
*/

function insert($table,$arg){
global $pdo;

//使用array_keys()函式將陣列中的key值取出做成一個獨立的陣列
$cols=implode("`,`",$array_keys($arg));
$values=implode("','",$arg);

$sql="INSERT INTO $table (`$cols`) VALUES('$values')";

return $pdo->exec($sql);
}

del()-給定條件後,會去刪除指定的資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* $table - 資料表名稱 字串型式
* $arg 參數型態
* 1. 陣列 - 刪除符合陣列key = value 條件的所有資料
* 2. 字串 - 必須是資料表的id,數字型態,且資料表有id這個欄位
*/

function del($table,$arg){
global $pdo;

$sql="DELETE FROM $table WHERE ";
if(is_array($arg)){

foreach($arg as $key => $value){

$tmp[]="`$key`='$value'";

}

$sql.=implode(" AND " ,$tmp);

}else{

$sql.=" `id`='$arg'";

}

return $pdo->exec($sql);
}

math()-使用指定的聚合函數進行資料表的計算或取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* $table - 資料表名稱 字串型式
* $math - 聚合函式名稱,必須有,支援以下聚合函式:
* count、max、min、avg、sum
* $col - 要進行計算的欄位 字串型式
* ...$arg - 參數型態
* 1. 沒有參數,針對資料表全部資料進行計算
* 2. 陣列 - 計算符合陣列key = value 條件的全部資料
*/

function math($table,$math,$col,...$arg){
global $pdo;

$sql="SELECT $math(`$col`) FROM $table ";

if(!empty($arg[0])){

foreach($arg[0] as $key => $value){

$tmp[]="`$key`='$value'";

}

$sql.=" WHERE " . implode(" AND " ,$tmp);

}

//使用fetchColumn()來取回第一欄位的資料,因為這個SQL語法
//只有select 一個欄位的資料,因此這個函式會直接回傳計算的結果出來
return $pdo->query($sql)->fetchColumn();
}

to()-頁面導向,取代header(‘location:url’)

1
2
3
4
5
6
7
8
9
/**
* $url - 要導向的檔案路徑及檔名
*/

function to($url){

header("location:".$url);

}

q()-可以用來撰寫較為複雜的SQL語句,並回傳查詢結果的全部資料

1
2
3
4
5
6
7
8
9
10
/**
* $sql - SQL語句字串,取出符合SQL語句的全部資料
*/

function q($sql){
global $pdo;

return $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);

}

save()-整合insert()和update()的功能為一支函式

如果以一次一筆資料來進行更新或新增時,我們可以發現兩個函式傳入的參數是類似的:

新增 - insert($table,$arg);

更新 - update($table,$arg);

其中兩個$arg的主要差異在於是否有 id 這個欄位,新增的資料不會 id 這個欄位,而更新單筆資料時通常會需要指定 id 因此利用這個差異,我們設計讓兩個功能整合在一支函式中,可以擴展自訂函式的功用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* $table - 資料表名稱 字串型式
* $arg - 陣列型式
* 1. 如果陣列中有key值為id,則執行更新(update)的功能
* 2. 如果陣列中沒有key值為id,則執行新增(insert)的功能
*/

function save($table,$arg){
global $pdo;
if(isset($arg['id'])){
//update

foreach($arg as $key => $value){

if($key!='id'){

$tmp[]="`$key`='$value'";
}

}
//建立更新的sql語法
$sql.="UPDATE $table SET ".implode(" , " ,$tmp)." WHERE `id`='{$arg['id']}'";

}else{
//insert
$cols=implode("`,`",$array_keys($arg));
$values=implode("','",$arg);

//建立新增的sql語法
$sql="INSERT INTO $table (`$cols`) VALUES('$values')";

}

return $pdo->exec($sql);

}