计算机网络/计算机科学与应用/系统/运维/开发

PHP PDO操作数据库(2)

准备语句:


每次发送查询给mysql服务器时,都必须解析该查询的语法,保证结构正常执行,该过程会带来一定开销。

pdo为了支持此特性的数据库提供了准备语句功能,准备语句的2个实现方法:

prepare() 负责准备要执行的查询

execute() 使用一组给定的列参数反复的执行查询 这些参数可以显示地作为数组传递给execute() 方法,也可以通过使用bindParam()方法指定的绑定参数提供给execute() 方法


使用准备语句


prepare()方法负责准备要执行的查询

PDOStatement  PDO::prepare(string query [,array driver_options])

准备语句的查询必须使用占位符而不是具体的列值。

查询支持2种语法:  命名参数(named parameter) 和问号参数(question mark  parameter)

例如:命名参数 (推荐)

INSERT  INTO  products  SET id =:id ,name =:name;

问号参数:


INSERT INTO  products SET id =?,name= ?;
$dbh = new PDO('msyql:host=localhost;dbname=test','root','root'); 
$query = "INSERT INTO products SET id=:id,name=:name"; $stmt=$dbh->prepare($query);

    

除了查询,还可以通过driver_options参数传递数据库驱动程序特定的选项


  2. 执行查询  

    execute() 负责执行准备好的查询

    boolean  PDOStatement::execute([array  input_parameters])


该方法需要在每次迭代执行中替换的输入参数,可以作为数组传递给方法 或者通过bindParam()把值绑定到查询中相应的变量名或位置偏移

通过数组方式传递:

 $dbh = new PDO('mysql:host=localhost;dbname=test','root','root');

   创建和查询准备

   $query ="INSERT INTO  products  SET  id=:id ,name=:name';
   $stmt = $dbh->prepare($query);

   执行查询

   $stmt->execute( array(':id'=>null,':name'=>'zhangsan') );


   参数绑定形式: bindParam()

    bindParam()  赋列值


 try {
     $dbh = new PDO('mysql:host=localhost;dbname=test','root','root');
     
     //创建和准备查询
     $query = "INSERT INTO web_test SET id=:id , username= :username";  
     $stmt =$dbh->prepare($query);  
     $id=null;  
     $username='MM';  
     
     //绑定参数 
     $stmt->bindParam(':id',$id);  
     $stmt->bindParam(':username',$username);  
     
     //执行查询  
     $stmt ->execute();  
     $id=null;  
     $username='DD';  
     
     //绑定参数  
     $stmt->bindParam(':id',$id);  
     $stmt->bindParam(':username',$username);  
     
     //执行查询  
     $stmt ->execute();  
  } catch (PDOException $exception) { 
      printf("Connection error %s",$exception->getMessage());  
  }


使用问号参数

try { 
    $dbh =new PDO('mysql:host=localhost;dbname=test','root','root'); 
    
    //创建和准备语句 
    $query ="INSERT INTO web_test SET id=?,username=?"; 
    $stmt=$dbh->prepare($query); 
    $id=null; $username='DDC'; 
    
    //绑定参数 
    $stmt->bindParam(1,$id); 
    $stmt->bindParam(2,$username); 
    
    //执行查询 
    $stmt ->execute(); 
    $id=null; 
    $username='DDQ'; 
    
    //绑定参数 
    $stmt->bindParam(1,$id); 
    $stmt->bindParam(2,$username); 
    
    //执行查询 
    $stmt ->execute();
    
 } catch (Exception $e) { 
     printf("Connection error %s",$exception->getMessage()); 
 }

获取数据

返回获取的列数

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test','root','root'); 
} catch (PDOException $e) { 
    printf("error %f",$e->getMessage()); 
} 
$sql ="SELECT * FROM web_test"; 
$rows=$dbh->prepare($sql); 
// foreach ($rows as $row) { 
    //  print $row['id']."\r"; 
    //  print $row['username']."\r"; // 
    } 
$rows->execute();
//
2 printf("总列数 %d",$rows->columnCount());

2.获取结果集中的下一行


fetch() 方法返回结果集的下一行  当到达结果集末尾时返回false


语法如下:


mixed PDOStatement::fetch([int fetch_style [,int cursor_orientation [, int cursor_offset]]])


fetch_style 有8种设置方式:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test','root','root'); 
} catch (Exception $e) { } 

//执行查询 
$stmt = $dbh ->query("SELECT * FROM web_test"); 

while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) { 
    $id=$row['id']; $username=$row['username']; 
    printf("welcome %s %s <br/>",$id,$username); 
}

3. 同时返回所有的结果集行


fetchAll()一次调用就可以获取结果集中的所有行,并赋给返回数组


array PDOStatement::fetchAll([int fetch_style])


以什么方式获取列,取决于fetch_style的设置  默认值 PDO_FETCH_BOTH


//fetchAll()同时返回所有的结果集行

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test','root','root'); 
} catch (Exception $e) { } 

//执行查询 
$stmt=$dbh->query("SELECT * FROM web_test"); 

//检索所有行 
$rows=$stmt->fetchAll(); 

//输出行 
foreach ($rows as $row) { 
    $id=$row[0]; $username=$row[1]; 
    printf("Product: %s %s <br/>",$id,$username); 
}



是否用fetchAll()代替fetch()  fetchAll()处理特别大的结果集时会给系统带来很大的负担,无论是数据库服务器资源还是网络带宽都有压力。

4、获取单独一列

fetchColumn() 返回结果集中下一行某个列值

string PDOStatement::fetchColumn([int column_number])

//fetchColumn()获取单独一列

try { 
    $dbh =new PDO('mysql:host=localhost;dbname=test','root','root'); 
} catch (Exception $e) { } 
$result = $dbh->query("SELECT * FROM web_test"); 
//获取第一列 $id=$result->fetchColumn(0); 
//获取第二列 $username=$result->fetchColumn(1); 
echo "welcome $id-$username <br/>"; 

设置绑定列: 
try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test','root','root'); 
} catch (Exception $e) { } 

$query ='SELECT id,username FROM web_test'; 
$stmt = $dbh ->prepare($query); 
$stmt->execute(); 
//根据列偏移进行绑定 
$stmt ->bindColumn(1,$id); 
$stmt->bindColumn('username',$username); 
//获取行 $row=$stmt->fetch(PDO::FETCH_BOUND); 
//输出数据 printf("Product: %s %s",$id,$username);


pdo

所有的努力,不是为了让别人觉得你了不起,而是为了能让自己打心眼里看得起自己。

评论

^