准备语句:
每次发送查询给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);