蓝易云高性能服务器
|
|
|
|
|
|
|
|
|
|
PHP控制Mysql-9
php数据库连接步骤
“数据库连接天龙八步”。
这八个步骤如下,并且将每一步使用的函数都做了说明:
第一步: 连接数据库服务器
类型 | 说明 |
---|---|
函数 | mysqli_connect |
功能 | 连接到mysql数据库服务器 |
参数1 | 主机 |
参数2 | 数据库服务器登陆名 |
参数3 | 密码 |
参数4 | 数据库的名称 |
参数5 | 数据库服务器端口不填默认3306 |
若参数4,数据库名称在此步已填并择,不需要执行第三步。
localhost表示线上
die如果连接不成功就终止连接
<?php
$con = mysqli_connect("localhost"账户","密码");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
?>
<?php
$con = mysqli_connect("localhost","数据库名","密码",'选择数据库可写可不写');
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
?>
第二步: 判断错误
类型 | 说明 |
---|---|
函数 | mysqli_errno |
功能 | 返回连接错误号,无错误返回0 |
参数1 | 传入mysqli_connect返回的资源 |
类型 | 说明 |
---|---|
函数 | mysqli_error |
功能 | 返回连接错误字符串 |
参数1 | 传入mysqli_connect返回的资源 |
第三步: 选择数据库
类型 | 说明 |
---|---|
函数 | mysqli_select_db |
功能 | 选择本连接中的数据库 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 需要连接的数据库名 |
若在第一步已填数据库,不需要更换成其他数据库,则不需要执行第三步。
<?php
$con = mysqli_connect("localhost","数据库名称","密码");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
mysql_select_db("库名")
?>
<?php
$con = mysqli_connect("localhost","数据库名称","密码","库名");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
?>
第四步: 设置字符集
类型 | 说明 |
---|---|
函数 | mysqli_set_charset |
功能 | 设置与mysql服力器连接,结果,校验字符集 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 字符集类型 |
<?php
//设置sql语句
$sql = "insert into log(username,password) values('$user','$password')";
//连接数据库
$con = mysqli_connect("localhost","数据库名称","密码");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
// 连接库里面的库
mysqli_select_db($con,'库');
// 发送SQL语句
//result设置一个返回值
$result=mysqli_query($con,$sql);
var_dump($result);
?>
第五步: 准备SQL语句
其实就是一个SQL语句的字符串。
例如:
<?php
//设置sql语句
//创建一个username=user,password=password的
$sql = "insert into log(username,password) values('user','password')";
//连接数据库
$con = mysqli_connect("localhost","数据库名称","密码");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
// 连接库里面的库
mysqli_select_db($con,'库名');
// 发送SQL语句
//result设置一个返回值
$result=mysqli_query($con,$sql);
var_dump($result);
?>
我们通常要把变量赋值在SQL语句中使用。可是变量或者SQL语句出错了,非常不好排查。
我们根据实际工作经验增加了这一步。
如果在执行此步的时候报错了,我们可以把SQL语句打印出来,粘贴到phpMyAdmin或者相关工具中。
排错时,如果执行成功就说明不是SQL语句的问题。如果执行失败,请仔细检查SQL语句。
第六步: 发送SQL语句
类型 | 说明 |
---|---|
函数 | mysqli_query |
功能 | 发送SQL语句 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 传入发送的SQL语句 |
SQL语句准备完成,需要通过mysqli_query将SQL语句发送给MySQL服务器。
MySQL服务器会执行发送过来的SQL语句进行执行。
第七步: 判断是否执行正常或者遍历数据
读取
第6步中,发送的是select类别的语句,通常需要将结果输出显示出来。就需要用到遍历显示数据的函数。
类型 | 说明 |
---|---|
函数 | mysqli_fetch_array |
功能 | 得到result结果集中的数据,返回数组进行便利 |
参数1 | 传入查询出来的结果变量 |
参数2 | 传入MYSQLI_NUM返回索引数组,MYSQLI_ASSOC返回关联数组,MYSQLI_BOTH返回索引和关联 |
类型 | 说明 |
---|---|
函数 | mysqli_fetch_assoc |
功能 | 得到result结果集中的数据,返回关联数组进行便利 |
参数1 | 传入查询出来的结果变量 |
类型 | 说明 |
---|---|
函数 | mysqli_fetch_row |
功能 | 得到result结果集中的数据,返回索引数组进行便利 |
参数1 | 传入查询出来的结果变量 |
类型 | 说明 |
---|---|
函数 | mysqli_fetch_object |
功能 | 得到result结果集中的数据,返回对象进行遍历 |
参数1 | 传入查询出来的结果变量 |
类型 | 说明 |
---|---|
函数 | mysqli_num_rows |
功能 | 返回查询出来的结果总数 |
参数1 | 传入查询出来的结果变量 |
类型 | 说明 |
---|---|
函数 | mysqli_num_rows |
功能 | 返回查询出来的结果总数 |
参数1 | 传入查询出来的结果变量 |
注 | 实际工作中用得非常少,了解 |
写入
第6步中,如果发送的是insert的语句,通常需要得到是否执行成功,或者同时拿到自增的ID。
类型 | 说明 |
---|---|
函数 | mysqli_fetch_field |
功能 | 遍历数据行 |
参数1 | 传入查询出来的结果变量 |
修改和删除
第6步中,如果发送的是update和delete类别的语句。只需要判断是否执行成功即可。
我们将这些常用函数列出数据表给给大家查看。
第八步: 关闭数据库
类型 | 说明 |
---|---|
函数 | mysqli_close |
功能 | 关闭数据库连接 |
参数1 | 传入mysqli_connect返回的资源 |
数据库连接是一个资源类型。我们在之前的章节中讲解资源类型的时候跟大家说过。凡是涉及到数资源类型的有打开就有关闭。这样能够保证PHP更高效的处理和回收资源。
<?php
//设置sql语句
$sql = "insert into log(username,password) values('$user','$password')";
//连接数据库
$con = mysqli_connect("localhost","","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo '连接成功';
// 连接库里面的库
mysqli_select_db($con,'');
// 发送SQL语句
//result设置一个返回值
$result=mysqli_query($con,$sql);
//var_dump($result);
//关闭数据库
$bool=mysqli_close($con);
var_dump($bool);
?>
其他:显示服务器信息函数
类型 | 说明 |
---|---|
函数 | mysqli_get_server_info |
功能 | 返回服务器信息 |
参数1 | 传入mysqli_connect返回的资源 |
类型 | 说明 |
---|---|
函数 | mysqli_get_server_version |
功能 | 返回服务器版本 |
参数1 | 传入mysqli_connect返回的资源 |
注意:
mysqli只学过程化的方法即可。在面向对象阶段实际工作中完全抛弃了mysqli的对象用法,而是使用的是PDO对象连接数据库的方式。
php操作数据库之通过步骤做一个用户注册
一个简单的注册页面
用户
密码
重复密码
<form action="1.php" method="post">
用户名:<input type="test" name="username"><br />
密码:<input type="password" name="password"><br />
确认密码:<input type="password" name="repassword"><br />
</form>
另一个
<!DOCTYPE >
<html>
<html lang="ch">
<head>
<meta charset="utf-8">
<title>三千</title>
<style type="text/css">
#title{
font-family:"新宋体";
position: absolute;
color: brown;
font-size: 60px;
text-align-last: center;
left: 40%;
top: 10%;
}
#content{
position: absolute;
top: 50%;/*顶部到元素*/
left:30%;
width: 40%;
height:400px;
margin-top:-200;/*边缘到底部*/
background-color: #34495e;
text-align-last: center;
/*这里做一个半透明效果*/
filter:alpha(Opacity=60);
-moz-opacity:0.8;
opacity: 0.8;
}
#userid{
color: #3498db;
font-size: 30px;
text-align: center;
border-radius: 25px;/*边框圆角*/
}
#password{
color: #3498db;
font-size: 30px;
text-align: center;
border-radius: 25px;
}
#denglu{
background-color: pink;
border-radius:10px;
border:0;/*边框宽度0*/
height:50px;
width:90px;
padding:5px 10px;/*上下填充10 左右5*/
font-size: 20px;
}
#zhuce{
background-color: pink;
border-radius:10px;
border:0;/*边框宽度0*/
height:50px;
width:90px;
padding:5px 10px;/*上下填充10 左右5*/
font-size: 20px;
}
#content h1{
color: white;
font-size: 50px;
}
</style>
</head>
<body background="img/bg.png">
<div id="title">
<svg t="1585894995769" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3410" width="50" height="50"><path d="M0 0h1024v1024H0z" fill="#FFFFFF" p-id="3411"></path><path d="M212 80c-44.112 0-80 35.888-80 80v704c0 44.112 35.888 80 80 80h600c44.112 0 80-35.888 80-80V160c0-44.112-35.888-80-80-80H212m0-80h600c88.366 0 160 71.634 160 160v704c0 88.366-71.634 160-160 160H212c-88.366 0-160-71.634-160-160V160c0-88.366 71.634-160 160-160z" fill="#707070" p-id="3412"></path><path d="M322 12v1000a12 12 0 0 1-12 12h-56a12 12 0 0 1-12-12V12a12 12 0 0 1 12-12h56a12 12 0 0 1 12 12z" fill="#707070" p-id="3413"></path><path d="M678 80v199.11h88V80h-88m-60-60h208v283.652c0 19.582-17.908 35.458-40 35.458h-128c-22.092 0-40-15.876-40-35.458V20z" fill="#707070" p-id="3414"></path></svg>
程序瓜
</div>
<div id="content">
<h1 >Welcome</h1><br />
<form action="1.php"method="post" >
<input type="text" name="username" id="userid" placeholder="请输入账号" /><br /><br />
<input type="password" name="password" id="password" placeholder="请输入密码" /><br /><br />
<input type="password" name="repassword" id="password" placeholder="请确认密码" /><br /><br />
<input type="submit" name="denglu" id="denglu" value="注册" /> <a href="zc.html" target="_blank"><input type="button" name="zhuce"id="zhuce"value="登录"/></a>
</form></div>
</body>
</html>
1.php获取
一、 判断重复密码
由于有重复密码,如果用户两次输入的密码不一致也就是有没有进行下一步的任何意义。
在网页中很多地方还是使用到了重复密码。因为,害怕的是用户产生手误。将密码填写出错。
用户在输入密码的时候可能在左右两边多打两个空格。因此,我们会使用trim将密码和重复密码的两边去掉空格。
if(trim($_POST['password']) != trim($_POST['repassword'])){
exit('两次密码不一致,请返回上一页');
}
二、 准备好写入的数据
我们需要把用户的输入数据和隐藏的数据都写入到数据库。
可见数据有:
变量 | 说明 |
---|---|
$_POST[‘username’] | 用户名 |
$_POST[‘password’] | 密码 |
我们需要把用户名去掉两边的空格,这样避免输入不必要的这些信息。
在mysql这一章节我们讲过,用户的密码不要让包括公司内部人员可见。保证密码是不可逆向的。在初级阶段大家学习一下MD5即可。以后我们再教大家其他的加密方式。
不可见数据有:
变量 | 说明 |
---|---|
$time | 用户的注册时间 |
$_SERVER[‘REMOTE_ADDR’] | 用户的注册IP |
1.time返回的unix时间戳
2.REMOTE_ADDR返回的是IP地址,我们可以用ip2long将其转为整型存储。
$username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$time = time();
$ip = ip2long($_SERVER['REMOTE_ADDR']);
三、连接数据库、判断错误、选择库和字符集
1.我们使用mysqli_connect连接到数据库服务器。
2.如果有错误,使用mysqli_errno得到错误号
3.如何时存在错误mysqli_error打印出所有的错误,并且退出程序执行
4.选择数据库并且设置字符集为utf8.
//连接数据库
$conn = mysqli_connect('localhost','','');
//如果有错误,存在错误号
if(mysqli_errno($conn)){
echo mysqli_error($conn);
exit;
}
mysqli_select_db($conn,'user');
mysqli_set_charset($conn,'utf8');
四、组合SQL语句
我们需要把得到的信息写入到数据库里面去,用户名、密码、创建时间、IP我们都得到了。
将对应的变量插入到SQL语句中即可。组合出来的SQL语句如下:
$sql = "insert into user(username,password,createtime,createip) values('" . $username . "','" . $password . "','" . $time . "','" . $ip . "')";
而我们的创建表的语句如下:
CREATE TABLE IF NOT EXISTS user (
id int(11) NOT NULL,
username varchar(30) NOT NULL,
password char(32) NOT NULL,
time int(11) NOT NULL,
ip int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表的格式(字段对应说明):
id | username | password | time | ip |
---|---|---|---|---|
用户编号 | 用户名 | 密码 | 创建时间 | 创建IP |
五、发送语句,判断状态
mysqli_query我们在上面说过,需要传入两个参数:
连接的资源,在这里对应的变量是$conn。
发送的SQL语句。在上面已经准备好了$sql。
SQL语句可以通过mysqli_query发送给MySQL服务器。发送成功$result则为true。否则为false。
成功的话,我们就可以提示用户注册成功啦。
有些情况下,可能还需要使用到mysqli_insert_id()。在这里把自增的主键ID打印出来。
大家记住这个知识点,避免以后需要的时候忘记了。
mysqli_insert_id应用场景:新加的一个行的数据。我们需要得到自动增长的ID值,将这个ID值插入到另外一个表里面去时。就需要用到这个函数。
$result = mysqli_query($conn,$sql);
if($result){
echo '注册成功';
}else{
echo '注册失败';
}
echo '当前用户插入的ID为'.mysqli_insert_id($conn);
五、关闭数据库连接
将资源变量传到到mysqli_close这个函数里面即可。
mysqli_close($conn);
用户注册的基本实现代码就写完了。我们上面讲的都是代码片段。
我们整实现的connect.php代码如下:
<?php
if (trim($_POST['password']) != trim($_POST['repassword'])) {
exit('两次密码不一致,请返回上一页');
}
$username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$time = time();
$ip = $_SERVER['REMOTE_ADDR'];
$conn = mysqli_connect('localhost', 'root', 'liwenkaihaha');
//如果有错误,存在错误号
if (mysqli_errno($conn)) {
echo mysqli_error($conn);
exit;
}
mysqli_select_db($conn, 'book');
mysqli_set_charset($conn, 'utf8');
$sql = "insert into user(username,password,createtime,createip) values('" . $username . "','" . $password . "','" . $time . "','" . $ip . "')";
$result = mysqli_query($conn, $sql);
if ($result) {
echo '成功';
} else {
echo '失败';
}
echo '当前用户插入的ID为' . mysqli_insert_id($conn);
mysqli_close($conn);
?>
全部
1.php
<?php
if(trim($_POST['password']) != trim($_POST['repassword'])){
exit('两次密码不一致,请返回上一页');
}
//确认两个密码都一样就进行下一步
$username=trim($_POST['username']);
//MD5加密密码
$password=md5(trim($_POST['password']));
//获取注册时间
$time=time();
//当前服务器的地址也就是访问的地址
$ip=$_SERVER['REMOTE_ADDR'];
//连接数据库
$conn=mysqli_connect("localhost","","");
//判断是否能连接该数据库
//如果不能连接输出 echo mysql_error($conn);
//如果可以连接就不用继续判断了
if(mysqli_errno($conn)){
echo mysqli_error($conn);
exit;
}
//当数据库连接成功后
//再连接数据库里面的库
mysqli_select_db($conn,'');
//字符集
mysqli_set_charset($conn,'utf8');
//制定一个sql写入语句
$sql="insert into users(username,password,time,ip) values('".$username."','".$password."','" . $time . "','" . $ip . "')";
//执行sql语句
$result=mysqli_query($conn,$sql);
//判断是否执行成功
if($result){
echo'成功';
}else{
echo '失败';
}
//返回注册用户的id
echo '当前用户id为'.mysqli_insert_id($conn);
//关闭数据库连接
mysqli_close($conn);
?>
2.php
<!DOCTYPE >
<html>
<html lang="ch">
<head>
<meta charset="utf-8">
<title>程序瓜</title>
<style type="text/css">
#title{
font-family:"新宋体";
position: absolute;
color: brown;
font-size: 60px;
text-align-last: center;
left: 40%;
top: 10%;
}
#content{
position: absolute;
top: 50%;/*顶部到元素*/
left:30%;
width: 40%;
height:400px;
margin-top:-200;/*边缘到底部*/
background-color: #34495e;
text-align-last: center;
/*这里做一个半透明效果*/
filter:alpha(Opacity=60);
-moz-opacity:0.8;
opacity: 0.8;
}
#userid{
color: #3498db;
font-size: 30px;
text-align: center;
border-radius: 25px;/*边框圆角*/
}
#password{
color: #3498db;
font-size: 30px;
text-align: center;
border-radius: 25px;
}
#denglu{
background-color: pink;
border-radius:10px;
border:0;/*边框宽度0*/
height:50px;
width:90px;
padding:5px 10px;/*上下填充10 左右5*/
font-size: 20px;
}
#zhuce{
background-color: pink;
border-radius:10px;
border:0;/*边框宽度0*/
height:50px;
width:90px;
padding:5px 10px;/*上下填充10 左右5*/
font-size: 20px;
}
#content h1{
color: white;
font-size: 50px;
}
</style>
</head>
<body background="img/bg.png">
<div id="title">
<svg t="1585894995769" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3410" width="50" height="50"><path d="M0 0h1024v1024H0z" fill="#FFFFFF" p-id="3411"></path><path d="M212 80c-44.112 0-80 35.888-80 80v704c0 44.112 35.888 80 80 80h600c44.112 0 80-35.888 80-80V160c0-44.112-35.888-80-80-80H212m0-80h600c88.366 0 160 71.634 160 160v704c0 88.366-71.634 160-160 160H212c-88.366 0-160-71.634-160-160V160c0-88.366 71.634-160 160-160z" fill="#707070" p-id="3412"></path><path d="M322 12v1000a12 12 0 0 1-12 12h-56a12 12 0 0 1-12-12V12a12 12 0 0 1 12-12h56a12 12 0 0 1 12 12z" fill="#707070" p-id="3413"></path><path d="M678 80v199.11h88V80h-88m-60-60h208v283.652c0 19.582-17.908 35.458-40 35.458h-128c-22.092 0-40-15.876-40-35.458V20z" fill="#707070" p-id="3414"></path></svg>
程序瓜
</div>
<div id="content">
<h1 >Welcome</h1><br />
<form action="1.php"method="post" >
<input type="text" name="username" id="userid" placeholder="请输入账号" /><br /><br />
<input type="password" name="password" id="password" placeholder="请输入密码" /><br /><br />
<input type="password" name="repassword" id="password" placeholder="请确认密码" /><br /><br />
<input type="submit" name="denglu" id="denglu" value="注册" /> <a href="zc.html" target="_blank"><input type="button" name="zhuce"id="zhuce"value="登录"/></a>
</form></div>
</body>
</html>
php数据库操作之通过步骤做一个列表显示
我们来做一个后台的用户列表展示。在实际的管理过程当中,我们通过后台,可以个修改用户的密码和用户的相关资料。
在后台需要将所有用户以表格的形式展示出来就是用户列表。
一、连接数据库、判断错误和设置字符集
连接、错误判断和字符集选择都在上面已经讲过。老规矩,第一步使用mysqli_connect连接数据库。在第一节我们讲过,可以在第四个参数中加上库选择。就可以不用使用mysqli_select_db函数在后面再次选择一个数据库了。
返回的类型就是一个连接资源。我们在mysqli_errno、mysqli_error和mysqli_set_charset都要传入资源,才能确定我们操作的是哪个连接。
$conn = mysqli_connect('localhost', 'root', 'secret', 'book');
if (mysqli_errno($conn)) {
mysqli_error($conn);
exit;
}
mysqli_set_charset($conn, 'utf8');
二、准备并发送SQL语句
我们需要查询的的将候将用户ID,用户名、时间和IP都查出来。并且使用order by id 进行降序排序。
按照人的思维人们一般喜欢看最新注册的一批用户。而ID自增,也就是ID在越大,就是时间注册越新的用户。因此我们在写SQL语句的时写上的是order
by id desc。
$sql = "select id,username,createtime,createip from user order by id desc";
$result = mysqli_query($conn, $sql);
三、判断结果
查询出来的结果只要SQL语句正确结果变量 r e s u l t 就为真。因此,在实现的时候我们需要多加一步判断,不仅判断 result就为真。因此,在实现的时候我们需要多加一步判断,不仅判断 result就为真。因此,在实现的时候我们需要多加一步判断,不仅判断result。而且,判断查询出来的行数。
查询出来的行数可以使用mysqli_num_rows。这个函数要求传入$result查询的结果变量。
如果有结果则显示列表,如果没有结果我们产生一句提示即可。
代码片段如下:
if($result && mysqli_num_rows($result)){
//显示列表代码段
}else{
//提示没有结果的代码段
}
四、循环显示数据
所有结果我们需要使用列表的形式展示出来。表格的行和列和数据表的行和列是一样的。所示展示起来很方便。
先声明一个表格,每次循环的时候输出一行。将结果展示到各个列里面。
使用到的函数是mysqli_fetch_assoc,返回的会是一个关联数组。
这个函数读取一个结果集,会向后移动一次。读取到最后没有结果的时候会返回bool值的false。因此,我们选择while来配合mysqli_fetch_assoc。
每次循环的结果赋值给 r o w , row, row,row中是关联数组。因此我在这次循环中,可以将行和列都显示出来。
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '</tr>';
}
echo '</table>';
五、增加编辑和删除控制
1.在删除的时候我们分为单选删除和多选删除。
2.而编辑的时候,我们会选择一个用户
我们在上一步的代码中增加几个小东西就在页面中实现了删除和编编。
我们来看看实际的效果图,来推理具体的实现过程,效果如下:
在实现过程当中有几个要点:
1.单选择删除和编辑时需使用get方法传入ID,我们才知道要编辑或者删除的是哪个用户。
2.多选删除时,需要使用传入多个用户。因此,我们可以使用form表单,使用post方法来提交这批用户ID。
单选删除我们可以在delete.php后面我们跟上?加上id和值就点击时进行删除请求即可。
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
编辑用户也是同理,我们在edit.php加上?写上id和值,点击时就知道是需要编辑的哪个用户了。
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
而多选删除,我们需要使用到html中的checkbox,传入多个用户ID的时候需要在name 后加上id[]。使用form表单将表格包起来,在表格外加上一个submit标签就实现了多选删除。
<form action="delete.php" method="post">
echo '<td><input type="checkbox" name="id[]" value="' . $row['id'] . '" /></td>';
echo '<input type="submit" value="删除" />';
echo '</form>';
代码如下:
echo '<form action="delete.php" method="post">';
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td><input type="checkbox" name="id[]" value="' . $row['id'] . '" /></td>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
echo '</tr>';
}
echo '</table>';
echo '<input type="submit" value="删除" />';
echo '</form>';
六、关闭数据库连接
我们操作完数据库,关闭掉这个数据库连接。
mysqli_close($conn);
我们整实现的用户列表list.php代码如下:
<?php
$conn = mysqli_connect('localhost', '', '', '');
if (mysqli_errno($conn)) {
mysqli_error($conn);
exit;
}
mysqli_set_charset($conn, 'utf8');
$sql = "select id,username,time,ip from users order by id desc";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
echo '</tr>';
}
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
?>
php数据库操作之把用户做个分页[自己看]
在真实的项目中,我们是将主机、用户名、密码、库都写在配置文件当中。
如果在代码中写死了,万一数据库服务器的相关信息发生变化了,要把所有代码修改一次显然不符合程序员的思维。
此外,在每一个需要连接数据库的页面中。我们都需要写上连接、判断错误、设置字符集、太过于麻烦。并且不利于重复使用这些代码。
我们可以用上之前讲过的include系列函数达成目标。示例图如下:
因此,我们可以做一个配置文件config.php。将需要使用到的配置全部设置为常量,代码如下:
<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
define('DB_PWD', 'secret');
//库名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
?>
我们将connection.php页面抽取出来,以后需要连接数据库的时候只需要包含connection.php文件即可。代码如下:
<?phpinclude 'config.php';$conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);if (mysqli_errno($conn)) { mysqli_error($conn); exit;}mysqli_set_charset($conn, DB_CHARSET);
?>
我们在以后每个文件使用中直接包含 connection.php文件就可以实现数据库连接了:
include ‘connection.php’;
把上面的准备工作完成,接下来完成分页。分页效果如下:
页要实现分页中包含以下几个基本元素:
元素 | 说明 | 备注 |
---|---|---|
首页 | 最开始进入到页面的第一页 | 用get传参才进去时默认为1 |
上一页 | 当前页减1 | 如果页码为第一页时减1,为应该为第一页 |
下一页 | 当前页加1 | 如果为最后一 |
尾页 | 最后一页 | 总条数除以每页显示数得到总页数 |
当前页 | 当前所在的页码 | 就是当前的页码 |
总页数 | 一共有多少个页面 | 总条数除以每页显示数 |
我们在控制页码的时候,都是通过URL地址栏传入页码值来实现的页码控制。在page.php后面接上页码的相关信息,我们就能够算出更多的有效信息。url控制分页的效果如下:
在代码实现中,是通过limit后的偏移量(offset)和数量(num),这两个值真正实现的分页。
limit offset , num
页码 | url中get值 | limit偏移量,数量 |
---|---|---|
第1页 | 1 | 0,5 |
第2页 | 2 | 5,5 |
第3页 | 3 | 10,5 |
第n页 | n | (n-1)*5,5 |
假设每页显示5条。最终得到的分页中控制limit公式如下:
offset的值为 (n-1)*5
num 为规定的5
我们通过代码来实现业务:
一、计算出分页所需的参数
总数
通过查询user表的count(id),得到总数$count。
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
当前页
刚进入page.php页时,url为http://www.php.com/page.php,后面是不存在 ?page=1 页面标识号的。
因此我们需要手动创建一个页面标识号传给当前页码变量$page。
我们害怕用户传的页面中存在小数等,所以我们做一次强制的类型转换:(int) $_GET[‘page’]。
第一种写法:
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
第二种写法
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
最后一页
每一页一定是一个整数。就跟小学的时候数学一样。平均有5.6个人应该准备几个苹果。答案一定是6个。
如果页面出来了20.3个页面,一定是使用进一法取整函数ceil。让分页数变为21。
我们用总数除以每页显示的数据条数,就得到了总页数了。
//每页显示数
$num = 5;
$total = ceil($count / $num);
上一页、下一页异常情况控制
如果用户的在第一页点击了上一页,在最后一页点击了下一页怎么办呢?
这样的话数据会超出范围,而造成我们分页时无数据显示。
显然这种异常情况需要考虑到。因此,如果在分页时在第一页减一时,我们就让他为第一页。
在最后一页加一时,我们就让他为最后一页,即完成了异常控制。
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
二、SQL语句
我们之前说过分页的核心是通过SQL语句中的offset和num来控制每页显示数。
我们在上面还列了具体的公式,我们将公司转化为代码如下:
$num = 5;
$offset = ($page - 1) * $num;
我们将 n u m 和 num和 num和offset应用于SQL语句中:
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
控制好URI中的分页值
echo '<tr>
<td colspan="5">
<a href="page.php?page=1">首页</a>
<a href="page.php?page=' . ($page - 1) . '">上一页</a>
<a href="page.php?page=' . ($page + 1) . '">下一页</a>
<a href="page.php?page=' . $total . '">尾页</a>
当前是第 ' . $page . '页 共' . $total . '页
</td>
</tr>';
我们最后将整体业务串联起来实现最终效果,代码如下:
<?php
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
$page = (int) $_GET['page'];
} else {
$page = 1;
}
*/
//每页显示数
$num = 5;
//得到总页数
$total = ceil($count / $num);
if ($page <= 1) {
$page = 1;
}
if ($page >= $total) {
$page = $total;
}
$offset = ($page - 1) * $num;
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
//存在数据则循环将数据显示出来
echo '<table width="800" border="1">';
while ($row = mysqli_fetch_assoc($result)) {
echo '<tr>';
echo '<td>' . $row['username'] . '</td>';
echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
echo '<td>' . long2ip($row['createip']) . '</td>';
echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
echo '</tr>';
}
echo '<tr><td colspan="5"><a href="page.php?page=1">首页</a> <a href="page.php?page=' . ($page - 1) . '">上一页</a> <a href="page.php?page=' . ($page + 1) . '">下一页</a> <a href="page.php?page=' . $total . '">尾页</a> 当前是第 ' . $page . '页 共' . $total . '页 </td></tr>';
echo '</table>';
} else {
echo '没有数据';
}
mysqli_close($conn);
?>
php数据库操作之 批量和指定删除用户[自己看]
判断是单选还是多选删除
1.单行是通过get传参的方式向delete.php文件中写上对应的ID。
2.而多个删除是通过POST的方式向delete.php页面中传递对应的ID。
3.如果这两个都不符合的话,那我们可以视为数据不合法。
if (is_array($_POST['id'])) {
$id = join(',', $_POST['id']);
} elseif (is_numeric($_GET['id'])) {
$id = (int) $_GET['id'];
} else {
echo '数据不合法';
exit;
}
组合SQL语句
我们之前给大家在MySQL这一章时讲解过删除时可以使用到in的子语句。
同样在这里,我们就可以用in的子语句来达到效果。
join函数将多选删除传过来的id变为了3,4,5的格式,最终多选删除的SQL语句执行出来的效果就是:
delete from user where id in(3,4,5,6,8);
而单选删除的语句效果就是:
delete from user where id in(3)
这样我们就实现了单选和多选自适应效果。
$sql = "delete from user where id in($id)";
最终配套而成的整体代码演示如下:
<?php
if (is_numeric($_GET['id'])) {
$id = (int) $_GET['id'];
}
$conn = mysqli_connect('localhost', '', '', '');
$sql = "select id,username from users where id = " . $id;
$result = mysqli_query($conn, $sql);
$data = mysqli_fetch_assoc($result);
?>
<form action="8.php" method="post">
用户名:<input type="text" name="username" value="<?php echo $data['username'];?>"><br />
密码:<input type="password" name="password"><br />
<input type="hidden" value="<?php echo $data['id'];?>" name="id" />
<input type="submit" value="提交">
</form>
<?php
mysqli_close($conn);
?>
<?php
$conn = mysqli_connect('localhost', '', '', '');
$id = (int) $_POST['id'];
if (trim($_POST['password'])) {
$password = md5(trim($_POST['password']));
$sql = "update user set passwords='" . $password . "' where id = $id";
} else {
echo '修改成功';
}
$result = mysqli_query($conn, $sql);
if ($result) {
echo '修改成功';
}
PHP数据库编辑功能
<?php
if (is_numeric($_GET['id'])) {
$id = (int) $_GET['id'];
}
$conn = mysqli_connect('localhost', '', '', '');
$sql = "select id,username from users where id = " . $id;
$result = mysqli_query($conn, $sql);
$data = mysqli_fetch_assoc($result);
?>
<form action="8.php" method="post">
用户名:<input type="text" name="username" value="<?php echo $data['username'];?>"><br />
密码:<input type="password" name="password"><br />
<input type="hidden" value="<?php echo $data['id'];?>" name="id" />
<input type="submit" value="提交">
</form>
<?php
mysqli_close($conn);
?>
<?php
$conn = mysqli_connect('localhost', '', '', '');
$id = (int) $_POST['id'];
if (trim($_POST['password'])) {
$password = md5(trim($_POST['password']));
$sql = "update users set passwords='" . $password . "' where id = $id";
} else {
echo '修改成功';
}
$result = mysqli_query($conn, $sql);
if ($result) {
echo '修改成功';
}