今天主要学习了数据库基本知识、PDO对象、预处理对象与数据绑定。
一、数据库基本知识
动态网站最大的特征就是从数据库动态获取数据,随着数据库的发展,我们现在用MYSQL这种关系型数据库,所谓“关系”,简单来说就是一张表,近似的就是一个二维数据。
数据库的结构。数据库由多张表格组成,单个数据表有多行记录组成,就绪表格的行,每条记录由多个字段组成,就像表格的列。
最常用的数据库操作是“curd”操作,即增删改查。
常用的sql命令
二、PDO对象
PDO对象就是PHP数据对象,他可以支持操作所有的数据库,这样就省去了写多种语言对应的sql语句的烦恼。
PDO连接数据库就是一个创建PDO对象的过程,他需要几个参数:
数据源,数据库的用户名、密码。连接数据代码如下:
实例
<?php // pdo操作 // 创建pdo连接 先设置连接参数 // 数据源 $dsn = 'mysql:host=127.0.0.1;dbname=php'; // 用户名 $user = 'root'; // 密码 $password = 'root'; // 创建pdo对象 连接数据库 // try catch 可以捕获到连接过程中的错误 try { $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { exit('Conection Faild:' . $e->getMessage()); } // 测试 var_dump($pdo); //返回pdo对象 echo '<br>'; // 查询测试 $sql = 'SELECT `name`, `position` FROM `staff`'; foreach ($pdo->query($sql) as $row) { echo $row['name'] . '=>' . $row['position'] . '<br>'; } // 关闭连接 $pdo = null; var_dump($pdo);
运行实例 »
点击 "运行实例" 按钮查看在线实例
三、预处理对象
预处理的过程实际上就是对sql语句模板进行编译检查,缓存,提升运行效率,可以用占位符先建立sql模板,然后通过参数绑定进行数据处理。代码如下:
实例
<?php // 预处理对象 // 建立连接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php', 'root', 'root'); // 设置查询sql语句 $sql = 'SELECT * FROM `staff` WHERE `age` > 40 AND `sex` = 1'; // 获取准备对象 $stmt = $pdo->prepare($sql); // 查看预处理对象 var_dump($stmt); echo '<hr>'; // 查看生成sql的语句模板字符串 echo $stmt->queryString; // 关闭连接 $pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
四、参数绑定
bindvalue 是通过变量的赋值操作 bindp'aram变量引用 可以动态的进行参数绑定
代码如下:
实例
<?php // 数据绑定的原理与应用场景 // 建立连接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php', 'root', 'root'); // sql语句模板 :id是占位符 通过后期数据绑定来设值 $sql = 'SELECT `id`,`name`,`position` FROM `staff` WHERE `id` = :id'; // 准备对象 $stmt = $pdo->prepare($sql); // 参数绑定 有两种方法可用 // bindValue 将一个变量的值绑定到参数上 可以绑定字面量 也可以绑定变量 是简单的值传递 $id = 1; $stmt->bindValue('id', $id, PDO::PARAM_INT); $stmt->bindParam('id', $id, PDO::PARAM_INT); // 执行sql操作 $stmt->execute(); // 获取记录 // fetch() 从结果集中获取一条记录 指针下移 // PDO::FETCH_ASSOC 参数设置后就可以只获取关联数组 $result = $stmt->fetch(PDO::FETCH_ASSOC); print_r($result); echo '<hr>'; // 获取id为2 的记录 // 想要动态设置参数 只能用bindParam 他是传递引用 $id = 2; $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); print_r($result); // 关闭连接 $pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
五、查询操作
fetch适合单条操作
实例
<?php // 连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php', 'root', 'root'); // sql语句 $sql = 'SELECT `id`,`name`,`position` FROM `staff` WHERE `id` BETWEEN :start AND :stop'; // 获取准备对象 $stmt = $pdo->prepare($sql); // 数据绑定 $start = 2; $stop = 4; $stmt->bindParam('start', $start, PDO::PARAM_INT); $stmt->bindParam('stop', $stop, PDO::PARAM_INT); // 执行sql语句 $stmt->execute(); // 获取结果集 遍历打印他 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo '<pre>', print_r($row,true); } // 关闭连接 $pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
fetchAll适合获取结果列表
实例
<?php // 连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php', 'root', 'root'); // sql语句 $sql = 'SELECT `id`,`name`,`position` FROM `staff` WHERE `id` BETWEEN :start AND :stop'; // 获取准备对象 $stmt = $pdo->prepare($sql); // 数据绑定 直接给execut传值 // 执行sql语句 $stmt->execute(['start'=>2, 'stop'=>4]); // fetchAll获取结果集 遍历打印他 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { echo '<pre>', print_r($row, true); } // 关闭连接 $pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
bindColumn()
实例
<?php // 连接数据库 $pdo = new PDO('mysql:host=127.0.0.1;dbname=php', 'root', 'root'); // sql语句 $sql = 'SELECT `id`,`name`,`position` FROM `staff` WHERE `id` BETWEEN :start AND :stop'; // 获取准备对象 $stmt = $pdo->prepare($sql); // 数据绑定 直接给execut传值 // 执行sql语句 $stmt->execute(['start'=>2, 'stop'=>4]); // bindCloum将结果集中的列绑定给指定的变量 $stmt->bindColumn('id', $id, PDO::PARAM_INT); $stmt->bindColumn('name', $name, PDO::PARAM_STR); $stmt->bindColumn('position', $position, PDO::PARAM_STR); //POD::FETCH_BOUND配合bindColumn 将结果集中列绑定给指定变量 while ($stmt->fetch(PDO::FETCH_BOUND)){ echo 'id:', $id, 'name:', $name, 'position', $position, '<br>'; } // 关闭连接 $pdo = null;
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:
1、数据库是php中的重中之重,他让让php数据交互,实现动态获取数据。
2、数据库的操作就是增删改查。
3、PDO可以实现操作多种数据库,实例化PDO对象实现数据连接,注意host默认参数可以连接,但为了效率还是要加上127.0.0.1;
4、预处理对象可以先建立模板,防止反复访问数据库,提前进行处理
5、通过在sql语句中设置占位符然后通过参数绑定来实现数据查询获取,bindParam能动态绑定
6、查询数据fetch fetchAll bindColumn都有各自的应用场景,bindColumn 与fetch(PDO::FETCH_BOUND)成对出现。