如何使用PDO的query、prepare 和 exec 函数检索、插入、更新和删除数据

这篇教程介绍了如何使用PDO的exec、query和prepare方法安全地进行数据库操作。PDO::exec适用于无结果集的更新和删除操作,而PDO::query用于执行SELECT查询并返回结果集。PDO::prepare是用于防止SQL注入的安全方法,适合处理来自不可信源的数据。通过示例代码展示了如何使用这些方法更新、删除、插入记录以及安全地处理Web表单数据。

在本教程中,您将学习如何使用PDO的query、prepare  exec 函数检索、插入、更新和删除数据。下表显示了和的简要比较PDO::exec、PDO::query和PDO::prepare

比较 PDO::exec、PDO::query 和 PDO::prepare
exec()query()prepare()
返回NumberPDOStatementPDOStatement
查询内的数据转义必需的必需的不需要
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()fetchfetchAll等:
//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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值