PHP操作mysql数据库

Posted 飞鱼0725

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP操作mysql数据库相关的知识,希望对你有一定的参考价值。

phpmysql发送数据、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系列函数达成目标:

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

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

2015-10-13_561c9c536b206.png

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

 

元素说明备注
首页 最开始进入到页面的第一页 用get传参才进去时默认为1
上一页 当前页减1 如果页码为第一页时减1,为应该为第一页
下一页 当前页加1 如果为最后一
尾页 最后一页 总条数除以每页显示数得到总页数
当前页 当前所在的页码 就是当前的页码
总页数 一共有多少个页面 总条数除以每页显示数

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

QQ截图20161114161938.png

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

以上是关于PHP操作mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

LAMP的基本配置

比较有用的php代码片段

linux中怎么查看mysql数据库版本

关于wamp的HTML, PHP, mysql 三者的操作与联系 - PHP与mysql

部分代码片段

php代码中的错误mysql更新命令