我們有時候會在投票系統中實現多項選擇,但是我們多數的做法是用一個迴圈來插入我們的資料,好像以下的情況:
1 if (isset($_POST['ids'])) {
2
3 foreach($_POST ['ids'] as $id) {
4
5 $rs = mysql_query('INSERT INTO table_name(id) VALUES('.(int)$id. ') ';
6
7 }
8
9 } 但是這個做法是非常浪費資源的,而且這樣做很費時間,因為我們都知道在PHP程式中,最費時的是與資料庫通訊,所以我們盡量減少PHP與資料庫的通訊。那我們怎麼做才可以減少PHP查詢資料庫的次數呢?
下面我們介紹一種方法:
使用預存程序(MySQL5 only):
我們可以使用預存程序來減少PHP與MySQL資料庫的通訊,怎麼做呢?
首先我們可以建立一個預存程序:
1 DELIMITER //
2
3 CREATE PROCEDURE insert_data(datas varchar(100))
4
5 BEGIN
6
7 DECLARE comma_pos INT;
8
9 DECLARE current_id INT;
10
11 svcs: LOOP
12
13 SET comma_pos = LOCAL(',', datas);
14
15 SET current_id = SUBSTR(datas, 1, comma_pos);
16
17 IF current_id <> 0 THEN
18
19 SET datas = SUBSTR(datas, comma_pos + 1);
20
21 ELSE
22
23 SET current_id = datas;
24
25 END IF;
26
27 INSERT INTO table_name(id) VALUES(current_id);
28
29 IF current_id = 0 THEN
30
31 LEAVE svcs;
32
33 END IF;
34
35 END LOOP;
36
37 END
38
39 //
40
41 DELIMITER ; 這個預存程序接受一個字串作為參數,這個參數是用,隔開的id,這是由於MySQL的預存程序並不支援數組,所以可以用這種方法類比數組。
建立好這個預存程序之後,我們可以使用PHP來調用這個預存程序:
1 if (isset($_POST['ids'])) {
2
3 $datas = implode(',', $_POST['$id']);
4
5 $rs = mysql_query('CALL insert_data('.$datas.')');
6
7 } 這樣我們就可以調用一次查詢就可以把幾條資料插入到MySQL中了,這樣可以減少PHP與MySQL的通訊,加快了PHP的運行速度。
另外,預存程序還可以幫我們解決:
1. 一致性:因為我們的資料庫一般不會只是給PHP來調用的,好像圖書館系統那樣,我們的MySQL資料庫還會給.NET來使用,但是每個程式都要寫一個很長的調用資料庫的查詢就變得非常麻煩了,所以我們也可以使用預存程序來解決多種語言調用資料庫時,不用重複開發SQL語句。
2. 安全性:對於很多機密性較高的機構,好像銀行和軍事機密那樣,我們一般都是使用預存程序來限制程式對資料庫的高度訪問和修改,這樣就可以很好的保護我們的資料了!
3. 高效性:一個大型的程式不可能是一個人來完成的,所以一個團隊開發的時候避免重複編寫調用資料庫的查詢,使用預存程序也是一個非常不錯的方案。
因為預存程序可以實現一般的邏輯運算,所以有時候我們把資料庫的資料查詢出來,再用PHP來判斷資料是否合適這樣方法是非常不好的,我們可以把一些簡單的邏輯運算分給MySQL來處理,這樣會大大提高程式的效率的!因為預存程序是MySQL5的新功能,所以我們應該好好的學習一下這個強大的功能!