SQL预处理赏罚语句(Prepared Statements)

时间:2014-02-15所属栏目: PHP/PHP框架 来源: 未知 热度:

很多成熟的数据库都支持预处理赏罚语句(Prepared Statements)的观念。它们是什么对象?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以行使差异的变量参数定制它。预处理赏罚语句具有两个首要的利益:

查询只必要被理会(或筹备)一次,但可以行使沟通或差异的参数执行多次。当查询筹备好(Prepared)之后,数据库就会说明,编译并优化它要执行查询的打算。对付伟大查询来说,假如你要一再执行很多次有差异参数的但布局沟通的查询,这个进程会占用大量的时刻,使得你的应用变慢。通过行使一个预处理赏罚语句你就可以停止一再说明、编译、优化的环节。简朴来说,预处理赏罚语句行使更少的资源,执行速率也就更快。

传给预处理赏罚语句的参数不必要行使引号,底层驱动会为你处理赏罚这个。假如你的应用独有地行使预处理赏罚语句,你就可以确信没有SQL注入会产生。(然而,假如你如故在用基于不受信赖的输入来构建查询的其他部门,这如故是具有风险的)。

正由于预处理赏罚语句是云云有效,它成了PDO独一为不支持此特征的数据库提供的模仿实现。这使你可以行使同一的数据会见类型而不必体谅数据库自己是否具备此特征。

/*
行使预处理赏罚语句一再插入数据(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();
/*
行使预处理赏罚语句一再插入数据(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';
$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);
    }
}

着实主流的PHP框架都支持Prepared Statements,并且要简朴许多。下面是ThinkPHP模子支持的例子:

/*
实例化User模子
*/
$model = D('User');
/*
界说预处理赏罚传入数据
*/
$data['username'] = 'deeka';
$data['password'] = '123456';
/*
数据预处理赏罚
*/
if($model->create($data)){
    $model->add();
}
标签:mysql, Prepared Statements, SQL预处理赏罚语句, thinkphp
标签:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)