博客列表 >PHP MySQLi 增删查改(CURD)实例-面向对象方法

PHP MySQLi 增删查改(CURD)实例-面向对象方法

hanyufeng的博客
hanyufeng的博客原创
2018年01月05日 19:05:00996浏览

说明:

在“PHP + MySQL 增删查改(CURD)实例——面向过程方法”(http://hanyufeng.php.cn/blog/detail/2134)的基础上,改用面向对象及SQL语句预处理的方法实现。

重点:

mysqli、mysqli_stmt 对象的常用方法及属性。

预处理语句的参数写法。

公共文件修改:

connect.php

<?php
//使用配置文件保存参数
require 'config.php';
//使用mysqli对象
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_errno) {
    printf("连接错误: %s". $mysqli->connect_error);
}
$mysqli->set_charset(DB_CHARSET);

列表(查询)页面 list.php

<?php
$pageTitle = '用户信息列表';
include  'inc/header.php';

//连接数据库
require 'inc/connect.php';

//查询用户信息表user
$sql = "SELECT `id`,`name`,`email` FROM user";  //创建查询语句
//注意:不能写 SELECT * ,必须逐个写出
//否则报错提示:Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in……
$mysqli_stmt = $mysqli->prepare($sql);
$rows = [];  //创建查询结果容器,初始为空数组,该数组最终会成为一个二维数组,与数组表对应
if ($mysqli_stmt->execute()) { //select语句执行会返回一个结果集
    $mysqli_stmt->store_result();  //传送一个结果集到stmt对象
    if ($mysqli_stmt->num_rows > 0) {
        //将结果集中的字段与变量进行绑定,当前返回的有三个字段
        $mysqli_stmt->bind_result($id,$name,$email);
        //开始遍历结果集,将获取到的数据与绑定的变量结合
        $i =0;
        while ($mysqli_stmt->fetch()) { //从结果集的第一条记录开始抓取数据到绑定的变量中
            //继续沿用$rows数组保存数据,以便重复使用输出数据到页面的代码
            $rows[$i] = ['id'=>$id,'name'=>$name,'email'=>$email];
            $i++;
        }
        $mysqli_stmt->free_result(); //释放预处理结果集
        $mysqli_stmt->close();  //关闭当前的预处理语句
    } else {
        echo '<p style="color:red">当前表中没有数据~~</p>';
    }
} else {
    echo '<p>查询失败:'.$mysqli_stmt->error.'</p>';
}

//关闭连接
$mysqli->close();

?>

编辑页面 edit.php

<?php include 'inc/header.php';
$id = $_GET['id'];  //获取到要编辑的记录的id

require 'inc/connect.php';  //连接数据库
//准备查询语句
$sql = "SELECT * FROM `user` WHERE `id` = ".$id;
$res = $mysqli->query($sql);  //执行查询
if(isset($res))
{
    if($res->num_rows>0)
    {
        $row = $res->fetch_array();
    }
}

//if ($res && mysqli_num_rows($res) > 0) {
//    //根据主键查询只会返回一条记录,不用循环处理
//  $row = mysqli_fetch_array($res, MYSQLI_ASSOC);
//}


?>

do_edit.php 代码调整,使用预处理sql语句生成mysqli_stmt对象,并绑定参数

<?php
/**
 * 1.检测表单数据有效性
 * 2.更新数据表(使用预处理对象mysqli_stmt)
 * 3.处理错误信息
 */

$pageTitle = '更新处理';  //设置当前页面标题
include 'inc/header.php';  //导入公共文件头部

//1.检测表单数据有效性
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $error = []; //创建一个数组,用来保存出错信息
    //用户名只读,跳过检查
    //检查邮箱信息
    if (empty($_POST['email'])) {
        $error[] = '没有输入邮箱,请检查';
    } else {
        $email = trim($_POST['email']);
    }
    //如果错误信息数组空,数据有效,更新到数据库
    //2.更新数据表
    if (empty($error)) {
        //连接数据库
        require 'inc/connect.php';
        //创建预处理sql语句,参数使用?占位
        $sql = "UPDATE user SET `email`=? WHERE `id`=?";
        $mysqli_stmt = $mysqli->prepare($sql);
        $id = $_GET['id'];
        //参数类型: s字符串,i整数,d浮点小数
        $mysqli_stmt->bind_param('si', $email, $id);
        //更新数据
        if ($mysqli_stmt->execute()){
            echo '<h3 style="color: green">成功更新了'.$mysqli_stmt->affected_rows.'条记录</h3>';
        } else {
            echo '<h3 style="color:red">更新失败:'.$mysqli_stmt->error.'</h3>';
        }
        //关闭预处理语句
        //如果重复使用预处理语句,就不需要close
        $mysqli_stmt->close();
    }  else {
        //打印出错误信息
        foreach ($error as $message) {
            echo '<h3 style="color:red">'.$message.'</h3>';
        }
    }
}

include 'inc/footer.php';  //导入公共头部

delete.php 

<?php
require 'inc/connect.php';

$sql = "DELETE FROM user WHERE id=?";
$mysqli_stmt = $mysqli->prepare($sql);
$id = $_GET['id'];
//参数类型: s字符串,i整数,d浮点小数
$mysqli_stmt->bind_param('i', $id);

if ($mysqli_stmt->execute()){
    echo '<script>alert("成功删除'.$mysqli_stmt->affected_rows.'条记录")</script>';
} else {
    echo '<script>alert("删除失败'.$mysqli_stmt->error.'")</script>';
}
$mysqli_stmt->close();


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