PDO预处理语句PDOStatement对象使用总结
《PDO预处理语句PDOStatement对象使用总结》要点: PHP教程PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()办法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的.如果通过之前执行PDO对象中的query()办法返回的PDOStatement类对象,只代表的是一个结果集对象.而如果通过执行PDO对象中的prepare()办法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令.PDOStatement类中的全部成员办法如下所示:
代码如下:
PDOStatement::bindColumn ― 绑定一列到一个 PHP 变量 PDOStatement::bindParam ― 绑定一个参数到指定的变量名 PDOStatement::bindValue ― 把一个值绑定到一个参数 PDOStatement::closeCursor ― 关闭游标,使语句能再次被执行. PDOStatement::columnCount ― 返回结果集中的列数 PDOStatement::debugDumpParams ― 打印一条 SQL 预处理命令 PDOStatement::errorCode ― 获取跟上一次语句句柄操作相关的 SQLSTATE PDOStatement::errorInfo ― 获取跟上一次语句句柄操作相关的扩展错误信息 PDOStatement::execute ― 执行一条预处理语句 PDOStatement::fetch ― 从结果集中获取下一行 PDOStatement::fetchAll ― 返回一个包含结果集中所有行的数组 PDOStatement::fetchColumn ― 从结果集中的下一行返回单独的一列. PDOStatement::fetchObject ― 获取下一行并作为一个对象返回. PDOStatement::getAttribute ― 检索一个语句属性 PDOStatement::getColumnMeta ― 返回结果集中一列的元数据 PDOStatement::nextRowset ― 在一个多行集语句句柄中推进到下一个行集 PDOStatement::rowCount ― 返回受上一个 SQL 语句影响的行数 PDOStatement::setAttribute ― 设置一个语句属性 PDOStatement::setFetchMode ― 为语句设置默认的获取模式. PHP教程1、准备语句 PHP教程重复执行一个SQL查询,通过每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高.使用预处理语句,首先需要在数据库服务器中先准备好“一个SQL语句”,但并不需要马上执行.PDO支持使用“占位符”语法,将变量绑定到这个预处理的SQL语句中.对于一个准备好的SQL语句,如果在每次执行时都要改变一些列值,这种情况必须使用“占位符号”而不是具体的列值.在PDO中有两种使用占位符的语法:“命名参数”和“问号参数”,使用哪一种语法要看个人的爱好. PHP教程使用命名参数作为占位符的INSERT插入语句:
代码如下:
$dbh->prepare(“insert into contactinfo(name,address,phone) values(:name,:address,:phone)”); 需要自定义一个字符串作为“命名参数”,每个命名参数需要冒号(:)开始,参数的命名一定要有意义,最好和对应的字段名称相同. 使用问号(?)参数作为占位符的INSERT插入语句:
代码如下:
$dbh->prepare(“insert into contactinfo(name,phone) values(?,?,?)”); 问号参数一定要和字段的位置顺序对应.不管是使用哪一种参数作为占位符构成的查询,或是语句中没有用到占位符,都需要使用PDO对象中的prepare()办法,去准备这个将要用于迭代执行的查询,并返回PDOStatement类对象. PHP教程2、绑定参数 PHP教程当SQL语句通过PDO对象中的prepare()办法在数据库服务器端准备好了以后,如果使用了占位符,就需要在每次执行时替换输入的参数.可以通过PDOStatement对象中的bindParam()办法,把参数变量绑定到准备好的占位符上(位置或名字要对应).办法bindParame()的原型如下所示:
代码如下:
bool PDOStatement::bindParam ( mixed $parameter,mixed &$variable [,int $data_type = PDO::PARAM_STR [,int $length [,mixed $driver_options ]]] ) 第一个参数parameter是必选项,如果在准备好的查询中占位符语法使用名字参数,那么将名字参数字符串作为bindParam()办法的第一个参数提供.如果占位符语法使用问号参数,那么将准备好的查询中列值占位符的索引偏移量,作为该办法的第一个参数. PHP教程第二个参数variable也是可选项,提供供给第一个参数所指定占位符的值.因为该参数是按引用传递的,所以只能提供变量作为参数,不能直接提供数值. PHP教程第三个参数data_type是可选项,为当前被绑定的参数设置数据类型.可以为以下值. PHP教程PDO::PARAM_BOOL 代表boolean数据类型. PHP教程第四个参数length是可选项,用于指定数据类型的长度. PHP教程第五个参数driver_options是可选项,通过该参数提供任何数据库驱动程序特定的选项.
代码如下:
<?php //...省略PDO连接数据库代码 $query = "insert into contactinfo (name,:phone)"; $stmt = $dbh->prepare($query);????????? //调用PDO对象中的prepare()办法 ? $stmt->blinparam(':name',$name);??????? //将变量$name的引用绑定到准备好的查询名字参数":name"中 $stmt->blinparam(':address',$address); $stmt->blinparam(':phone',phone); //... ?> PHP教程使用问号(?)作为占位符的参数绑定示例:
代码如下:
<?php //...省略PDO连接数据库代码 $query = "insert into contactinfo (name,?)"; $stmt = $dbh->prepare($query);????????? //调用PDO对象中的prepare()办法 ? $stmt->blinparam(1,$name,PDO::PARAM_STR);??????? //将变量$name的引用绑定到准备好的查询名字参数":name"中 $stmt->blinparam(2,$address,PDO::PARAM_STR); $stmt->blinparam(3,phone,PDO::PARAM_STR,20); //... ?> PHP教程3、执行准备语句 PHP教程当准备语句完成,并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()办法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面提供的contactinfo表中,使用预处理方式连续执行同一个INSERT语句,通过改变不同的参数添加两条记录.如下所示:
代码如下:
<?php try { ?????$dbh = new PDO('mysql:dbname=testdb;host=localhost',$username,$passwd); }catch (PDOException $e){ ????echo '数据库连接失败:'.$e->getMessage(); ????exit; } ? $query = "insert into contactinfo (name,?)"; $stmt = $dbh->prepare($query); ? $stmt->blinparam(1,$name);????? $stmt->blinparam(2,$address); $stmt->blinparam(3,phone); ? $name = "赵某某"; $address = "海淀区中关村"; $phone = "15801688348"; ? $stmt->execute();?????????? //执行参数被绑定后的准备语句 ?> 如果你只是要传递输入参数,并且有许多这样的参数要传递,那么你会觉得下面所示的快捷方式语法非常有帮助.是通过在execute()办法中提供一个可选参数,该参数是由准备查询中的命名参数占位符组成的数组,这是第二种为预处理查询在执行中替换输入参数的方式.此语法使你能够省去对$stmt->bindParam()的调用.将上面的示例做如下修改:
代码如下:
<?php //...省略PDO连接数据库代码 $query = "insert into contactinfo (name,?)"; $stmt = $dbh->prepare($query); ? //传递一个数组为预处理查询中的命名参数绑定值,并执行一次. $stmt->execute(array("赵某某","海淀区","15801688348")); ?> PHP教程另外,如果执行的是INSERT语句,并且数据表中有自动增长的ID字段,可以使用PDO对象中的lastinsertId()办法获取最后插入数据表中的记录ID.如果需要查看其他DML语句是否执行成功,可以通过PDOStatement类对象中的rowCount()办法获取影响记录的行数. 欢迎参与《PDO预处理语句PDOStatement对象使用总结》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |