ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 预处理语句 什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。 预处理语句可的两大好处: * 查询仅需解析一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。 * 提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。 PDOStatement 对象常用的方法: * PDOStatement::bindColumn — 绑定一列到一个 PHP 变量 * PDOStatement::bindParam — 绑定一个参数到指定的变量名(**引用传递**) * PDOStatement::bindValue — 把一个值绑定到一个参数(**只读传递**) * PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。 * PDOStatement::columnCount — 返回结果集中的列数 * PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令 * PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE * PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息 * PDOStatement::execute — 执行一条预处理语句 * PDOStatement::fetch — 从结果集中获取下一行 * PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组 * PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。 * PDOStatement::fetchObject — 获取下一行并作为一个对象返回。 * PDOStatement::getAttribute — 检索一个语句属性 * PDOStatement::getColumnMeta — 返回结果集中一列的元数据 * PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集 * PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数 * PDOStatement::setAttribute — 设置一个语句属性 * PDOStatement::setFetchMode — 为语句设置默认的获取模式。 参考链接: [PDOStatement 对象](http://php.net/manual/zh/class.pdostatement.php) ``` <?php $pdo = new PDO('mysql:host=localhost;dbname=koogua_forum', 'root', '123456'); /* ------------- 插入操作 ------------- */ // 使用命名占位符 $name = 'foo'; $about = 'I am foo'; $stmt = $pdo->prepare("INSERT INTO Tag (name, about) VALUES (:name, :about)"); $stmt->bindParam(':name', $name, PDO::PARAM_STR); $stmt->bindParam(':about', $about, PDO::PARAM_STR); $stmt->execute(); // 使用问号占位符 $name = 'bar'; $about = 'I am bar'; $stmt = $pdo->prepare("INSERT INTO Tag (name, about) VALUES (?, ?)"); $stmt->bindValue(1, $name, PDO::PARAM_STR); $stmt->bindValue(2, $about, PDO::PARAM_STR); $stmt->execute(); /* ------------- 更新操作 ------------- */ $name = 'php5'; $about = 'I am php5'; $id = 1; $stmt = $pdo->prepare("UPDATE Tag SET name = :name, about = :about WHERE id = :id"); $stmt->bindValue(':name', $name, PDO::PARAM_STR); $stmt->bindValue(':about', $about, PDO::PARAM_STR); $stmt->bindValue(':id', $id, PDO::PARAM_INT); $stmt->execute(); /* ------------- 删除操作 ------------- */ $id = 8; $sql = "DELETE FROM Tag WHERE id = :id"; $stms = $pdo->prepare($sql); $stms->bindValue(':id', $id, PDO::PARAM_INT); $stms->execute(); /* ------------- 查询操作 ------------- */ $sql = "SELECT * FROM Tag WHERE id > :id"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':id', 3, PDO::PARAM_INT); $stmt->execute(); while($row = $stmt->fetch(PDO::FETCH_OBJ)) { echo "name:{$row->name}, about:{$row->about}" .PHP_EOL; } $stmt->closeCursor(); echo "--- rows begin with php ---" . PHP_EOL; $sql = "SELECT * FROM Tag WHERE name LIKE :name"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':name', 'php%', PDO::PARAM_STR); $stmt->execute(); while($row = $stmt->fetch(PDO::FETCH_OBJ)) { echo "name:{$row->name}, about:{$row->about}" .PHP_EOL; } ?> ```