有部分的開發人員可能會認為使用引數化查詢,會讓程式更不好維護,或者在實現部分功能上會非常不便[**請求],然而,使用引數化查詢造成的額外開發成本,通常都遠低於因為sql注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。
除了安全因素,相比起拼接字串的sql語句,引數化的查詢往往有效能優勢。因為,引數化的查詢能讓不同的資料通過引數到達資料庫,從而公用一條sql語句。大多數資料庫會快取解釋sql語句產生的位元組碼而省下重複解析的開銷。如果採用拼接字串的sql語句,則會用於運算元據是sql語句的一部分而非引數的一部分,而反覆大量解釋sql語句產生不必要的開銷。
mysql的引數格式是以 "?" 字元加上引數名稱而成。
update mytable set c1 = ?c1, c2 = ?c2, c3 = ?c3 where c4 = ?c4
1、pdo
pdo用於php之內。在使用pdo驅動時,引數查詢的使用方法一般為:
// 例項化資料抽象層物件
$db = new pdo('pgsql:host=127.0.0.1;port=5432;dbname=testdb');
// 對 sql 語句執行prepare,得到pdostatement物件$stmt = $db->prepare('select * from mytable where "id" = :id and "is_valid" = :is_valid');
// 繫結引數
$stmt->bindvalue(':id',$id);
$stmt->bindvalue(':is_valid',true);
// 查詢
$stmt->execute();
// 獲取資料
froeacha($stmt as $row)
2、mysqli
$db = new mysqli("localhost","user","pass","database");
$stmt = $db->prepare("select priv from testusers where username=? and password=?");
$stmt->bind_param("ss",$user,$pass);
$stmt->execute();
3、mysql_real_escape_string
值得注意的是,以下方式雖然能有效防止sql注入 (歸功於 mysql_real_escape_string 函式的轉義),但並不是真正的引數化的查詢,其本質仍然是拼接字串的sql語句。
$query = sprintf("select * from user where username='%s' and password='%s',mysql_real_escape_string($username),mysql_real_escape_string($password)");
$mysql_query($query);
引數化防止注入
string strsql insert into student name,gender,banji,student id,phone,qq,describe,time values name,gender,banji,student id,phone,qq,describe,time sqlpa...
MySql引數化模糊查詢
今天在做mysql模糊查詢的時候碰到一些問題,利用引數化的時候會使語法不正確,之前的錯誤 sqltwo and collegename like collegename limit index,pagesize 錯誤的語句,會導致模糊查詢出問題 因為這種寫法編譯過來是錯誤的接下來是修改後的語句 sq...
引數化查詢
一 using system using system.collections.generic using system.linq using system.text using model using system.data.sqlclient using system.data namespac...