博客列表 >PHP 10 PDO-数据访问抽象层(及遍历的三种方法)(0716thu)

PHP 10 PDO-数据访问抽象层(及遍历的三种方法)(0716thu)

老黑
老黑原创
2020年07月20日 18:47:43826浏览

主要内容:

  1. 认识PDO及config.php文件配置
  2. 通过sql语句进行基本的操作
  3. sql语句占位符、PDO prepare、PDO bindParam、bindValue、fetchAll返回值

1. 认识PDO及config.php文件配置、连接数据库

  • PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
  • PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
  • PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。
  • config.php文件配置。配置的目的就是为了后面方便连接。
  1. <?php
  2. define('DB_HOST','localhost');//主机名
  3. define('DB_USER', 'root');//连接数据库的用户名
  4. define('DB_PWD','zhoujielun521');//连接数据库密码
  5. define('DB_NAME', 'apple');//数据库名称
  6. define('DB_PORT', '3306');//数据库端口号
  7. define('DB_TYPE', 'mysql');//数据库的型号
  8. define('DB_CHARSET', 'utf8');//数据库的编码方式
  9. define('DB_DSN', DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET);
  10. //定义PDO的DSN,数据源名,包括主机名,端口号和数据库名称。
  11. $dsn='mysql:host=localhost;dbname=apple';
  12. //PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,
  13. //如主机名、端口和数据库名。
  • 连接数据库。连接前需要先设置好数据库,否则也无法连接。
  1. <?php
  2. //使用PDO进行mysql类型的数据库连接
  3. require "config.php";
  4. try {
  5. ////数据库连接,得到一个PDO对象
  6. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  7. // var_dump($pdo);
  8. //捕捉特定于数据库信息的PDOEXCEPTION 异常
  9. } catch(PDOException $e) {
  10. echo $e->getMessage();
  11. //捕捉拥有Throwable接口的错误或者其他异常
  12. } catch (Throwable $e) {
  13. echo $e->getMessage();
  14. }

2. 通过sql语句进行基本的操作

  • 查询
  1. $sql="SELECT * FROM `user` WHERE `id`=18";
  2. //query() — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
  3. $stmt = $pdo->query($sql);
  4. foreach($stmt as $k => $v){
  5. var_dump($v['username']);
  6. }
  • 执行update等
  1. //sql语句
  2. $sql = "UPDATE `user` SET `age`= 36 WHERE `id`=1";
  3. //exec()执行一条 UPDATE,DELETE,INSERT SQL 语句,并返回受影响的行数
  4. $res = $pdo->exec($sql);
  5. if ($res == 0) {
  6. //errorCode() — 获取跟数据库句柄上一次操作相关的 SQLSTATE码
  7. var_dump($pdo->errorcode());
  8. echo "<br>";
  9. //获取上一次句柄上一次操作的错误信息数组
  10. var_dump($pdo->errorInfo());
  11. }

3. sql语句占位符、PDO prepare、PDO bindParam、bindValue、fetchAll返回值

  • bindParam
  1. //使用问号参数占位符的sql预处理语句
  2. $sql = "SELECT * FROM `user` WHERE `username`=? AND `password`=?";
  3. //prepare() — 准备要执行的语句,并返回PDOStatement语句对象
  4. $stmt = $pdo->prepare($sql);
  5. $username="Chloe1";
  6. $password="Chloe1";
  7. //PDOStatement::bindParam — 绑定一个参数到指定的变量名
  8. $stmt->bindParam(1,$username);
  9. $stmt->bindParam(2,$password);
  10. //也可以用下面这种方式
  11. // $stmt->bindParam(":username",$username);
  12. // $stmt->bindParam(":password",$password);
  13. //执行一条预处理语句
  14. $stmt->execute();
  15. //PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
  16. echo $stmt->rowCount();
  • bindValue
  1. $sql = "SELECT * FROM `user` WHERE `username`=? AND `password`=?";
  2. //prepare() — 准备要执行的语句,并返回PDOStatement语句对象
  3. $stmt = $pdo->prepare($sql);
  4. $username="Chloe";
  5. $password="Chloe";
  6. //PDOStatement::bindValue — 把一个值绑定到一个参数
  7. $stmt->bindValue(1,$username);
  8. $stmt->bindValue(2,$password);
  9. $stmt->execute();
  10. echo $stmt->rowCount();
  • bindValue另外一个示例
  1. $sql = "SELECT * FROM `user` WHERE `id`>?";
  2. $stmt = $pdo->prepare($sql);
  3. //PDOStatement::bindValue — 把一个值绑定到一个参数
  4. $stmt->bindValue(1,4);
  5. $stmt->execute();
  6. //PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
  7. // $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  8. // print_r($res);
  9. $res = $stmt->fetch();
  10. print_r($res);
  11. // echo $stmt->rowCount();
  1. $sql = "SELECT * FROM `user` WHERE `age`>?";
  2. $stmt = $pdo->prepare($sql);
  3. $age = 12;
  4. $stmt->bindValue(1,$age);
  5. $age = 18; //后加的应该无效。
  6. $stmt->execute();
  7. //PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
  8. // $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  9. // print_r($res);
  10. // $res = $stmt->fetch();
  11. // print_r($res);
  12. echo $stmt->rowCount();
  • bindParam()与bindValue()的比较;

    1. PDOStatement::bindValue — 把一个值绑定到一个参数,PDOStatement::bindParam — 绑定一个参数到指定的变量名

    2. PDOStatement::bindParam()的第二个参数是按引用传递,所以只能提供变量作为参数,只有PDOStatement::execute()被执行的时候才取其值。
      PDOStatement::bindValue()为占位符参数绑定值,只要绑定成功,就不会再变了。

  1. $sql = "SELECT * FROM `user` WHERE `age`>?";
  2. $stmt = $pdo->prepare($sql);
  3. $age = 12;
  4. $age=25;
  5. // 这种情况下面的18重新赋值应该是管用的。但之前的value就是不行的。
  6. $stmt->bindParam(1,$age);
  7. // $stmt->bindParam(2,$password);
  8. $age = 18;
  9. $stmt->execute();
  10. echo $stmt->rowCount();

