PDO随笔

特性:

PDO(PHP DATA OBJECT),数据库访问抽象层,统一了各种数据库的访问接口。

  1. 编码一致性(接口统一)
  2. 灵活性(运行时加载驱动程序)
  3. 高性能(C编写,编译为PHP)
  4. 面向对象特性

配置启用:

在相应的配置文件中取消掉前面的注释。

链接:

创建三个参数$dsn $user $password,创建连接对象。

DSN : Data Source Name

$dsn = "mysql:local=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
try{
  $conn = new PDO($dsn,$user,$password);
}
catch(PDOException $e){
  echo $e->getMessage();
}
PDO对象方法:

创建一条SQL语句,作为连接对象的exec()方法的参数。exec对select不起作用

$sql = <<<EOF
CREATE TABLE IF NOT EXISTS test(
id INT UNSIGNED AUTO_INCREMENT KEY,
name VARCHAR(20) NOT NULL 
)
EOF;
$conn->exec($sql);

错误信息:

有一个特别常用的方法errorInfo(),可以将你的错误信息返回成一个数组,再打印出来就很舒服了。$errorInfo = $conn->errorInfo();  接着打印出来 print_r($errorInfo) ;

查询:

query(sql语句),使用query()方法后,返回的是一个二维关联数组,这个二维关联数组的键是queryString,值是SQL结果的数组$data,$data中KEY就是columnName,VALUE是数据了。

使用foreach($data as $row){  echo $row['字段名字']}就OK了。




值得注意的是exec() 和 query()之间的差别:

1、PDO::query

PDO::query执行一条SQL语句,如果通过,则返回一个PDOStatement对象。PDO::query函数有个“非常好处”,就是可以直接遍历这个返回的记录集。

示例如下:

$sql = 'SELECT name FROM url';
foreach ($dbh->query($sql) as $row) {
    print $row['name'] . "\t";
}

query同传统的MySQL query函数类似,同样需要对开发者自行对输入的sql语句进行安全检查。

query因为会返回PDOStament对象,似乎用在SELECT语句执行上更合适,这跟上文提到的query支持直接遍历不谋而合。

query执行后,在下一次query执行之前,如果不取走所有返回的记录集,则query将会执行失败,除非我们调用 PDOStatement::closeCursor()来释放数据库资源与PDOStatement对象。

原话:If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().

二、PDO::exec

PDO::exec执行一条SQL语句,并返回受影响的行数。此函数不会返回结果集合。官方建议:

  • 对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
  • 对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。

PDO::exec支持SELECT/DELETE/UPDATE/INSERT等全部SQL语句执行,所以相比PDO query()函数功能要强大的多。由于只返回受影响的函数,所以,如果执行SELECT则无法得到PDOStatement对象,故也无法遍历结果集,只能按照官方建议去使用query或execute函数。


引用自http://blog.csdn.net/szjljj/article/details/51816938


预处理语句:

预处理语句有两大好处

1:查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。通过含有变量的SQL语句进行查询,得到一个statement对象,然后我们可以对SQL语句中的变量进行赋值,就可以得到关联数组形式的数据。这种连接查询方式可以减轻服务器的负担。

2:传输参数可以更好的防止SQL注入,提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

执行过程:定义一个SQL语句,使用repare()方法预处理SQL语句,对SQL语句进行参数绑定,使用execute()进行参数发送。用statement对象的fatch()方法提取一行的数据,嵌套上while()循环就可以提取出所有符合条件的行数据了。

while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
  var_dump($row);
  echo "<br>";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值