PHP操作mysql数据库

Stella981
• 阅读 525

PHP向MySQL发送数据、PHP操作MySQL数据库是重点中的重点。

为大家举一些例子:

  1. 要注册一个用户,是将表单的数据POST发送给PHP写入数据库
  2. 购买一个商品,是将商品信息和用户信息通过PHP写入到数据库
  3. 在线付费,是将用户的充值信息通过PHP写入数据库
  4. 修改头像上传的头像地址得到后,通过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系列函数达成目标:

PHP操作mysql数据库

因此,我们可以做一个配置文件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';

把上面的准备工作完成,接下来完成分页。分页效果如下:

PHP操作mysql数据库

页要实现分页中包含以下几个基本元素:

元素

说明

备注

首页

最开始进入到页面的第一页

用get传参才进去时默认为1

上一页

当前页减1

如果页码为第一页时减1,为应该为第一页

下一页

当前页加1

如果为最后一

尾页

最后一页

总条数除以每页显示数得到总页数

当前页

当前所在的页码

就是当前的页码

总页数

一共有多少个页面

总条数除以每页显示数

我们在控制页码的时候,都是通过URL地址栏传入页码值来实现的页码控制。在page.php后面接上页码的相关信息,我们就能够算出更多的有效信息。url控制分页的效果如下:

PHP操作mysql数据库

在代码实现中,是通过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.结果集的字符集要统一

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这