PDO操作数据库

时间:2022-12-11 11:09:35


1、新建PDO对象链接数据库,执行exec(),lastInsertId()方法

<?php
try{
$dsn="mysql:host=localhost;dbname=phpdemo";
$username="root";
$pswd="1234";
//连接数据库,新建PDO对象
$pdo=new PDO($dsn,$username,$pswd);
//使用exec方法执行数据库操作并返回受影响的行数,若无,返回0,执行错误返回boolean false
//exec方法不能执行select语句
$sql=<<< EOF
insert staff(name,sex,job) values('洪七公','男','丐帮帮主'),
('杨过','男','独臂大侠'),('小龙女','女','古墓派弟子')
EOF;

$res=$pdo->exec($sql);
echo "受影响行数:".$res;
//$pdo->lastInsertId()方法返回最后插入的ID号
echo "最后插入id为".$pdo->lastInsertId();
}catch (PDOException $e){
echo $e->getMessage();
}


结果如下:

PDO操作数据库

2、显示错误信息:errorCode(),errorInfo()

    $sql="insert staff(name,sex,jobs) values('洪七公','男','丐帮帮主')";
$res=$pdo->exec($sql);
if(false==$res){
echo "错误编号:".$pdo->errorCode();
echo "<pre>";
print_r($pdo->errorInfo());
echo "</pre>";
}

在上面我把job错写为jobs,运行结果如下:

PDO操作数据库


3、通过query()方法查询操作

    $sql="select * from staff";
$stmt=$pdo->query($sql);
var_dump($stmt);
//执行query()方法返回一个statement对象,失败返回false,可以通过数组遍历该对象
foreach ($stmt as $row){
echo "<pre>";
print_r($row);
echo "</pre>";
//通过关键字访问数组
echo "姓名:".$row["name"];
}


结果如下:

PDO操作数据库

或者将结果储存在一个数组中,以后访问

    foreach ($stmt as $row){
$res[]=$row;
}
echo "姓名:".$res[1]["name"];

4、通过statement对象执行查询

    $sql="select * from staff";
//PDO的prepare方法准备sql语句,返回statement对象
$stmt=$pdo->prepare($sql);
//statement对象执行
$stmt->execute();
//stmt的fetch方法从结果集中取出一条记录
$row=$stmt->fetch();
print_r($row);

PDO操作数据库

其中将fetch()改为fetchall()方法可以获取所有记录。两种方法都可以对返回数组是关联、数字或者两者进行设置:$res=$stmt->fetchAll(PDO::FETCH_ASSOC),数字为PDO::FETCH_NUM,默认为两者都返回。

还可以通过PDO::FETCH_BOUND将返回列绑定到变量:

    $sql="select username,sex,job from login";
$stmt=$pdo->prepare($sql);
$stmt->execute();
//将返回的列与变量绑定,列序号为返回列的顺序
$stmt->bindColumn(1,$username);
$stmt->bindColumn(2,$sex);
$stmt->bindColumn(3,$job);
//设置fetch的参数PDO::BOUND
while($stmt->fetch(PDO::FETCH_BOUND)){
echo "姓名:$username,性别:$sex,职位:$job<br>";
}

fetchColumn()方法返回一行中的指定列,由于返回后指针向下移动,无法再继续返回同一行中的其他列数据。

statement的debugDumpParams()方法打印执行的sql语句:

$sql="insert login(username,password,mail) values(?,?,?)";
$stmt=$pdo->prepare($sql);
$username='测试';
$password="ceshi";
$stmt->bindParam(1,$username);
$stmt->bindParam(2,$password);
$stmt->bindValue(3,'default@qq.com');
$stmt->debugDumpParams();

结果如下:

PDO操作数据库

statement的nextRowset()方法可以在返回多个结果集时,切换下一个结果集:

    $sql="select username,sex,job from login;//分号分割多个sql语句
select * FROM staff;";
$res=$pdo->query($sql);
//将返回的列与变量绑定,列序号为返回列的顺序
$row=$res->fetchAll();
print_r($row);
echo "<hr>";
//切换下一个结果集
$res->nextRowset();
$row=$res->fetchAll();
print_r($row);