当前位置:  数据库>sqlserver

SQL预处理语句(Prepared Statements)用法举例

    来源: 互联网  发布时间:2014-08-29

    本文导语:  许多成熟的数据库都支持预处理语句(prepared statements)的概念。 可以把它们想成是一种编译过的要执行的sql语句模板,可以使用不同的变量参数定制它。 sql预处理语句具有两个主要的优点: 查询只需要被解析(或准备)一次...

许多成熟的数据库都支持预处理语句(prepared statements)的概念。
可以把它们想成是一种编译过的要执行的sql语句模板,可以使用不同的变量参数定制它。

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();
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  • C#调用SQL语句时乘号的用法
  • sql中all,any,some用法
  • SQL事务用法begin tran,commit tran和rollback tran的用法
  • sql游标的用法简单笔记
  • sql查询语句group by用法简介
  • 浅析SQL语句中GROUP BY的用法
  • sql server中ISNULL函数与Mysql中IFNULL函数的用法
  • SQL中object_id函数的用法
  • SQL cursor用法实例
  • sql语句中isnull函数用法 实例教程
  • sql Set IDENTITY_INSERT的用法
  • if exists和if not exists关键字用法(sql server)
  • SQL SELECT DISTINCT 语句用法
  • sql数据库中ISNULL函数用法 sql语句判断值是否为空
  • [Oracle] 常用工具集之SQL*Loader的用法
  • 求SQL Server 2000 JDBC的用法!(高分)
  • sql server中Group By语句的用法
  • sql server 中 Select 检索高级用法
  • sql模糊查询与sql通配符的用法
  • sql通配符用法参考
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端软件 PKLite SQL Client


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3