SQL预处理语句(PreparedStatements)
SQL预处理语句(Prepared Statements)
许多成熟的数据库都⽀持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是⼀种编译过的要执⾏的SQL语句模板,可以使⽤不同的变量参数定制它。预处理语句具有两个主要的优点:
查询只需要被解析(或准备)⼀次,但可以使⽤相同或不同的参数执⾏多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执⾏查询的计划。对于复杂查询来说,如果你要重复执⾏许多次有不同参数的但结构相同的查询,这个过程会占⽤⼤量的时间,使得你的应⽤变慢。通过使⽤⼀个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使⽤更少的资源,执⾏速度也就更快。
传给预处理语句的参数不需要使⽤引号,底层驱动会为你处理这个。如果你的应⽤独占地使⽤预处理语句,你就可以确信没有SQL注⼊会发⽣。(然⽽,如果你仍然在⽤基于不受信任的输⼊来构建查询的其他部分,这仍然是具有风险的)。
正因为预处理语句是如此有⽤,它成了PDO唯⼀为不⽀持此特性的数据库提供的模拟实现。这使你可以使⽤统⼀的数据访问规范⽽不必关⼼数据库本⾝是否具备此特性。
1        2        3        4        5        6        7        8        9        10        11        12        13        14        15        16        17        18        19        20        21        22        23        24          /*
使⽤预处理语句重复插⼊数据(1)
此⽰例演⽰了⼀个通过向命名占位符代⼊⼀个name和⼀个value值来执⾏的INSERT查询
*/
$stmt= $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");          $stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value); //插⼊⼀⾏
$name= 'one';
$value= 1;
$stmt->execute();//使⽤不同的值插⼊另⼀⾏
$name= 'two';
$value= 2;
$stmt->execute();
/*param name
使⽤预处理语句重复插⼊数据(2)
此⽰例演⽰了⼀个通过向⽤?表⽰的占位符代⼊⼀个name和⼀个value值来执⾏的INSERT查询          */
$stmt= $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value); // 插⼊⼀⾏
$name= 'one';
$value= 1;
$stmt->execute(); // 使⽤不同的值插⼊另⼀⾏
$name= 'two';
其实主流的PHP框架都⽀持Prepared Statements,⽽且要简单很多。下⾯是ThinkPHP模型⽀持的例⼦:        25
26
27
28
29
30
31
32
33
34
35
36                $value= 2;                  $stmt->execute();                  /*                  通过预处理语句获取数据                  此⽰例演⽰使⽤从表单获取的数据为关键值来执⾏查询获取数据。⽤户的输⼊会被⾃动添加引号,所以这⼉不存在SQL 注⼊攻击的危险。                  */                  $stmt= $dbh->prepare("SELECT * FROM REGISTRY where name = ?");                      if($stmt->execute(array($_GET['name']))) {                          while($row= $stmt->fetch()) {                          print_r($row);                      }                  }                1
2
3
4
5
6
7
8
9
10
11
12
13
14
15                /*                  实例化User 模型                  */                  $model= D('User');                  /*                  定义预处理传⼊数据                  */                  $data['username'] = 'deeka';                  $data['password'] = '123456';                  /*                  数据预处理                  */                  if($model->create($data)){                      $model->add();                  }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。