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