PHP 中使用 PDO 扩展操作 MySQL

ゝ一世哀愁。 2022-05-23 07:44 315阅读 0赞

简介

PDO 支持面向对象的方式处理各种数据库(如:mysql、oracle、db2等),也就是说,PDO 支持跨数据库类型。

PDO 中也支持预处理和参数绑定。

连接数据库

  1. try{
  2. $pdo = new PDO('mysql:host=localhost;dbname=test','root','root');
  3. // 设置错误处理模式为抛出异常,下面执行SQL语句的时候,如果有错误,就会抛出异常。这种错误处理模式是最常用的一种。
  4. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //PDO::ERRMODE_EXCEPTION也可以用数字2代替
  5. }catch(PDOException $e){
  6. echo '数据库连接失败: '.$e->getMessage();
  7. exit;
  8. }

常用方法

exec() 方法

exec() 用来执行写操作的SQL语句,如insert,delete,update等。执行成功返回受影响的行数,失败返回false。

  1. $sql = 'insert user(name, balance) values("张三","3000"),("李四","3000")';
  2. $affected_rows = $pdo->exec($sql);
  3. var_dump($affected_rows);
  4. echo '<br>';
  5. echo "最后插入的自动增长的ID为:".$pdo->lastInsertId();

query() 方法

query() 用来执行读操作的SQL语句,如select,desc等。执行成功返回结果集,失败返回false。

  1. $stmt = $pdo->query("select * from user");
  2. // 设置提取方式为只提取索引数组
  3. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  4. // 每次取出结果集中的一条记录,也可以在 fetch() 方法中传入参数,来设置提取方式
  5. while($row = $stmt->fetch()){
  6. var_dump($row);
  7. }
  8. // $rows = $stmt->fetchAll(); // 取出结果集中的所有记录

prepare() 方法

prepare() 用来进行预处理,可以对读操作和写操作进行预处理。

执行成功返回PDOStatement object(预处理对象),失败返回false。

下面详细讲述预处理。

预处理

预处理(prepare):指的是在数据库服务器上预先准备一个 SQL 语句,执行成功的话,返回一个 PDOStatement object(预处理对象),失败返回 false。

它同 PDO 类中的 exec() 和 query() 方法相比,有以下优点:

  • 安全性高。预处理可以有效防止 SQL 注入,因为通过预处理,SQL 语句的主体部分,已经提前在服务器上形成了一个预处理对象,之后通过客户端传递过来的参数,只会被当作值来处理。
  • 执行效率高。通过预处理,某条 SQL 语句已经提前在服务器上形成了一个预处理对象,下次碰到和自身语句结构相同的 SQL 语句时,就会直接调用该预处理对象。或者,同一条 SQL 语句需要多次执行时,如果服务器中已经存在对应的预处理对象,就会直接对其调用。

因此,推荐使用预处理。即尽量使用 prepare() 方法。

占位符

占位符的作用是将 SQL 语句中某个具体的值,用占位符替代。

占位符替代的是整个值,不能只替代值的一部分。

占位符有两种形式:? 和 :名称。

问号占位符(?)

参数和问号占位符的匹配按照占位符 ? 的顺序进行匹配。

  1. $stmt = $pdo->prepare('insert user(name,balance) value(?,?)');
  2. $name = "老王";
  3. $balance = 1888;
  4. // 参数绑定
  5. $stmt->bindParam(1, $name);
  6. $stmt->bindParam(2, $balance);
  7. $res = $stmt->execute();
  8. // 如果上面没有绑定参数,就可以这样写。(对应问号占位符)
  9. // $res = $stmt->execute(array($name, $balance));

名称占位符(:名称)

参数和名称占位符的匹配按照名称进行匹配,和顺序无关。

  1. $stmt = $pdo->prepare('insert user(name,balance) value(:a,:b)');
  2. $name = "老王";
  3. $balance = 2888;
  4. // 参数绑定
  5. $stmt->bindParam(":a", $name);
  6. $stmt->bindParam(":b", $balance);
  7. $res = $stmt->execute();
  8. // 如果上面没有绑定参数,而且用的是名称占位符。就应该这样写。
  9. // $res = $stmt->execute(array(':a'=>$name, ':b'=>$balance));

发表评论

表情:
评论列表 (有 0 条评论,315人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php扩展PDO

    【PDO是啥】 PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php\_mysql.d