4. 作业实战

  • 使用pdo类的对象去连接数据库,然后使用PDO对象中的prepare()方法获取PDOStatement对象
  1. require "myconfig.php";
  2. try {
  3. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  4. } catch(PDOException $e) {
  5. echo $e->getMessage();
  6. } catch (Throwable $e) {
  7. echo $e->getMessage();
  8. }
  9. $sql = "SELECT * FROM `my_list`";
  10. $stmt = $pdo->query($sql);
  11. //$stmt->execute(); 有了上面的,这个就不用执行了。
  12. $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  13. //注意这个地方是fetchAll,如果只是fetch的话,就只返回第一行。
  • 接着使用PDOStatement对象的成员方法将获得的结果集中的数据(二维数组)遍历出来,
    渲染到表格中。
  1. //var_dump,这部分非必要部分
  2. echo '这个是var_dump的结果:<br><br>';
  3. var_dump($res);
  4. echo '<hr><br>';
  5. //table结果
  6. echo '这个是做table的结果:<br><br>';
  7. if (!empty($res)) {
  8. $table =<<<ABC
  9. <table border='1' align = 'left'>
  10. <tr>
  11. <td>id</td>
  12. <td>name</td>
  13. <td>age</td>
  14. <td>phone</td>
  15. </tr>
  16. ABC;
  17. foreach ($res as $k => $v) {
  18. $table .= "<tr>";
  19. $table .= "<td>{$v['id']}</td>";
  20. $table .= "<td>{$v['name']}</td>";
  21. $table .= "<td>{$v['age']}</td>";
  22. $table .= "<td>{$v['phone']}</td>";
  23. $table .= "</tr>";
  24. }
  25. $table .="</table>";
  26. echo $table;
  27. }

结果如图:

" class="reference-link">

5. 数据库中的二维数据遍历方法汇总(foreach)

  • 总结了下共三大类,六小类。当然并非所有都是最小单元的遍历。
  • 关于读出来的二维数组的结果展示分为三种方式,每一个里面又有一些小分支:
  • ① 整体全部打印(array)。
  • ② 整体二级打印(array)。
  • ③ 分项二级打印(key->value)。
  1. <?php
  2. require "myconfig.php";
  3. try {
  4. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  5. } catch(PDOException $e) {
  6. echo $e->getMessage();
  7. } catch (Throwable $e) {
  8. echo $e->getMessage();
  9. }
  10. $sql = "SELECT * FROM `my_list`";
  11. $stmt = $pdo->query($sql);
  12. $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  13. /*关于读出来的二维数组的结果展示分为三种方式,每一个里面又有一些小分支:
  14. ① 整体全部打印(array)。
  15. ② 整体二级打印(array)。
  16. ③ 分项二级打印(key->value)。
  17. */
  • ① 整体全部打印(array)。
  1. //var_dump
  2. echo '① 整体全部打印(array)。<br><br>';
  3. echo '这个是var_dump的结果:<br><br>';
  4. var_dump($res);
  5. echo '<hr><br>';

结果如图:

② 整体二级打印(array)。

  1. echo '② 整体二级打印(array)。<br><br>';
  2. echo '&nbsp&nbsp&nbsp&nbsp ②-a:这个是foreach1的结果:<br><br>';
  3. foreach ($res as $user) {
  4. print_r($user);
  5. echo '<br>';
  6. }
  7. echo '<hr><br>';

结果如图:

  1. //foreach2:二级内没有展开
  2. echo '&nbsp&nbsp&nbsp&nbsp ②-b:这个是foreach2的结果:<br><br>';
  3. foreach ($res as $key => $value) {
  4. printf('<pre>%s</pre>',print_r($value,true));
  5. //notice:print_r中如果写$res,则会显示四遍。
  6. }
  7. echo '<hr><br>';

结果如图:

③ 分项二级打印(key->value)。

  1. echo '③ 分项二级打印(key->value)。<br><br>';
  2. echo '&nbsp&nbsp&nbsp&nbsp ③-a:这个是foreach3的结果:<br><br>';
  3. foreach ($res as $user) {
  4. foreach ($user as $key => $value) {
  5. echo "['{$key}'] => $value <br>";
  6. }
  7. echo '<br>';
  8. }
  9. echo '<hr><br>';

结果如图:

  1. echo '&nbsp&nbsp&nbsp&nbsp ③-b:这个是foreach4的结果:<br><br>';
  2. foreach ($res as $key => $value) {
  3. foreach ($value as $k => $v) {
  4. printf('<pre>%s</pre>',print_r($v,true));
  5. //从大的res到value,再从value推进到v。当然主要是在value这条线。key这条线上没有对应的值。
  6. }
  7. }
  8. echo '<hr><br>';

结果如图:

  1. echo '&nbsp&nbsp&nbsp&nbsp ③-c:这个是foreach5的结果:<br><br>';
  2. foreach ($res as $user) {
  3. printf('%s, %s, %s, %s<br>', $user['id'], $user['name'], $user['age'], $user['phone']);
  4. }
  5. echo '<hr><br>';

结果如图:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议