pdo_pgsql 接口

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。

PDO的运行机制,见下图

image-20220505155939757

使用PDO的好处

  • 一套代码可以操作任何数据库,换数据库的话,不用重写代码。

  • 执行效率高,尤其是使用预处理。

  • 安全性高,特别是PDO中的预处理能够有效阻止SQL注入。

  • PDO可以访问12种不同的数据库。

  • PDO 是完全面向对象的。

常用函数

  • PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作。
  • PDO::prepare 准备要执行的SQL语句并返回一个 PDOStatement 对象。
  • PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作。
  • PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID。
  • PDOStatement::fetch() 是用来获取一条记录。
  • PDOStatement::fetchAll() 是获取所有记录集。

示例代码

php_pdo_pgsql_conn.py

<?php
header("content-type:text/html;charset=utf-8");
/
//连接属性
$dbms='pgsql'; //数据库类型
$host='192.168.2.5'; //数据库主机名
$dbName='test'; //使用的数据库
$user='test'; //数据库连接用户名
$pass='test'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";

try {
//初始化一个PDO对象
$pdo = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "成功连接到数据库服务器!<br>";

} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br>");
}

// 预编译插入语句
$sql = 'INSERT INTO student(name, age, birthday) VALUES(:name, :age, :birthday)';
$stmt = $pdo->prepare($sql);
// 绑定参数值
$name = 'tony';
$age=19;
$birthday = '2020-06-01 20:11:11';
$stmt->bindValue(':name', $name);
$stmt->bindValue(':age', $age);
$stmt->bindValue(':birthday', $birthday);
// 执行插入操作
$stmt->execute();

// 返回id
$id = $pdo->lastInsertId('student_id_seq');
echo '插入数据成功,用户id:' . $id . '<br>';
// 绑定参数值
$name = 'david';
$age=23;
$stmt->bindValue(':name', $name);
$stmt->bindValue(':age', $age);
$stmt->bindValue(':birthday', date("Y-m-d H:i:s"));
// 执行插入操作
$stmt->execute();
// 返回id
$id = $pdo->lastInsertId('student_id_seq');
echo '插入数据成功,用户id:' . $id . '<br>';

// 执行查询语句
$stmt = $pdo->query('SELECT * FROM student');
$students = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$students[] = [
'id' => $row['id'],
'name' => $row['name'],
'age' => $row['age'],
'birthday' => $row['birthday']
];
}
?>
<!DOCTYPE html>
<html>
<head>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}

td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}

tr:nth-child(even) {
background-color: #00bb00;
}
</style>
<title>php_conn</title>
</head>
<body>
<h2>学生列表</h2>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
<th>Birthday</th>
</tr>
</thead>
<tbody>
<?php foreach ($students as $student) : ?>
<tr>
<td><?php echo htmlspecialchars($student['id']) ?></td>
<td><?php echo htmlspecialchars($student['name']); ?></td>
<td><?php echo htmlspecialchars($student['age']); ?></td>
<td><?php echo htmlspecialchars($student['birthday']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>

执行结果:image-20220505181330221