1.编程:MySQLi面向对象中的查询操作
实例
1.编程:MySQLi面向对象中的查询操作 <?php require 'mysqli/config.php'; error_reporting(E_ALL ^E_WARNING);//报告E_WARNING之外的所有错误 //简化: 将连接参数转为变量或数组 $mysqli = new mysqli($db_host,$db_user,$db_pass,$db_name); //判断是否连接成功? if ($mysqli->connect_errno) { // 自定义错误提示信息 die('连接错误'.$mysqli->connect_errno.': '. $mysqli->connect_error); } //echo '<h1>连接成功</h1>'; //设置默认数据库 $mysqli->select_db($db_name); //设置客1户端默认的字符编码集 $mysqli->set_charset($db_charset);
运行实例 »点击 "运行实例" 按钮查看在线实例
2. 问答:PDO的优势
PDO可以跨平台使用,支持几乎所有的数据库类型;
PDO可以防止SQL注入,确保数据库更加安全;
PDO是PHP官方的PECL库,兼容性稳定性更高;
PDO支持更高级的DB特性操作
3.编程:PDO连接数据库
实例
<?php header("Content-Type: text/html; charset=UTF-8"); // PDO 即PHP(P)数据(D)对象(O),是PHP操作所有数据库的抽象层,提供了一个统一的访问接口。 // 数据源:设置数据库的类型,以及数据库服务器和默认的数据库 $dsn = 'mysql:host=127.0.0.1; dbname=edu'; //用户名 $user = 'root'; //密码 $pass = 'root'; //实例化PDO类,创建pdo对象,并完成了数据库的连接 //将要执行的代码放入TRY块中,如果这些代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示. try { $pdo = new PDO($dsn, $user, $pass); //echo '<h2>连接成功</h2>'; } catch (PDOException $e) { die('Connect ERROR! :'. $e->getMessage()); } // 关闭连接 有下面2种方式都可以 //$pdo = null; //unset($pdo);
运行实例 »点击 "运行实例" 按钮查看在线实例
4. 编程:PDO新增数据
实例
<?php //新增记录1 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "INSERT `user` SET `name`= :name , `email`= :email, `password`= md5(:password)"; //创建预处理对象 $stmt = $pdo->prepare($sql); //绑定参数 $data = ['name'=>'杨过','email'=>'yg@php.cn','password'=>'123']; $stmt->bindParam(':name',$data['name'],PDO::PARAM_STR);//PDO::PARAM_STR为字符串类型 $stmt->bindParam(':email',$data['email'],PDO::PARAM_STR); $stmt->bindParam(':password',$data['password'],PDO::PARAM_STR); //执行操作 if ($stmt->execute()) { // rowCount(): 返回受影响的记录数量 echo '<h3>成功添加了'.$stmt->rowCount().'条记录</h3>'; } else { echo '<h3>添加失败</h3>'; print_r($stmt->errorInfo()); exit(); } //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
实例
<?php //新增记录2 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "INSERT `user` SET `name`= :name,`email`= :email, `password`= md5(:password)"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行操作 $stmt->execute(['name'=>'尹志平1','email'=>'yzp@php.cn','password'=>'123']); $stmt->execute(['name'=>'尹志平2','email'=>'yzp@php.cn','password'=>'123']); $stmt->execute(['name'=>'尹志平3','email'=>'yzp@php.cn','password'=>'123']); $stmt->execute(['name'=>'尹志平4','email'=>'yzp@php.cn','password'=>'123']); $stmt->execute(['name'=>'尹志平5','email'=>'yzp@php.cn','password'=>'123']); //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
5. 编程:PDO更新数据
实例
<?php //更新记录 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "UPDATE `user` SET `name`= :name,`email`= :email WHERE `id`= :id"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行操作 if ($stmt->execute(['name'=>'小龙女','email'=>'xln@qq.com','id'=>4])) { // rowCount(): 返回受影响的记录数量 echo '<h3>成功更新了'.$stmt->rowCount().'条记录</h3>'; } else { echo '<h3>更新失败</h3>'; print_r($stmt->errorInfo()); exit(); } //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
6. 编程:PDO删除数据
实例
<?php //删除记录 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "DELETE FROM `user` WHERE `id`= :id"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行操作 if ($stmt->execute(['id'=>4])) { // rowCount(): 返回受影响的记录数量 echo '<h3>成功删除了'.$stmt->rowCount().'条记录</h3>'; } else { echo '<h3>删除失败</h3>'; print_r($stmt->errorInfo()); exit(); } //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
7. 编程:PDO查询数据
实例
<?php //预处理查询 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "SELECT `name`,`email` FROM `user` WHERE `id`< :id"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行操作 $stmt->execute(['id'=>3]); //一次性取出 fetchAll()这个函数一般在不确定数据量大小的情况下,不建议使用,因为会造成死机。 //函数从结果集中取得所有行作为关联数组,或数字数组,或二者兼有。 /*$rows = $stmt->fetchAll(); foreach ($rows as $row) { echo 'name: ',$row['name'],'------email: ',$row['email'],'<br>'; } */ while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo var_export($row),'<br>'; } //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
实例
<?php //预处理查询 header("Content-Type: text/html; charset=UTF-8"); //连接数据库 require 'ceshi-pdo1.php'; //准备SQL语句,占位符我们不再用?,用"命名占位符" $sql = "SELECT `name`,`email` FROM `user` WHERE `id`< :id"; //创建预处理对象 $stmt = $pdo->prepare($sql); //执行操作 $stmt->execute(['id'=>3]); //获取一行一列,无法获取同一行其它列 echo $stmt->fetchColumn(0),'<br>';//为空就是第一列 //指针自动下移,获取二行2列 echo $stmt->fetchColumn(1),'<br>'; echo '<hr>'; $stmt = $pdo->prepare($sql); $stmt->execute(['id'=>5]); // 结果看上去是正确的,但是是有问题的,不要这样做,用下面的方法 echo 'ID小于5的人数: '. $stmt->rowCount(); echo '<hr>'; $stmt = $pdo->prepare("select count(*) from user where id < :id");//SELECT COUNT(*) FROM table_name函数返回表中的记录数 $stmt->execute(['id'=>5]); echo 'ID大于5的人数: '. $stmt->fetchColumn(); //注销stmt对象 $stmt = null; // 关闭连接 $pdo = null;
运行实例 »点击 "运行实例" 按钮查看在线实例
8.问答:获取结果集记录数量的正确方式是什么?
对于大多数数据库,PDOStatement::rowCount() 不能返回受一条 SELECT 语句影响的行数。正确的方法是,使用 PDO::query() 来发出一条和原打算中的SELECT语句有相同条件表达式的 SELECT COUNT(*) 语句,然后用 PDOStatement::fetchColumn() 来取得返回的行数。这样应用程序才能正确执行。