PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结

介绍
今天意识php5.1.*和php5.2.*在数据库预编写翻译代码试行的时候现身行反革命差。
预编写翻译优点
1.选取占位符,防止逐字输入数据到SQL中。自动管理引号和反斜线等字符的转义——增添安全性。
2.预先“筹划”一条语句,然后在每一次推行时绑定不一样值达到重用的指标。——常用于现在被频仍实施的口舌。
3.可读性强。

PDO常用艺术:

代码
数据库连接代码都同样.
复制代码 代码如下:
$protol = ‘mysql:host=localhost;dbname=test’;
$username = ‘monty’;
$passwd = ‘0818’;
$dbh = new PDO($protol, $username, $passwd);

PDO::query(State of Qatar主要用以有记录结果回到的操作(PDOStatement),非常是select操作。

以下是局地测验。注意里面包车型客车SQL和for恐怕foreach语句!
测量试验1(用key值实行绑定State of Qatar
复制代码 代码如下:
$stmt = $dbh->prepare(‘select * from t1 where name=:name’);
$params = array();
$params[‘name’] = ‘rentao’;
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

PDO::exec(State of Qatar主假设针对未有结果集结重回的操作。如insert,update等操作。重返影响行数。
PDO::lastInsertId(卡塔尔国再次回到上次陈设操作最终一条ID,但要注意:假如用insert
into tb(col1,col2卡塔尔国values(v1,v2卡塔尔(قطر‎,(v11,v22State of Qatar..的办法贰遍插入多条记下,lastinsertid(卡塔尔国再次来到的只是率先条(v1,v2卡塔尔插入时的ID,并不是最终一条记下插入的记录ID。
PDOStatement::fetch(State of Qatar是用来赢得一条记下。同盟while来遍历。
PDOStatement::fetchAll(卡塔尔是获得具备记录集到一个中。
PDOStatement::fetchcolumn([int
column_indexnum]卡塔尔(قطر‎用于间接待上访谈列,参数column_indexnum是该列在行中的从0开始索引值,不过,这几个措施叁次只可以拿到同后生可畏行的一列,只要进行三次,就跳到下大器晚成行。由此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount(卡塔尔适用于当用query(“select
…”State of Qatar方法时,获取记录的条数。也足以用于预管理中。$stmt->rowcount(卡塔尔(قطر‎;
PDOStatement::columncount(State of Qatar适用于当用query(“select
…”卡塔尔方法时,获取记录的列数。

结论:

注解:
1、选fetch还是fetchall?
小记录集时,用fetchall效能高,收缩从数据库检索次数,但对此大结果集,用fetchall则给系统带给超级大肩负。数据库要向WEB前端传输量太大反而功效低。
2、fetch(卡塔尔国或fetchall(卡塔尔有多少个参数:
mixed pdostatement::fetch([int fetch_style [,int cursor_orientation
[,int cursor_offset]]])
array pdostatement::fetchAll(int fetch_style)

PHP 5.1.*

fetch_style参数:
■$row=$rs->fetchAll(PDO::FETCH_BOTH);
FETCH_BOTH是暗许的,可省,再次来到关联和目录。
■$row=$rs->fetchAll(PDO::FETCH_ASSOC);
FETCH_ASSOC参数决定再次来到的只有关联数组。
■$row=$rs->fetchAll(PDO::FETCH_NUMState of Qatar; 重回索引数组
■$row=$rs->fetchAll(PDO::FETCH_OBJ卡塔尔(قطر‎;
倘若fetch(卡塔尔(قطر‎则赶回对象,假若是fetchall(卡塔尔国,再次来到由对象组成的二维数组

PHP 5.2.*

复制代码 代码如下:
$dbh = new PDO(‘mysql:host=localhost;dbname=access_control’, ‘root’,
”); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$dbh->exec(‘set names utf8’);
/*添加*/
//$sql = “INSERT INTO `user` SET `login`=:login AND
`password`=:password”;
$sql = “INSERT INTO `user` (`login` ,`password`)VALUES (:login,
:password)”;  $stmt = $dbh->prepare($sql); 
$stmt->execute(array(‘:login’=>’kevin2′,’:password’=>”)); 
echo $dbh->lastinsertid(); 
/*修改*/
$sql = “UPDATE `user` SET `password`=:password WHERE
`user_id`=:userId”; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(‘:userId’=>’7’,
‘:password’=>’4607e782c4d86fd5364d7e4508bb10d9’)); 
echo $stmt->rowCount();
/*删除*/
$sql = “DELETE FROM `user` WHERE `login` LIKE ‘kevin_'”;
//kevin% 
$stmt = $dbh->prepare($sql); 
$stmt->execute(); 
echo $stmt->rowCount(); 
/*查询*/
$login = ‘kevin%’; 
$sql = “SELECT * FROM `user` WHERE `login` LIKE :login”; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array(‘:login’=>$login)); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){    
 print_r($row); 

print_r( $stmt->fetchAll(PDO::FETCH_ASSOC));
?>

实行例行

1 建构连接

实践符合规律

复制代码 代码如下:
   $dbh=newPDO(‘mysql:host=localhost;port=3306;
dbname=test’,$user,$pass,array(
 PDO::ATTR_PERSISTENT=>true
 ));
 ?>

$params[‘name’] = ‘rentao’
和$params[‘:name’]=’rentao’那七个都能试行,表达不受“:”限定。

持久性链接PDO::ATTRAV4_PERSISTENT=>true

测量检验2(数字下标去绑定,不过绑定的最早参数是1卡塔尔(قطر‎——”:key”在php5.2.*上不能够用数字下标绑定

  1. 捕捉错误

复制代码 代码如下:
$stmt = $dbh->prepare(‘select * from t1 where name=:name limit
2’);
$params = array();
$params[] = ‘rentao’;// 这里加不加”:”都能成功实行

复制代码 代码如下:
   try{
 $dbh=newPDO(‘mysql:host=localhost;dbname=test’,$user,$pass);
 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 $dbh->exec(“SET CHARACTER SET utf8”);
 $dbh=null; //断开连接
 }catch(PDOException$e){
 print”Error!:”.$e->getMessage().”
“;
 die();
 }
 ?>

for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
echo “HERE1n”;
$stmt->execute();
echo “HERE2n”;

  1. 事务的

$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

复制代码 代码如下:
try{
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction(卡塔尔国;//开启事务
$dbh->exec(“insertintostaff(id,first,last)values(23,’Joe’,’Bloggs’)”);
$dbh->exec(“insertintosalarychange(id,amount,changedate)
values(23,50000,NOW())”);
$dbh->commit(State of Qatar;//提交业务
}catch(Exception$e){
$dbh->rollBack(卡塔尔(قطر‎;//错误回滚
echo”Failed:”.$e->getMessage();
}
?>

结论:

  1. 错误管理

php 5.1.*

a. 静默格局(暗中同意格局卡塔尔(قطر‎

PHP 5.2.*

复制代码 代码如下:
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT卡塔尔(قطر‎;
//不展现错误
$dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_WA奇骏NING卡塔尔国;//呈现警示错误,并继续施行
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTIONState of Qatar;//暴发致命错误,PDOException

进行例行

复制代码 代码如下:
   try{   
  $dbh = new PDO($dsn, $user, $password);   
  $sql = ‘Select * from city where CountryCode =:country’;   
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);   
  $stmt = $dbh->prepare($sql);   
  $stmt->bindParam(‘:country’, $country, PDO::PARAM_STR);   
  $stmt->execute();   
  while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {     
   print $row[‘Name’] . “/t”;   
  } 
 }   // if there is a problem we can handle it here 
 catch (PDOException $e)  {   
  echo ‘PDO Exception Caught.  ‘;   
  echo ‘Error with the database:
‘;   
  echo ‘SQL Query: ‘, $sql;  
  echo ‘Error: ‘ . $e->getMessage(); 
 }
 ?>

并发谬误:“PHP Warning:  PDOStatement::execute(卡塔尔: SQLSTATE[HY093]:
Invalid parameter number: parameter was not defined”

  1. 使用 query()

设若把”:name”改成”?”,那么多个版本都足以顺遂进行。

复制代码 代码如下:
$dbh->query($sql卡塔尔; 当$sql 中变量能够用$dbh->quote($params卡塔尔;
//转义字符串的多少
$sql = ‘Select * from city where CountryCode
=’.$dbh->quote($country); 
foreach ($dbh->query($sql) as $row)   {   
 print $row[‘Name’] . “/t”;   
 print $row[‘CountryCode’] . “/t”;   
 print $row[‘Population’] . “/n”;
}
?>

不能并且利用三种标记。如 select * from t2 where name=? limit :page

  1. 使用 prepare, bindParam和 execute
    [提出用,同时能够用丰盛、校正、删除]

测试3(limit绑定:page)
复制代码 代码如下:$stmt =
$dbh->prepare(‘select * from t2 where name=:name limit :page’);
$params = array();
$params[‘name’] = ‘rentao’;// 这里加不加”:”都能得逞履行
$params[‘page’] = 2;
foreach($params as $k=>$v){
$stmt->bindParam($k, $v);
}
$stmt->execute();
echo “HERE1n”;
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
echo “HERE2n”;
$stmt = null;
$dbh = null;

复制代码 代码如下:
$dbh->prepare($sql卡塔尔; 暴发了个PDOStatement对象

结论:

PDOStatement->bindParam()

PHP 5.1.* PHP 5.2.*
执行到$stmt->execute()时,进程一直处于等待状态中 执行正常:打印不出结果

PDOStatement->execute(卡塔尔国;//能够在此边放绑定的应和变量
?>

测量检验4(在limit下进行预编写翻译操作:page卡塔尔——使用“?”机制运维
复制代码 代码如下:
$stmt = $dbh->prepare(‘select * from t2 where name=? limit ?’);
$params = array();
$params[] = ‘rentao’;
$params[] = 2;
for($i=0,$iLen = count($params); $i < $iLen; $i++){
$k = $i+1;
$stmt->bindParam($k, $params[$i]);
}
$stmt->execute();
$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
$stmt = null;
$dbh = null;

  1. 事物
PHP 5.1.* PHP 5.2.*
执行正常 执行正常:打印不出结果

复制代码 代码如下:
 try { 
  $dbh = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ”); 
  $dbh->query(‘set names utf8;’); 
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  $dbh->beginTransaction(); 
  $dbh->exec(“Insert INTO `test`.`table` (`name`
,`age`)VALUES (‘mick’, 22);”); 
  $dbh->exec(“Insert INTO `test`.`table` (`name`
,`age`)VALUES (‘lily’, 29);”);
  $dbh->exec(“Insert INTO `test`.`table` (`name`
,`age`)VALUES (‘susan’, 21);”); 
  $dbh->commit();
 } catch (Exception $e) { 
  $dbh->rollBack(); 
  echo “Failed: ” . $e->getMessage(); 
 } 
?>

测试5—order by)

以上就是关于PHP中pdo的相关用法的全体内容了,希望本文能对大家全体助于,也希望大家能够赏识。

PHP 5.1.* PHP 5.2.*
打印出结果,但未按order by进行排序 执行正常:打印不出结果

总结
PHP在应用PDO做数据库预编写翻译操作的时候,尽量幸免使用limit, order by, group
by
做预编写翻译管理。绑定变量大家尽量使用统意气风发标准,要不然都选择“?”,要不然使用“:key”。

可行的一声令下,作者在php5.1.*展开测验,测验完了,笔者透过scp把文件传输到php5.2.*服务器上
复制代码 代码如下:scp -P9888 index.php
rentao@192.168.10.4:/home/rentao

发表评论

电子邮件地址不会被公开。 必填项已用*标注