PHP向MySQL发送数据、PHP操作MySQL数据库是重点中的重点。
为大家举一些例子:
- 要注册一个用户,是将表单的数据POST发送给PHP写入数据库
- 购买一个商品,是将商品信息和用户信息通过PHP写入到数据库
- 在线付费,是将用户的充值信息通过PHP写入数据库
- 修改头像上传的头像地址得到后,通过PHP修改数据库里头像字段的值
注意:
从PHP7开始默认不再支持mysql扩展,即不再支持mysql_*系列函数。请使用mysqli连接数据库。
mysqli即支持php5也支持php7。
一、数据库连接步骤
第一步:连接数据库服务器
类型
说明
函数
mysqli_connect
功能
连接到mysql数据库服务器
参数1
主机
参数2
数据库服务器登陆名
参数3
密码
参数4
数据库的名称
参数5
数据库服务器端口不填默认3306
若参数4,数据库名称在此步已填并择,不需要执行第三步。
第二步:判断错误
类型
说明
函数
mysqli_errno
功能
返回连接错误号,无错误返回0
参数1
传入mysqli_connect返回的资源
类型
说明
函数
mysqli_error
功能
返回连接错误字符串
参数1
传入mysqli_connect返回的资源
第三步:选择数据库
类型
说明
函数
mysqli_select_db
功能
选择本连接中的数据库
参数1
传入mysqli_connect返回的资源
参数2
需要连接的数据库名
若在第一步已填数据库,不需要更换成其他数据库,则不需要执行第三步。
第四步:设置字符集
类型
说明
函数
mysqli_set_charset
功能
设置与mysql服力器连接,结果,校验字符集
参数1
传入mysqli_connect返回的资源
参数2
字符集类型
第五步:准备SQL语句
其实就是一个SQL语句字符集。
第六步:发送SQL语句
类型
说明
函数
mysqli_query
功能
发送SQL语句
参数1
传入mysqli_connect返回的资源
参数2
传入发送的SQL语句
SQL语句准备完成,需要通过mysqli_query将SQL语句发送给MySQL服务器。
第七步:判断是否执行正常或者遍历数据
第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
传入查询出来的结果变量
第八步:关闭数据库
类型说明函数mysqli_close功能关闭数据库连接参数1传入mysqli_connect返回的资源
数据库连接是一个资源类型。我们在之前的章节中讲解资源类型的时候跟大家说过。凡是涉及到数资源类型的有打开就有关闭。这样能够保证PHP更高效的处理和回收资源。
因此,数据库连接成功后,不需要使用的时候。我们可以关闭这个连接。
注意:
mysqli只学过程化的方法即可。在面向对象阶段实际工作中完全抛弃了mysqli的对象用法,而是使用的是PDO对象连接数据库的方式。
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文件即可。代码如下:
<?php
include '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),这两个值真正实现的分页。
页码
url中get值
limit偏移量,数量
第1页
1
0,5
第2页
2
5,5
第3页
3
10,5
第n页
n
(n-1)*5,5
我们通过代码来实现业务:
(1)计算出分页所需的参数
(2)SQL语句
我们之前说过分页的核心是通过SQL语句中的offset和num来控制每页显示数。
我们在上面还列了具体的公式,我们将公司转化为代码如下:
$num = 5;
$offset = ($page - 1) * $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>';
我们最后将整体业务串联起来实现最终效果,代码如下:
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数据库操作之数据显示乱码终极解决办法
php连接mysql乱码是开发过程当中,这是开发中新手经常遇到的问题。 根据实际大家遇到的问题,将乱码的问题,总结成了9个要点来彻底解决连接后乱码的问题。
解决乱码问题的核心思想,就是:一定要多个不同的文件系统中一定要统一编码。
这9个要点分别是:
1.html编码与MySQL编码一致
2.PHP编码与MySQL编码一致
3.若有header头发送字符集,请与数据库一样
4.<meta http-equiv=“Content-Type”content=“text/html; charset=utf-8” />要和页面的文字编码一致
5.数据库建库的字符集要统一
6.表的字符集要统一
7.列的字符集要统一(表设了,列就默认写表的)
8.连接,校验的字符集要统一
9.结果集的字符集要统一