在本教程中,您将学习如何使用PDO的query、prepare 和 exec 函数检索、插入、更新和删除数据。下表显示了和的简要比较PDO::exec、PDO::query和PDO::prepare
exec() | query() | prepare() | |
|---|---|---|---|
| 返回 | Number | PDOStatement | PDOStatement |
| 查询内的数据转义 | 必需的 | 必需的 | 不需要 |
| SQL注入安全 | 不 | 不 | 是的 |
| 使用 SELECT 语句获取数据 | 不 | 是的 | 是的 |
| 表现 | 普通的 | 普通的 | 更好的 |
| 安全的 | 不 | 不 | 是的 |
| 安全地使用 Web 表单数据 | 不 | 不 | 是的 |
在继续之前,我们首先连接到数据库:
<?php
$user = 'Brain';
$pass = 'Bell';
$dsn = 'mysql:host=localhost;dbname=brainbell;charset=utf8';
$dbh = null;
try {
$dbh = new PDO ($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection Failed: '.$e->getMessage();
exit;
}
发送 SQL 查询
我们可以使用$dbh->exec,$dbh->query和$dbh->prepare方法发送 SQL 查询:
PDO::exec执行一条 SQL 语句并返回受影响的行数。您可以使用此方法执行您不期望结果集的任何 SQL 查询,因此此方法不得用于SELECT来自 db 的行:
//Updating records
$sql = 'UPDATE lessons SET pdate="2019-10-01"
WHERE pdate="2010-10-10"';
$affectedRows = $dbh->exec($sql);
echo $affectedRows;
PDO::exec– 删除记录:
//Deleting records
$sql = 'DELETE FROM lessons
WHERE pdate="2010-10-10"';
$affectedRows = $dbh -> exec($sql);
PDO::exec– 插入记录:
$sql = 'INSERT INTO lessons (name, pdate)
VALUES ("PHP", "2019-10-01"),
("MySQL", "2019-10-02")';
$dbh -> exec($sql);
PDO::query执行 SQL 语句,将结果集作为PDOStatement对象返回。如果查询数据来自不受信任的来源,则必须正确转义查询数据以避免 SQL 注入。要检查受影响的行,我们需要使用以下PDOStatement::rowCount()方法:
//Updating records
$sql = 'UPDATE lessons SET pdate="2019-10-01"
WHERE pdate="2010-10-10"';
$sth = $dbh -> query($sql);
echo $sth -> rowCount();
您还可以使用SELECT语句从数据库中获取行(这是不可能的PDO::exec方法):
$sql = 'SELECT * FROM lessons WHERE id=5 LIMIT 1';
$sth = $dbh -> query($sql);
$row = $sth -> fetch(); //Fetch a single row/record
PDO::prepare准备执行语句并返回一个PDOStatement对象。如果数据来自不受信任的来源(例如来自 Web 表单),则必须使用准备好的语句来防止 SQL 注入攻击。绑定表单参数并执行查询后,您可以运行PDOStatement方法,例如rowCount(),fetch或fetchAll等:
//Form data
$oldDate = $_POST['edate'];
$newDate = $_POST['ndate'];
$sql = 'UPDATE lessons SET pdate = ?
WHERE pdate = ?';
$sth = $dbh -> prepare($sql);
$sth -> bindParam(1, $oldDate);
$sth -> bindParam(2, $newDate);
$sth -> execute();
echo $sth->rowCount();
使用从数据库中选择记录PDO::prepare:
//Form data
$startDate = $_POST['sdate'] ?? null;
$endDate = $_POST['edate'] ?? null;
$sql = 'SELECT * FROM lessons
WHERE pdate > ? WHERE pdate < ?';
$sth = $dbh -> prepare($sql);
$sth -> bindParam(1, $startDate);
$sth -> bindParam(2, $endDate);
$sth -> execute();
$rows = $sth -> fetchAll();
用于prepare()插入记录:
//Form data
$date = $_POST['date'] ?? null;
$name = $_POST['name'] ?? null;
if (!($date && $name)){
//error message
exit;
} else {
//validation
}
$sql = 'INSERT INTO lessons (name, pdate) VALUES (?,?)';
$sth = $dbh -> prepare($sql);
$sth -> bindParam(1, $name);
$sth -> bindParam(2, $date);
$done = $sth -> execute();
if (!$done) {
//record not saved to db
echo $sth->errorCode();
}
这篇教程介绍了如何使用PDO的exec、query和prepare方法安全地进行数据库操作。PDO::exec适用于无结果集的更新和删除操作,而PDO::query用于执行SELECT查询并返回结果集。PDO::prepare是用于防止SQL注入的安全方法,适合处理来自不可信源的数据。通过示例代码展示了如何使用这些方法更新、删除、插入记录以及安全地处理Web表单数据。
6103

被折叠的 条评论
为什么被折叠?



