在db类中除了完成数据库连接和关闭外,剩下的就是实现数据的增删改查了。
接下来,我们要完成的就是数据的增加。
1、必须会书写添加记录的sql指令
INSERT INTO `student`(`no`, `name`, `sex`, `age`) VALUES ('183001','张三','男',20)
2、我们在类中需要定义一个方法add,来完成记录的添加。该方法主要实现:将调用者传递的数据,变成sql指令,最后执行sql指令,并返回结果。
<?php
/**
* 数据库操作类,文件名:Db.class.php
*/
class Db
{
private $conn; //保存数据库连接资源
//构造方法:主要实现数据库连接,设置编码格式,并把数据库连接对象conn保存到属性中,为其他方法使用
function __construct($dbname, $usr, $pwd, $host = "127.0.0.1", $port = 3306, $coding = 'utf8')
{
//省略
}
//析构方法:不会有任何参数
function __destruct()
{
//省略
}
/**
* @param $table 数据表名
* @param $data 添加的数据,关联数组类型 格式为:['no'=>'1001','name'=>'张三',]
*/
function add($table,$data){
if(!is_array($data)){
die('第二参数必须必须是关联数组');
}
$fields = $values = '';
//遍历$data,构建字段列表和值列表
foreach ($data as $k=>$v){
$fields .= '`' . $k . '`,';
$values .= '"' . $v . '",';
}
//去除末尾的逗号
$fields = rtrim($fields,',');
$values = rtrim($values,',');
//构建sql指令
$sql = "insert into {$table} ($fields) values ($values)";
//输出sql指令,测试是否正确
echo $sql;
}
}
封装add方法最关键的第一步:选择合适的算法,构建正确sql指令。
在这里,我们采用遍历数组的方式,依次取出每个元素的键和值。
有一些细节必须注意:
- 为防止有一些字段与sql关键字冲突,我们在字段上加了反引号
- 传递的数据,如果是字符串,其值不能包括引号,否则会出错。这也是这种算法的缺陷之处。
我们来看看,如何来调用类中的add方法。因为add方法需要两个参数,所以我们也传递两个参数。
<?php
/**
* 测试文件 test.php
*/
require_once "Db.class.php";
$db = new Db("myschool",'root','');
//合法的数据
$db->add('student',['no'=>'1831001','name'=>'张三','sex'=>'男','age'=>20]);
//非法的数据,'"张"三'
$db->add('student',['no'=>'1831003','name'=>'"张"三','sex'=>'男','age'=>19]);
第二个add方法传递的数据中包含了引号,最终构建出的sql指令insert into student (`no`,`name`,`sex`,`age`) values ("1831003",""张"三","男","19"),这样的sql指令执行就会出错误。
封装add方法关键的第二步:就是如何执行sql指令
//执行sql指令
$ret = mysqli_query($this->conn,$sql);
return $ret;
mysqli_query 返回结果:针对成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,将返回一个 mysqli_result 对象。针对其他成功的查询,将返回 TRUE。如果失败,则返回 FALSE。