Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:php开发者将常用的函数都已经写好封装到版本中了, 但是你如何能想到它的内部实现, 自己动写也能写出来,是一种非常棒的学习方式, 可以从底层想明白作者为什么这么做?
<?php
// 自己手动设置键名从0递增
$goods = [0=>'a100', 1=>'小米笔记本', 2=>'air', 3=>3899];
// 非正常顺序的键名
$goods = [5=>'a100', 8=>'小米笔记本', 1=>'air', 3=>3899];
// 不写键名,默认从0递增
$goods = ['a100', '小米笔记本', 'air', 3899];
<?php
// 键名是有语义的单词
$goods = ['id'=>'a100', 'name'=>'小米笔记本', 'model'=>'air', 'price'=>3899];
方法一:$arr = array()
<?php
// 不写键名,直接写值,创建索引数组
$arr = array('a','b','c');
// 写键名=>键值这种格式,创建关联数组
$arr = array('id'=>100, 'name'=>'username','password'=>'123456');
方法二:$arr[] / $arr[‘key’]
<?php
// 创建索引数组
$arr[] = 'value1';
$arr[] = 'value1';
// 创建关联数组
$arr['username'] = '用户名';
$arr['email'] = 'email@email.com';
方法三:$arr = [];
<?php
// 创建索引数组
$arr= ['a','b','c',4];
// 创建关联数组
$arr = ['id'=>10,'user'=>'tlilam'];
方法4:多维数组创建
<?php
$arr = [
0 =>['id'=>'105','name'=>'105员工','email'=>'105@tlilam.cn'],
1 =>['id'=>'106','name'=>'106员工','email'=>'106@tlilam.cn'],
2 =>['id'=>'107','name'=>'107员工','email'=>'107@tlilam.cn'],
];
1.访问索引数组
<?php
// 方括号[]内些整数键名
echo $arr[0];
echo $arr[1];
2.访问关联数组
<?php
// 方括号[]内写键名
echo $arr['id'];
echo $arr['usernaem'];
3.访问多维数组
<?php
// 一个方括号代表一维数组$arr['一维的键名']['二维的键名']['以此类推']
echo $arr[1]['name'];
1.移动指针遍历:使用while等循环移动指针进行遍历
<?php
$arr = [
'id' => '1024',
'name' => 'tlilam',
'age' => 20,
'course' => 'php',
'grade' => 98
];
// 移动指针命令
/**
* next指针移动到下一个
* prev指针移动到上一个
* end指针移动到最后
* reset指针移动到开始第一个
*/
reset($arr);
//while循环遍历
while(true){
// key()返回当前指针的键名,current()返回当前指针的键值
printf('[ %s ] => %s <br>', key($arr), current($arr));
if(next($arr)){
continue;
}else{
break;
}
}
//for循环,while循环等有二步必须手工添加: 复位数组的指针, 数组的指针下移
2.foreach自动循环遍历:自动完成上面的两步,复位指针和指针下移
<?php
//foreach(数组 as 键名 => 键值)
foreach($arr as $key =>$value ){
//对键名或键值进行操作
printf('[ %s ] => %s <br>', $key, $value);
}
3.list数组解构:list不是函数,是一种表达式,比较合适在一维数组使用
<?php
// list低版本只能解构索引数组
// 创建与数组对应的变量,进行解构
list($a,$b) = [20,40];
echo $a, ', ', $b, '<br>';
// php7+以上版本支持关联数组的解构
list('name'=>$name,'age'=>$age) = ['name'=>'peter','age'=>44];
echo $name, ', ', $age;
//创建一个数组进行使用
$arr = ['id'=>1, 'name'=>'admin', 'email'=> 'admin@php.cn'];
1.array_key_exists()判断数组中是否存在指定键名
<?php
// 存在返回1 不存在返回空,空也等于false
echo array_key_exists('email', $arr) ;
2.in_array()判断数组中是否存在指定键值
<?php
// 存在返回1 不存在返回空,空也等于false
var_dump(in_array('admin', $arr));
3.array_search()在数组中查询指定键值
<?php
//如果找到了,返回这个值对应的键名,找不到返回false
var_dump(array_search('admin', $arr));
4.排序函数
<?php
// 数组的排序函数 加入r表示反序
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
// 1.对键值进行排序
sort($arr);
// 反序
// rsort($arr);
// 2.对键名进行排序
ksort($arr);
//对键名进行反排序
//krsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
// 3.natsort()自然排序
//当键值中数字位数有两位以上就会出现1.jpg 10.jpg 2.jpg这种排序
$arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
natsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
5.array_splice()删除元素,但是可以实现增加,更新
<?php
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
// 删除
// $res = array_splice($arr, 1, 2);
// 返回值就是被删除的元素组成的数组
// printf('<pre>%s</pre>',print_r($res,true));
// printf('<pre>%s</pre>',print_r($arr,true));
// 替换
// $res = array_splice($arr, 1, 2, [888,999]);
// printf('<pre>%s</pre>',print_r($res,true));
// printf('<pre>%s</pre>',print_r($arr,true));
// 新增
$res = array_splice($arr, 1, 0, [888,999]);
printf('<pre>%s</pre>',print_r($res,true));
printf('<pre>%s</pre>',print_r($arr,true));
6.回调数组函数:array_map()为数组中的每一个元素应用回调函数进行处理,并返回一个新数组
<?php
$arr = ['php',3,4,5,15,20];
printf('<pre>%s</pre>',print_r($arr,true));
//自定义函数判断元素是整型类型就乘于二
$res=array_map(function($item){
if(is_integer($item)){
$item *= 2;
}
return $item;
}, $arr);
//还有很多回调数组函数
7.implode()数组转字符串
<?php
$arr = ['huawei', 'xiaome', 'apple', 'oppo', 'vivo'];
//implode(连接符,数组)
echo implode('--', $arr);
8.extract()该函数使用数组键名作为变量名,使用数组键值作为变量值
<?php
$params = ['type' =>$type, 'host' => $host, 'dbname' => $dbname, 'charset' =>$charset];
extract($params);
//将关联数组的键值对转为一个个独立的变量, 变量名就是原来的键名
echo $type, $host, $dbname, $charset;
<?php
// 连接参数
$config = [
// 类型
'type' => $type ?? 'mysql',
// 默认主机名
'host' => $username ?? 'localhost',
// 默认编码集
'charset' => $charset ?? 'utf8',
// 默认端口号
'port' => $porst ?? '3306',
// 默认用户名
'username' => $usernam ?? 'root',
// 默认用户的密码
'password' => $password ?? 'root',
// 默认数据库
'dbname' => $dbname ?? 'phpedu',
];
// 将参数数组分解成独立的变量
extract($config);
// mysqli(数据库的主机名, 用户名, 用户密码,默认的数据库)
// 1. 创建数据库的连接对象, 连接数据库
$mysqli = new mysqli($host, $username, $password, $dbname);
// 2. 检测错误, die /exit,终止代码,后面不要再执行
if ($mysqli->connect_errno) die('Connect Error: '. $mysqli->connect_error);
// 3. 设置字符编码
$mysqli->set_charset($charset);
1.插入记录insert
<?php
// mysqli插入单条记录
// 1.引入连接文件
require 'connect.php';
// 2.创建带占位符的sql语句
// 2.1 插入SQL语句方式1
// $sql = 'INSERT `users` (`name`, `email`, `password` ) VALUES (?, ?, ?);';
// 2.2 插入SQL语句方式2
$sql = 'INSERT INTO `users` SET `name`=?, `email`=?, `password`=?;';
// 3.进行预加载,预定义,返回stmt对象
$stmt = $mysqli->prepare($sql);
// 4.进行占位符与变量的绑定
// 参数1 :声明变量类型,几个变量对应几个字符
// s - string(字符串) i - integer(整型)d - double(双精度浮点型) b - BLOB(binary large object:二进制大对象)
$stmt->bind_param('sss',$name,$email,$password);
// var_dump($stmt);exit();
// 5.给变量赋值
$name = 'tlilam';
$email = 'tlilam@163.com';
$password = sha1('444');
// 6.执行
// 执行成功返回true值
$a = $stmt->execute() or die($stmt->error);
// 7.调用属性,输出执行结果
// $stmt->affected_rows:受影响的记录数量,
// $stmt->insert_id:新增记录的主键ID
printf('成功的新增了 %s 条记录, 新增主键id是: %d',$stmt->affected_rows, $stmt->insert_id);
// 8.关闭连接【可选】
$mysqli->close();
运行结果图:
2.插入多行记录:
<?php
// mysqli插入多条记录
// 准备二维数组,进行循环遍历,去执行$stmt->execute(),
// 成功就将成功的记录和新增记录的ID记录起来, 失败就返回失败的编号与原因
// 1.引入连接文件
require 'connect.php';
// 2.创建带占位符的sql语句
// 2.1 插入SQL语句方式1
// $sql = 'INSERT `users` (`name`, `email`, `password` ) VALUES (?, ?, ?);';
// 2.2 插入SQL语句方式2
$sql = 'INSERT INTO `users` SET `name`=?, `email`=?, `password`=?;';
// 3.进行预加载,预定义,返回stmt对象
$stmt = $mysqli->prepare($sql);
// 4.进行占位符与变量的绑定
// 参数1 :声明变量类型,几个变量对应几个字符
// s - string(字符串) i - integer(整型)d - double(双精度浮点型) b - BLOB(binary large object:二进制大对象)
$stmt->bind_param('sss',$name,$email,$password);
// var_dump($stmt);exit();
// 5.组合二维数组
$users = [
['name'=> '小燕子','email'=>'xyz@php.cn', 'password'=>sha1('123456')],
['name'=> '紫薇','email'=>'zw@php.cn', 'password'=>sha1('123456')],
['name'=> '金锁','email'=>'js@php.cn', 'password'=>sha1('123456').'888888888888888888888888888888888'],
['name'=> '五阿哥','email'=>'wag@php.cn', 'password'=>sha1('123456')],
['name'=> '尔康','email'=>'ek@php.cn', 'password'=>sha1('123456')],
];
// 6.循环遍历执行
// 执行并记录执行结果
$result = [];
foreach ($users as $user) {
// 再将$user这个一维数组拆分
extract($user);
// 判断执行结果
if ($stmt->execute()) {
$result['success_num']++;
$result['success_id'][] = $stmt->insert_id;
}else{
$result['error'][] = array('errno'=>$stmt->errno,'error'=>$stmt->error);
}
}
// 打印返回结果数组,存在一起比较方便结果的后续使用
var_dump($result);
// 7.关闭连接【可选】
$mysqli->close();
运行结果图:
3.更新单条记录update
<?php
// mysqli更新操作
// 1.引入连接文件
require 'connect.php';
// 2.创建带占位符的sql语句
$sql = 'UPDATE `users` SET `name`=?, `email`=?, `password`=? WHERE `id`=? ;';
// 3.进行预加载,预定义,返回stmt对象
$stmt = $mysqli->prepare($sql);
// 4.进行占位符与变量的绑定
$stmt->bind_param('sssi',$name,$email,$password,$id);
// 5.生成变量并执行
$user = ['name'=>'皇后', 'email'=>'hh@php.cn', 'password'=>sha1('123'), 'id'=>10];
extract($user);
// 执行
$stmt->execute() or die($stmt->error);
// 6.显示执行结果
if ($stmt->affected_rows === 1)
printf('成功的更新了 %s 条记录',$stmt->affected_rows);
else echo '没有记录被更新';
// 7.关闭连接【可选】
$mysqli->close();
运行结果图:
4.删除单条记录
<?php
// mysqli删除操作
// 1.引入连接文件
require 'connect.php';
// 2.创建带占位符的sql语句
$sql = 'DELETE FROM `users` WHERE `id`=? ;';
// 3.进行预加载,预定义,返回stmt对象
$stmt = $mysqli->prepare($sql);
// 4.进行占位符与变量的绑定
$stmt->bind_param('i',$id);
// 5.生成变量并执行
$id = 10;
// 执行
$stmt->execute() or die($stmt->error);
// 6.显示执行结果
if ($stmt->affected_rows === 1)
printf('成功的删除了 %s 条记录',$stmt->affected_rows);
else echo '没有记录被删除';
// 7.关闭连接【可选】
$mysqli->close();
运行结果图:
5.查询操作-单条查询
<?php
// 单条查询,占用十分低,因为是一条条数据取出来
// mysqli查询操作,fetch_assoc() + while()
// 1.连接数据库
require 'connect.php';
// 2.准备SQL语句
$sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>?;';
// 3.加载预定义SQL
$stmt = $mysqli->prepare($sql);
// 4.绑定变量
$stmt->bind_param('i',$id);
$id =10;
// 5.成功返回1 true值 ,失败终止程序,返回错误代码
$a = $stmt->execute() or die($stmt->error);
// echo $a;
// 6.获取成功将会生产一个结果集
$result = $stmt->get_result();
// var_dump($result);
// 7.判断num_rows是否为空,空退出程序,不为空进行结果集处理
if ($result->num_rows === 0) {
// 中断程序
exit('结果集为空');
}else{
// 类似指针遍历,取一条数据,指针向下移动,再取数据就是下一条,取完为空
/* print_r($result->fetch_assoc());
print_r($result->fetch_assoc());
print_r($result->fetch_assoc());
print_r($result->fetch_assoc());
print_r($result->fetch_assoc());
var_dump($result->fetch_assoc());*/
// 创建数组存放信息,以便后续使用
$result_arr = [];
// 使用while循环遍历
while($user = $result->fetch_assoc()){
$result_arr[] = $user;
}
}
// 测试,查看获取的信息集
var_dump( $result_arr );
// 8.释放结果集
$result->free();
// 9.关闭连接
$mysqli->close();
运行结果图:
6.查询操作-一次性查询
<?php
// 全部查询,一两千条数据左右可以使用,过多可能会顶不住,占用会比较高
// mysqli查询操作,fetch_all() + foreach()
// 1.连接数据库
require 'connect.php';
// 2.准备SQL语句
$sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>?;';
// 3.加载预定义SQL
$stmt = $mysqli->prepare($sql);
// 4.绑定变量
$stmt->bind_param('i',$id);
$id =4;
// 5.成功返回1 true值 ,失败终止程序,返回错误代码
$a = $stmt->execute() or die($stmt->error);
// echo $a;
// 6.获取成功将会生产一个结果集
$result = $stmt->get_result();
// var_dump($result);
// 7.判断num_rows是否为空,空退出程序,不为空进行结果集处理
if ($result->num_rows === 0) {
// 中断程序
exit('结果集为空');
}else{
// 默认返回索引数组,只有值,字段名不会成为键名
// $users = $result->fetch_all();
// 加入常量,返回关联数组,字段名成为键名,数据做键值
$users = $result->fetch_all(MYSQLI_ASSOC);
// 测试,查看获取的信息集
// var_dump( $users );
}
// 使用foreach进行信息集处理
foreach ($users as $user) {
vprintf('%d: %s | %s <br>', $user);
}
// 8.释放结果集
$result->free();
// 9.关闭连接
$mysqli->close();
运行结果图:
7.查询操作-将单条记录解构到变量
<?php
// 单条查询,使用的不是结果集,是将单条记录的每一个字段的数据绑定到变量中
// mysqli查询操作,bind_result() + fetch() + while()
// 1.连接数据库
require 'connect.php';
// 2.准备SQL语句
$sql = 'SELECT `id`, `name`, `email` FROM `users` WHERE `id`>?;';
// 3.加载预定义SQL
$stmt = $mysqli->prepare($sql);
// 4.绑定变量
$stmt->bind_param('i',$id);
$id =4;
// 5.成功返回1 true值 ,失败终止程序,返回错误代码
$stmt->execute() or die($stmt->error);
// 6.将结果集中的字段名称与对应的变量进行绑定,
// 变量数量要与字段数量相等,成功返回true
$result = $stmt->bind_result($id,$name,$email);
// var_dump($result);
// 7.将字段的"值"与具体的变量名进行存储绑定
$stmt->store_result();
if ($stmt->num_rows===0) {
die('没有内容');
}else{
// 8.$stmt->fetch() 进行取值
while ($stmt->fetch()) {
printf('%d: %s ----| %s <br>', $id, $name, $email);
}
}
// 9.关闭连接
$mysqli->close();
运行结果图:
数组的基本内容不难,与变量一样难点在于函数方面,PHP已经制作了很多系统函数,很多功能都已经实现,就看个人对系统函数的熟悉度,前期可以通过使用自定义函数或者使用数组回调函数实现一些系统已有功能,帮助自己理解函数与提升能力,但后期还需加强对系统函数的熟悉,毕竟重复写系统已经制作好的函数,会影响工作效率,直接拿系统函数来用就可以了
mysqli 面向对象 + 预处理 主要下面这四步
$mysqli
SELECT
查询/INSERT
新增/UPDATE
更新/DELETE
删除操作