php操作MySQL数据库的方法和解析

对于许多web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储所有你想要检索和更新的任何信息

下面介绍两种数据库的访问方式:

①. MySQLi 访问MySQLi (面向对象)数据库,其中MYSQLi又分为 面向对象 和 面向过程两种形式

②. PDO访问MYSQL数据库

MySQLi 和 PDO那个更好???

MySQLi 和 PDO 各有优势

1.MySQLi只针对MySQL数据库,PDO支持12种数据库

2.两者都是面向对象, 但 MySQLi 还提供了 API 接口

3.两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。

下面实例来展示一下它们的不同之处:

先创建数据库和表

create database regist;

use database

CREATE TABLE `user` (
  `name` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

定义数据库连接所需的参数

<meta charset="utf-8">
<?php

    $dbtype="mysql";//使用的数据库类型
    $servername="localhost";//数据库服务器主机名
    $user="root";//数据库连接用户名
    $pass="root";//数据库连接密码
    $dbname="regist";//选用的数据库名
?>

1.MySQLi (面向对象) 连接

<?php
    //连接时指定数据库名
    //$conn=new mysqli($servername,$user,$pass,$dbname);
    //连接时不指定数据库名
    $conn=new mysqli($servername,$user,$pass);
    if(!$conn){
        die("数据库连接失败" . mysqli_connect_error());
    }else{
        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";
    }

    //注:执行query()方法返回的是一个Statement对象,表示执行成功或执行失败

    //设置数据库输出为utf8编码
    // mysqli_query($conn,"set names ‘utf8‘");
    $conn->query("set names ‘utf8‘");
    //选择数据库
    $conn->select_db($dbname);

    //增加
    $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "插入成功"."<br>";
    }

    //修改
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "修改成功"."<br>";
    }

    //查询
    $sql="select*from user";
    // $stmt=mysqli_query($conn,$sql);
    $result=$conn->query($sql);
    if($result->num_rows>0){
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

    //删除
    $sql="delete from user where name=‘aa‘";
    // $stmt=mysqli_query($conn,$sql);
    $stmt=$conn->query($sql);
    if($stmt){
        echo "删除成功"."<br>";
    }

    //关闭数据库
    // mysqli_close($conn);
    $conn->close();
    echo "已关闭!!";
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!!

2.MySQLi (面向过程) 连接

<?php
    //连接时指定数据库名
    //$conn=mysqli_connect($servername,$user,$pass,$dbname);
    //连接时不指定数据库名
    $conn=mysqli_connect($servername,$user,$pass);
    if(!$conn){
        die("数据库连接失败" . mysqli_connect_error());
    }else{
        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";
    }

    //执行query()方法返回的是一个Statement对象,表示执行成功或执行失败

    //设置数据库输出为utf8编码
    mysqli_query($conn,"set names ‘utf8‘");
    // $conn->query("set names ‘utf8‘");
    //选择数据库
    $conn->select_db($dbname);

    //增加
    $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "插入成功"."<br>";
    }

    //修改
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "修改成功"."<br>";
    }

    //查询
    $sql="select*from user";
    $result=mysqli_query($conn,$sql);
    // $result=$conn->query($sql);
    //判断结果集行数是否大于0
    if($result->num_rows>0){
        //检索结果集的下一行,将检索的结果放到关联数组中,并通过while()循环输出结果集
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

    //删除
    $sql="delete from user where name=‘aa‘";
    $stmt=mysqli_query($conn,$sql);
    // $stmt=$conn->query($sql);
    if($stmt){
        echo "删除成功"."<br>";
    }

    //关闭数据库
    mysqli_close($conn);
    // $conn->close();
    echo "已关闭!!";
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!!

3.PDO连接

<?php
    try{
        //这里注意: 等号两边不能存在空格,不然会报错,如:dbname = $dbname这样写就会报错
        $conn=new PDO("$dbtype:host=$servername;dbname=$dbname",$user,$pass);

        //弹出消息提示框
        echo "<script>alert(‘数据库连接成功‘)</script>";

        //注:执行exec()方法PDOStatement对象,表示执行成功或执行失败

        //设置数据库输出为utf8编码
        $conn->exec("set names ‘utf8‘");

        //增加
        $sql="insert into user(name,pass) values(‘aa‘,‘1234‘)";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "插入成功!"."<br>";
        }

        //修改
        $sql="update user set pass=‘123456‘ where name=‘aa‘";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "修改成功!"."<br>";
        }

        //查询
        $sql="select*from user";
        $result=$conn->query($sql);
        if($result->rowCount()>0){
            while($row=$result->fetch()){
                echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
        echo "结果集行数为:".$result->rowCount()."<br>";

        //删除
        $sql="delete from user where name=‘aa‘";
        $stmt=$conn->exec($sql);
        if($stmt){
            echo "删除成功!"."<br>";
        }

        //关闭数据库
        $stmt=$conn = null;
        if($stmt){
            echo "已关闭!"."<br>";
        }
    }catch(PDOException $e){
        print "error!".$e->getMeddage();
    }
?>
浏览器显示结果:
插入成功
修改成功
查询结果:name: aa, pass: 123456
结果集行数为:1
删除成功
已关闭!

MySQLi和PDO在连接数据库上的不同

一.
①.MySQLi仅针对MYSQL数据库,所以在连接数据库时无需指定数据库类型(就一种数据库,哪还有什么类型可选,直接就默认为MySQL啦!)
②.PDO支持多种数据库的访问,所以在连接数据库时必须指定数据库类型,不然会报错(PDO可以访问那么多种数据库,你不指定鬼知道你要访问哪种类型的数据库呀!)

二.
①.MySQLi连接数据库时,可以指定数据库名,也可以不指定数据库名
②.PDO连接数据库时,必须指定数据库名,不然会报错

MySQLi面向对象和面向过程方式的异同

一.

MySQLi面向对象:$conn=new mysqli($servername,$user,$pass);
MySQLi面向过程:$conn=mysqli_connect($servername,$user,$pass);

我也刚开始学PHP访问数据库,所以我除了它们的连接上有明显区别之外,还没发现MySQLi面向对象 和 MySQLi面向过程的其他不同之处!!!

刚开始的时候,我发现别人在
使用MySQLi面向对象方式连接数据库时,都是使用$conn->query($sql)来执行sql语句的;
使用$conn->close()来关闭数据库。
使用MySQLi面向过程方式连接数据库时,都是用mysqli_query($conn,$sql)来执行sql语句的;
使用mysqli_close($conn)来关闭数据库。

但是在尝试上面的实例时,我发现
不管是MySQLi面向对象还是MySQLi面向过程都可以使用$conn->query($sql)或mysqli_query($conn,$sql)来执行sql语句;
使用$conn->close()或mysqli_close($conn)来关闭数据库

一直以来都以为$conn->query($sql)是MySQLi面向对象专用的,mysqli_close($conn)是MySQLi面向过程专用的,没想到不是!
我想了解这其中的区别?希望有那位了解的大佬能告诉我,谢谢!

PDO执行sql语句所用方法解析

一.
①.当执行insert,update,delete等没有返回结果集的查询时,用PDO对象中的exec()方法来执行,执行成功后会返回受影响的行数
注意:exec()方法不能用于执行select查询,因为执行select查询会返回结果集

如:
    $sql="update user set pass=‘123456‘ where name=‘aa‘";
    $stmt=$conn->exec($sql);
    print_r($stmt);
浏览器显示:
    PDOStatement Object ( [queryString] => update user set pass=‘123456‘ where name=‘aa‘ ) 

二.
①. 当执行返回结果集的select查询,则使用PDO对象中的query()方法来执行;
该方法成功执行后,会返回一个结果集,并且可以通过PDOStatement对象中的rowCount()方法来获取返回结果集的行数

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    if($result->rowCount()>0){
        while($row=$result->fetch()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
            }
        }
    echo "结果集行数为:".$result->rowCount()."<br>";
浏览器显示:
    查询结果:name: aa, pass: 123456
    结果集行数为:1

②. MYSQLi访问数据库时,可以通过num_rows来获取返回结果集的行数

如:
    $sql="select*from user";
    $result=$conn->query($sql);
    //判断结果集行数是否大于0
    if($result->num_rows>0){
        //检索结果集的下一行,将检索的结果放到关联数组中,并通过while()循环输出结果集
        while($row=$result->fetch_assoc()){
            echo "查询结果:"."name: " . $row["name"]. ",    pass: " . $row["pass"]."<br>";
        }
    }
    echo "结果集行数为:".$result->num_rows."<br>";

三.
①. execute()用于执行prepare预处理语句。
在执行prepare预处理语句时,可以使用bindParam()方法来绑定参数,并对参数进行编码,然后给execute()执行。
也可以在执行execute()方法绑定参数

②.1.MySQLi 执行prepare()预处理语句时,使用bind_param()方法来绑定参数

如:
    //预处理sql语句
    $stmt=$conn->prepare("insert into user(username,password) values(?,?)");
    //使用bind_param()方法绑定参数
    $stmt->bind_param("ss",$username,$password);
    //(编辑参数)为绑定的参数赋值
    $username=‘马云‘;
    $password=‘123456‘;
    //执行
    $stmt->execute();

2.PDO执行prepare()预处理语句时,使用bindParam()方法来绑定数据库

    //预处理sql语句
    $stmt=$conn->prepare("insert into user(name,pass) values(:name,:pass)");
    //使用bind_param()函数绑定参数
    $stmt->bindParam(‘:name‘,$name);
    $stmt->bindParam(‘:pass‘,$pass);
    //(编辑参数)为绑定的参数赋值
    $name=‘王健林‘;
    $pass=‘1234ab‘;
    //执行
    $result=$stmt->execute();

3.直接在执行execute()方法时绑定参数

如:
    //预处理sql语句
    $stmt=$dbh->prepare("select * from user where name=?");
    ////执行execute()方法返回的是一个Statement对象,表示执行成功或执行失败
    if($stmt->execute([‘马云‘])){
        //使用fetch()获取结果集并放到关联数组中
        while($row=$stmt->fetch()){
            echo $row[‘name‘]."<br>";
        }
        echo "行数为:".$count=$stmt->rowcount()."<br>";
    }

PDO获取结果集的方法

①. 获取结果集的的方法。fetch() ,fetchAll() , . . .
1.fetch()
fetch()用于获取结果集的下一行,一次检索一行,然后将获取的数据放到关联的数组中。

2.fetchAll()
fetchAll()方法用于获取结果集中的所有行,其返回值是一个包含结果集中所有数据的二进制数组。

②.结果集的返回方式
众所周知,我们平时获取数组的值时,一般都是通过数字索引或者是其字符串键来获取的
fetch()方法返回结果集的方式是由其参数控制,
参数为为PDO::FETCH_ASSOC,即通过列名作为数组索引来获取
参数为PDO::FETCH_NUM时,通过列号作为索引来获取
参数为PDO::FETCH_BOTH时,即可通过列名来获取也可通过列号来获取,不写参数时,默认为PDO::FETCH_BOTH

参数为PDO::FETCH_BOTH时

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch()){
            // echo $row[‘name‘].", " .$row[‘pass‘]."<br>";
            echo $row[‘0‘].", " .$row[‘1‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";

不写参数时默认为PDO::FETCH_BOTH, 此时可通过列名$row[‘name‘]来获取结果集, 也可通过列号$row[‘0‘]来获取结果集

参数为PDO::FETCH_ASSOC

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
            echo $row[‘name‘].", " .$row[‘pass‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";

参数为PDO::FETCH_ASSOC时,仅可以通过列名$row[‘name‘]来获取结果集, 不可以通过列号$row[‘0‘]来获取结果集

参数为PDO::FETCH_NUM

如:
    //预处理sql语句
    $stmt=$conn->prepare("select*from user");
    //执行execute()函数返回的是一个PDOStatement对象,表示执行成功或失败
    $result=$stmt->execute();
    if($result){
        //fetch()方法用于获取结果集的下一行,并放入到关联数组,通过while()循环输出结果集
        while($row=$stmt->fetch(PDO::FETCH_NUM)){
            echo $row[‘0‘].", " .$row[‘1‘]."<br>";
        }
        //输出结果集中的行数
    echo "行数为:".$count=$stmt->rowcount()."<br>";

参数为PDO::FETCH_NUM时,仅可以通过列号$row[‘0‘]来获取结果集, 不可以通过列名$row[‘name‘]来获取结果集

参考资料
http://www.runoob.com/php/php-mysql-connect.html
http://blog.okbase.net/phpchina/archive/731.html
https://blog.csdn.net/sck0088/article/details/45674193
https://www.cnblogs.com/dee0912/p/4093014.html
https://www.jb51.net/article/105797.htm

原文地址:https://www.cnblogs.com/CD3245/p/10260949.html

时间: 2024-09-30 02:54:07

php操作MySQL数据库的方法和解析的相关文章

php操作MySQL数据库的方法

使用mysql_connect()函数连接MySQL服务器 要操作MySQL数据库,首先必须与MySQL服务器建立连接.连接MySQL服务器的语句如下: mysql_connect('hostname','username','password'); 该函数的返回值表示这个数据库连接.如果连接成功,则函数返回一个资源,为以后执行SQL指令作准备. 实例代码如下: <?php $link = mysql_connect("localhost", "root",

Python MySQLdb模块连接操作mysql数据库实例_python

mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法.python操作数据库需要安装一个第三方的模块,在http://mysql-python.sourceforge.net/有下载和文档. 由于python的数据库模块有专门的数据库模块的规范,所以,其实不管使用哪种数据库的方法都大同小异的,这里就给出一段示范的代码: #-*- encoding: gb2312 -*- import os, sys, string impo

转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, Sql 代码 : select id from t where num is null; 可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询: Sql 代码 : select id from t where num=0; 3.应尽量避免在 wh

优化MYSQL数据库的方法

1.选取最适用的字段属性 尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 2.使用连接(JOIN)来代替子查询:  a.删除没有任何订单客户 ELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) b.提取所有没有订单客户 SELECT FROM customerinfo WHERE customerid NOT in(SELECT cust

【php】php操作MySQL数据库

一.操作步骤: 1. 连接MySQL数据库并判断是否连接成功2. 选择数据库3. 设置字符集4. 准备SQL语句5. 向MySQL服务发送SQL语句6. 解析处理结果集7. 释放结果集,关闭数据库连接 二.常用操作: 1. mysqli_connect();--连接数据库,并返回一个连接资源 格式: mysql_connect(主机名,用户,密码); --其中参数可选,若不写则参考php.ini中默认配置 2. mysqli_error(); --获取刚刚(最后)执行数据库操作的错误信息 3.

c语言操作mysql数据库

c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看到大量的头文件.lib文件.dll文件,这说明mysql原生就支持了c语言,操作起来相当简单.二.使用win32 api(这里只探讨windows平台),主要是ODBC. ODBC API 接口是(Open Database Connectivity)开放式数据库接口,它建立了一组规范,并提供了一组

本地通过Eclipse链接Hadoop操作Mysql数据库问题小结

前一段时间,在上一篇博文中描述了自己抽时间在构建的完全分布式Hadoop环境过程中遇到的一些问题以及构建成功后,通过Eclipse操作HDFS的时候遇到的一些问题,最近又想进一步学习学习Hadoop操作Mysql数据库的一些知识,在这里网上存在很多分歧,很多人可能会笑话,用那么“笨重”的Hadoop来操作数据库,脑子有问题吧,Hadoop的HDFS优势在于处理分布式文件系统,这种说法没有任何错误,数据库的操作讲究“安全.轻便.快捷”,用Hadoop操作完全是不符合常理啊,那为啥还要学习这个东西呢

python操作mysql数据库(一)

最近又开始重新学习python,研究了一些python操作mysql数据库的知识,记录在此,用作学习笔记, 基础环境:Python 3.5.1 mysql版本:5.6.35 (rpm安装方式) 操作系统:Centos7.3 和windows7 一.python连接数据库模块介绍: 目前主要用的有以下几种.MySQLdb和pymsql以及mysql官方提供的mysql-connector-python驱动,MySQLdb模块是python2.X使用比较多的,而python3.X使用的pymsql会

mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?

MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的. 3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他