Home | Mirror | Search

3. Database

使用pdo_mysql替代mysql

錯誤的寫法,通過字元串連結拼接sql語句極容易出現注入漏洞

$sql = "select * from table where id=".$id;
$sql = "select * from table where id='".$id."'";
$sql = "INSERT INTO fruit(name, colour) VALUES ('".$name."', '".$colour."')";
		

正確的寫法

$sql = "select * from table where id=?";
$sql = "INSERT INTO fruit(name, colour) VALUES (?, ?)";
		
		
$sql = <<<____SQL
     CREATE TABLE IF NOT EXISTS `ticket_hist` (
       `tid` int(11) NOT NULL,
       `trqform` varchar(40) NOT NULL,
       `trsform` varchar(40) NOT NULL,
       `tgen` datetime NOT NULL,
       `tterm` datetime,
       `tstatus` tinyint(1) NOT NULL
     ) ENGINE=ARCHIVE COMMENT='ticket archive';
____SQL;
		
		

3.1. 結果集使用注意事項

返回資料庫查詢結果有幾種形式

數組形式

			
Array
(
    [0] => banana
    [1] => yellow
)

Array
(
    [NAME] => banana
    [COLOUR] => yellow
)
			
			

對象形式

Object
(
	Obj->NAME
	Obj->COLOUR
)
			

正確的使用方式

print($row[name])
print($row->name)
			

錯誤的使用使方式

print($row[0])
			

避免使用 "*"查詢,一會影響性能,二增加頻寬開銷

$sql = "select * from tab where status=0 limit 1";
			

如果程序使用$row[1]讀取結果,有可能當資料庫結構改變,增加欄位,欄位順序發生變化,輸出數據都會出錯

3.2. 索引

下面的例子,不會使用索引

$sql = "select id, name, created from tab where id != 100";
			
EXPLAIN select * from members where id != '1010';			索引失效
EXPLAIN select count(*) from members where id != '1010';	索引有效
			

3.3. 緩存


			

下面的例子,數據不會緩存查詢結果

$sql = "select id, name, created from tab where created=now()";
			
comments powered by Disqus