一. 数据库连接步骤
将数据库连接整理成了最重要的8个步骤,我戏称它为:“数据库连接天龙八步”。😊 (。・∀・)ノ
第一步: 连接数据库服务器
[PHP mysql_connect() 函数]类型 | 说明 |
---|---|
函数 | mysqli_connect() |
函数原型 | mysql_connect(server,user,pwd,newlink,clientflag) |
功能 | 连接到mysql数据库服务器 |
返回值 | 如果成功,则返回一个 MySQL 连接标识,失败则返回 FALSE。 |
参数1 | 主机 |
参数2 | 数据库服务器登陆名 |
参数3 | 密码 |
参数4 | 数据库的名称 |
参数5 | 数据库服务器端口不填默认3306 |
对于参数4,数据库名称在此步已填并择,不需要执行第三步。
第二步: 判断错误
[PHP mysqli_errno() 函数]类型 | 说明 |
---|---|
函数 | mysqli_errno(connection) |
功能/返回值 | 返回连接错误号,无错误返回0 |
参数1 | 传入mysqli_connect()返回的资源可选。规定 SQL 连接标识符。如果未规定,则使用上一个 打开的连接。 |
如果mysqli_errno()函数返回错误号,则用mysqli_error()显示文本错误信息。 [PHP mysql_error() 函数]
类型 | 说明 |
---|---|
函数 | mysqli_error(connection) |
功能/返回值 | 返回连接错误字符串,如果没有出错则返回 ‘’(空字符串) |
参数1 | 传入mysqli_connect返回的资源 |
第三步: 选择数据库
[PHP mysqli_select_db() 函数]类型 | 说明 |
---|---|
函数 | mysql_selecti_db(connection,database) |
返回值 | 如果成功,则该函数返回 true。如果失败,则返回 false。 |
功能 | 选择本连接中的数据库 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 需要连接的数据库名 |
若在第一步已填数据库,不需要更换成其他数据库,则不需要执行第三步。
第四步: 设置字符集
[PHP mysqli_set_charset 函数]类型 | 说明 |
---|---|
函数 | mysqli_set_charset(connection,charset) |
功能 | 设置与mysql服力器连接,结果,校验字符集 |
返回值 | 无返回值 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 字符集类型 |
第五步: 准备SQL语句
其实就是一个SQL语句的字符串,用于对MySQL数据库的操作。这一步很重要!
例如:
<?php
$sql = "insert into user(username,password) values('$username','$password')";
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// some code
?>
- 我们通常要把变量赋值在SQL语句中使用。可是变量或者SQL语句出错了,非常不好排查。
- 我们根据实际工作经验增加了这一步。
- 如果在执行此步的时候报错了,我们可以把SQL语句打印出来,粘贴到phpMyAdmin或者相关工具中。
- 排错时,如果执行成功就说明不是SQL语句的问题。如果执行失败,请仔细检查SQL语句。
第六步: 发送SQL语句
[PHP mysqli_query() 函数]类型 | 说明 |
---|---|
功能 | 发送SQL语句,执行一条 MySQL 查询。 |
返回值 | mysqli_query() 仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符, 如果查询执行不正确则返回 FALSE。 |
参数1 | 传入mysqli_connect返回的资源 |
参数2 | 传入发送的SQL语句。注意:查询字符串不应以分号结束。 |
- SQL语句准备完成,需要通过mysqli_query将SQL语句发送给MySQL服务器。
- MySQL服务器会执行发送过来的SQL语句进行执行。
第七步: 判断是否执行正常或者遍历数据
[PHP mysqli_fetch_array() 函数]读取第6步中,发送的是select类别的语句,通常需要将结果以数组形式输出显示出来。就需要用到遍历显示数据的函数。
类型 | 说明 |
---|---|
函数 | mysqli_fetch_array(data,array_type) |
功能 | 得到result结果集中的数据,返回数组进行遍历 |
参数1 | 可选。规定要使用的数据指针。该数据指针是 mysqli_query() 函数产生的结果。 |
参数2 | 可选。规定返回哪种结果。可能的值: MYSQL_ASSOC - 关联数组 MYSQL_NUM - 数字数组 MYSQL_BOTH - 默认。同时产生关联和数字数组 |
下面举例几个常用的将mysqli_query()查询得到的字符串处理成数组的函数…….
函数 | 功能 |
---|---|
mysqli_fetch_assoc(data) | 返回根据从结果集取得的行生成的关联数组,如果没有更多行,则返回 false |
mysqli_fetch_row(data) | 返回根据从结果集取得的行生成的索引数组,如果没有更多行,则返回 false |
mysqli_fetch_object(data) | 从结果集(记录集)中取得一行作为对象。 若成功的话,本函数从 mysql_query() 获得一行,并返回一个对象。如果失败 或没有更多的行,则返回 false。 |
mysqli_num_rows(data) | 返回结果集中行的数目。此命令仅对 SELECT 语句有效。 要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目, 用 mysqli_affected_rows()。 |
mysqli_fetch_field | 从结果集中取得列信息并作为对象返回。 |
第八步: 关闭数据库
[PHP mysql_close() 函数]类型 | 说明 |
---|---|
函数 | mysqli_close(link_identifier) |
功能 | 关闭数据库连接 |
返回值 | 如果成功则返回 true,失败则返回 false。 |
参数1 | 传入mysqli_connect返回的资源 |
其他:显示服务器信息函数
类型 | 说明 |
---|---|
函数 | mysqli_get_server_info |
功能 | 返回服务器信息 |
参数1 | 传入mysqli_connect返回的资源 |
类型 | 说明 |
---|---|
函数 | mysqli_get_server_version |
功能 | 返回服务器版本 |
参数1 | 传入mysqli_connect返回的资源 |
注意:
mysqli只学过程化的方法即可。在面向对象阶段实际工作中完全抛弃了mysqli的对象用法,而是使用的是PDO对象连接数据库的方式。
二. 通过步骤做一个用户注册实例
我们做一个最简单的注册页面。注册页面中有三个参数:
- 用户名
- 密码
- 重复密码
- 用户写好三个参数后,点击提交的时候向
connect.php
页面中传入POST记录。- 我们可以把
POST记录
处理后写入到MySQL数据库中,即完成了用户注。
本例用到的两个文件:
index.php
:表单页面;connect.php
:处理表单的页面。
一、 判断重复密码:
1.由于有重复密码,如果用户两次输入的密码不一致也就是有没有进行下一步的任何意义。
2.在网页中很多地方还是使用到了重复密码。因为,害怕的是用户产生手误。将密码填写出错。
3.用户在输入密码的时候可能在左右两边多打两个空格。因此,我们会使用trim将密码和重复密码的两边去掉空格。
代码如下:
if(trim($_POST['password']) != trim($_POST['repassword'])){
exit('两次密码不一致,请返回上一页');
}
二、 准备好写入的数据:
我们需要把用户的输入数据和隐藏的数据都写入到数据库。
可见数据有:
变量 | 说明 |
---|---|
$_POST[‘username’] | 用户名 |
$_POST[‘password’] | 密码 |
不可见数据有:
- 我们需要把用户名去掉两边的空格,这样避免输入不必要的这些信息。
- 在mysql这一章节我们讲过,用户的密码不要让包括公司内部人员可见。保证密码是不可逆向的。在初级阶段大家学习一下MD5即可。以后我们再教大家其他的加密方式。
变量 | 说明 |
---|---|
$time | 用户的注册时间 |
$_SERVER[‘REMOTE_ADDR’] | 用户的注册IP |
- time返回的unix时间戳
- REMOTE_ADDR返回的是IP地址,我们可以用ip2long将其转为整型存储。
$username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$time = time();
$ip = ip2long($_SERVER['REMOTE_ADDR']);
三、连接数据库、判断错误、选择库和字符集:
- 我们使用mysqli_connect连接到数据库服务器。
- 如果有错误,使用mysqli_errno得到错误号
- 如何时存在错误mysqli_error打印出所有的错误,并且退出程序执行
- 选择数据库并且设置字符集为utf8.
//连接数据库
$conn = mysqli_connect('localhost','root','liwenkaihaha');
//如果有错误,存在错误号
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,
createtime int(11) NOT NULL,
createip int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表的格式(字段对应说明):
id | username | password | createtime | createip |
---|---|---|---|---|
用户编号 | 用户名 | 密码 | 创建时间 | 创建IP |
五、发送语句,判断状态:
mysqli_query我们在上面说过,需要传入两个参数:
- 连接的资源,在这里对应的变量是$conn。
- 发送的SQL语句。在上面已经准备好了$sql。
SQL语句可以通过mysqli_query发送给MySQL服务器。发送成功$result则为true。否则为false。
成功的话,我们就可以提示用户注册成功啦。
有些情况下,可能还需要使用到mysqli_insert_id()。功能是获取上面通过insert插入数据的id并返回这个id。
mysqli_insert_id应用场景:新加的一个行的数据。我们需要得到自动增长的ID值,将这个ID值插入到另外一个表里面去时。就需要用到这个函数。
mysqli_insert_id()
使用举例:
$result = mysqli_query($conn,$sql);
if($result){
echo '注册成功';
}else{
echo '注册失败';
}
echo '当前用户插入的ID为'.mysqli_insert_id($conn);
六、关闭数据库连接:
将资源变量传到到mysqli_close这个函数里面即可。
mysqli_close($conn);
先建立test数据库、user数据表。数据表建立语句:
CREATE TABLE IF NOT EXISTS user (id int(11) PRIMARY KEY AUTO_INCREMENT,username varchar(30) NOT NULL,password char(32) NOT NULL,createtime int(11) NOT NULL,createip varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.
index.php
表单页面:
<form action="connect.php" method="post">
用户名:<input type="text" name="username"><br />
密码:<input type="password" name="password"><br />
重复密码:<input type="password" name="repassword"><br />
<input type="submit" value="提交">
</form>
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', '');
//echo $username."/".$password."/".$time."/".$ip;
//如果有错误,存在错误号
if (mysqli_errno($conn)) {
echo mysqli_error($conn);
exit;
}
mysqli_select_db($conn, 'test');
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 '失败';
var_dump("错误为:".mysqli_error($conn));
var_dump("返回值:".$result);
}
echo '当前用户插入的ID为' . mysqli_insert_id($conn);
mysqli_close($conn);
?>
三. 通过步骤做一个列表显示实例
[教程][视频]
四. 通过步骤操作之把用户做个分页
[教程][视频]
五. 批量和指定删除用户
上面已经学过了通过步骤做一个列表显示,在删除前,有单行删除数据和删除多行数据。
5.1 判断是单选还是多选删除
- 单行是通过get传参的方式向delete.php文件中写上对应的ID。
- 而多个删除是通过POST的方式向delete.php页面中传递对应的ID。
- 如果这两个都不符合的话,那我们可以视为数据不合法。
if (is_array($_POST['id'])) {
$id = join(',', $_POST['id']);
} elseif (is_numeric($_GET['id'])) {
$id = (int) $_GET['id'];
} else {
echo '数据不合法';
exit;
}
5.2 组合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
include 'connection.php';
if (is_array($_POST['id'])) {
$id = join(',', $_POST['id']);
} elseif (is_numeric($_GET['id'])) {
$id = (int) $_GET['id'];
} else {
echo '数据不合法';
exit;
}
$sql = "delete from user where id in($id)";
$result = mysqli_query($conn, $sql);
if ($result) {
echo '删除成功';
} else {
echo '删除失败';
}
?>
六. 通过步骤修改用户信息
内容有点多,等哪天想起来了或者心情好了再写吧…..(✿◡‿◡)
[教程][视频]
七. 数据显示乱码终极解决办法
解决乱码问题的核心思想,就是:一定要多个不同的文件系统中一定要统一编码。
总结成了9个要点来彻底解决连接后乱码的问题。
- html编码与MySQL编码一致
- PHP编码与MySQL编码一致
- 若有header头发送字符集,请与数据库一样
- <meta http-equiv=“Content-Type”content=“text/html; charset=utf-8” />要和页面的文字编码一致
- 数据库建库的字符集要统一
- 表的字符集要统一
- 列的字符集要统一(表设了,列就默认写表的)
- 连接,校验的字符集要统一
- 结果集的字符集要统一
html和PHP文件的编码,示例中:拿notepad++来演示。将PHP和html都要设为这种字符集。
一定要设置为utf-8无BOM格式。
二、 header头编码
如果php中有header头,一定要是utf-8的
header('content-type:text/html;charset=utf-8');
三、网页头文件编码
如果html文件编码是utf-8的也要设置为一置
<meta http-equiv=“Content-Type”content=“text/html; charset=utf-8” />
四、创建数据库的编码
五、表和列创建的时候表为utf-8
六、连接,结果、校验字符集设置
1.通过mysqli_set_charset(‘utf8’)来MySQL连接、结果和校验的字符集设置。
2.注:数据库的字符集声明和文件中的略有不同。utf8为mysql数据库的,utf-8为文件中使用的。