同福

PHP通过PDO操作MySQL数据库【20210330】

介绍

介绍

今天开始我们来学习各种语言操作数据库的技巧,根据福哥学习编程的顺序,我们先来将PHP语言操作数据库的技巧。

因为相对强大又免费的数据库只有MySQL了,所以我们这里只讲解各种语言操作MySQL数据库的方法,其他数据库福哥会在后面给逐步给大家讲解。

PHP有很多版本,在PHP4的时代大家一般是通过php_mysql库来操作MySQL的;后来到了PHP5时代OOP成为了编程主流,而php_mysql库也被php_mysqli库取而代之了;再后来PHP团队发现巨婴的Asp.net有ADODB,太阳的Java有JdbcTemplate,都是一种多数据库集中解决方案,通过一套库可以操作各种各样的数据库,真是太帅了!PHP团队就搞出了一个PDO库,这个库类似ADODB和JdbcTemplate也是多数据库集中解决方案,同时它也是面向对象的。

所以,福哥今天就要给大家讲讲如何通过PHP的PDO库来操作MySQL数据库的了~~

安装

一般情况下,安装PDO库都在编译PHP的时候完成了,在编译PHP源码的时候增加如下参数即可。

--with-pdo-mysql

连接

连接MySQL需要知道服务器的地址、用户名、密码,在初始化PDO的时候福哥设置了超时时间,默认的连接超时时间比较长。福哥设置了PDO的错误模式为异常错误,也就是说当PDO处理出现错误的时候会抛出异常,这种模式方便我们调试程序。

try{
    $myPDO = new \PDO("mysql:host=127.0.0.1",
        "root",
        "abcdef",
        array(
            \PDO::ATTR_TIMEOUT => $this->timeout,
        ));
    $myPDO->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
catch (\PDOException $e){
    echo $e->getMessage();
    throw $e;
}

数据库列表

PDO没有单独的方法用来获取数据库列表,福哥是通过执行“show databases”语句获取数据库列表信息的。这是一个最简单的查询语句的示例,大家看好了。

try{
    $rs = $myPDO->prepare("show databases");
    $rs->execute();

    $databases = [];
    while($database = $rs->fetch(\PDO::FETCH_ASSOC)){
        $databases[] = $database;
    }
    echo "<h3>数据库列表</h3>";
    foreach($databases as $database){
        echo $database['Database']. "<br />";
    }
}
catch (\PDOException $e){
    echo $e->getMessage();
    throw $e;
}

home/topic/2021/0330/22/0ca2eb40fa27ae0ba7d8f2bb065d31d0.jpg

数据表列表

同样的PDO也没有用来获取数据表列表的方法,福哥是通过执行“show tables”语句获取当前数据库的数据表列表的。当前数据库也没有方法可以用,但是我们可以通过exec方法执行终端命令来达到目的。

try{
    $myPDO->exec("use tfums");
    $myPDO->exec("set names utf8");

    $rs = $myPDO->prepare("show tables");
    $rs->execute();

    $tables = [];
    while($table = $rs->fetch(\PDO::FETCH_ASSOC)){
        $tables[] = $table;
    }
    echo "<h3>数据表列表</h3>";
    foreach($tables as $table){
        echo $table['Tables_in_tfums']. "<br />";
    }
}
catch (\PDOException $e){
    echo $e->getMessage();
    throw $e;
}

home/topic/2021/0330/22/6af599c7cb0f7761a2ae19174d8f9bf9.jpg

插入数据

插入数据

插入数据也是通过prepare组织一个SQL语句,然后通过execute方法执行SQL语句完成的。不过,通过向prepare传递参数可以达到动态组织SQL语句的目的,最重要的是:这种方式还可以防止SQL注入。

插入数据是否成功就看有没有异常抛出就可以了,没插入成功一定会有原因的嘛~~

try{
    $sql = "insert into user (passwd, createDT, userFlag, userState, userName) 
                        values (:f1, now(), :f2, :f3, :f4)";
    $params = array(
        array(":f1", md5("123456")),
        array(":f2", 6, \PDO::PARAM_INT),
        array(":f3", 1, \PDO::PARAM_INT),
        array(":f4", "福哥教PDO")
    );

    echo "<h3>插入数据</h3>";
    $rs = $myPDO->prepare($sql, $params);
    foreach($params as $param){
        if(!isset($param[2])){
            $param[2] = \PDO::PARAM_STR;
        }
        $rs->bindValue($param[0], $param[1], $param[2]);
    }
    $rs->execute();
}
catch (\PDOException $e){
    echo $e->getMessage();
}

第一次执行的时候不会报错,多次执行就会有下面的错误信息了!

home/topic/2021/0330/22/c1a302a87abf5ef299366b9ea5f16fc3.jpg

获取自增列数值

刚刚福哥向用户表user插入了一条数据,用户表user的主键是自增列,要获取新数据的自增列的数值需要自己通过SQL获得。

try{
    $sql = "insert into user (passwd, createDT, userFlag, userState, userName) 
                        values (:f1, now(), :f2, :f3, :f4)";
    $params = array(
        array(":f1", md5("123456")),
        array(":f2", 6, \PDO::PARAM_INT),
        array(":f3", 1, \PDO::PARAM_INT),
        array(":f4", "福哥教PDO")
    );

    echo "<h3>插入数据</h3>";
    $rs = $myPDO->prepare($sql, $params);
    foreach($params as $param){
        if(!isset($param[2])){
            $param[2] = \PDO::PARAM_STR;
        }
        $rs->bindValue($param[0], $param[1], $param[2]);
    }
    $rs->execute();

    echo "<h3>获取自增列数值</h3>";
    $rs = $myPDO->prepare("select LAST_INSERT_ID() as newId");
    $rs->execute();
    $row = $rs->fetch(\PDO::FETCH_ASSOC);
    var_dump($row);
}
catch (\PDOException $e){
    echo $e->getMessage();
}

home/topic/2021/0330/22/99a492fd1956ab17b7bf88d500509fd1.jpg

更新数据

更新数据就是执行UPDATE语句了,更新语句的条件自然就是通过刚刚获取到的自增列的数值了。

更新是否成功也是看是否有异常抛出,如果没有抛出就是执行成功了!

我们还可以通过rowCount方法获得本次更新语句影响了多少行的数据!

try{
    $sql = "update user set lastLoginDT = now() where userID = :f1";
    $params = array(
        array(":f1", 16, \PDO::PARAM_INT)
    );

    echo "<h3>更新数据</h3>";
    $rs = $myPDO->prepare($sql, $params);
    foreach($params as $param){
        if(!isset($param[2])){
            $param[2] = \PDO::PARAM_STR;
        }
        $rs->bindValue($param[0], $param[1], $param[2]);
    }
    $rs->execute();
    $effectedRows = $rs->rowCount();
    var_dump($effectedRows);
}
catch (\PDOException $e){
    echo $e->getMessage();
}

home/topic/2021/0330/22/f86dc264cab5d6de5b00978ea8deba02.jpg

删除数据

删除数据是通过DELETE语句完成的,删除语句的条件自然也是根据自增列的数值了。

删除是否成功也是通过是否有异常抛出判断的,如果没有异常抛出就表示执行成功了!

删除行数也可以通过rowCount方法得到!

try{
    $sql = "delete from user where userID = :f1";
    $params = array(
        array(":f1", 16, \PDO::PARAM_INT)
    );

    echo "<h3>删除数据</h3>";
    $rs = $myPDO->prepare($sql, $params);
    foreach($params as $param){
        if(!isset($param[2])){
            $param[2] = \PDO::PARAM_STR;
        }
        $rs->bindValue($param[0], $param[1], $param[2]);
    }
    $rs->execute();
    $effectedRows = $rs->rowCount();
    var_dump($effectedRows);
}
catch (\PDOException $e){
    echo $e->getMessage();
}

home/topic/2021/0330/23/46c5cc752cd6fe0c907bc3c0c236479a.jpg

查询数据

查询语句就是SELECT语句,这是数据库操作里面最最常用的SQL语句了,单表查询、多表连接查询、子查询、分组查询、汇总查询、结果排序等等一系列的SQL查询技巧福哥今天不想在这里讲解,我们只用一个最简单的单表查询演示PDO是如何实现数据查询的就可以了~~

try{
    $rs = $myPDO->prepare("select * from user order by userID desc");
    $rs->execute();

    $rows = [];
    while($row = $rs->fetch(\PDO::FETCH_ASSOC)){
        $rows[] = $row;
    }
    echo "<h3>数据表user的数据列表</h3>";
    foreach($rows as $row){
        echo $row['userID']. "@". $row['userName']. "<br />";
    }
}
catch (\PDOException $e){
    echo $e->getMessage();
    throw $e;
}

home/topic/2021/0330/23/77325d33da25dd070dc1e2f2c1a8270b.jpg

注意事项

使用PDO库操作MySQL数据库有一些注意事项,大家一定要认真看哦~~

  • 连接MySQL和选择数据库可以放到包含文件里面,这样可以实现代码的复用。

  • 无论自己的数据库是不是utf-8编码的都设置一下连接编码,毕竟你不能保证运行你的程序的环境一定是utf-8的。

  • 尽量不要阻止PDO抛出异常,有bug我们就解决bug,这样系统才健康!

  • 执行“set names utf8”语句时候,编码不要用“`”这个字符括起来,会被PDO当成编码的一部分解析!

总结

今天福哥给童鞋们演示了使用PDO库连接MySQL数据库进行各种常规操作的技巧,这里面都是一些简单的基础操作。不过,即使是复制的SQL语句也和今天福哥将的内容大同小异,举一反三就可以实现了。

后面福哥会找时间专门给童鞋们讲解SQL语句的使用技巧,包括各种复杂的使用场景,各种复杂的查询语句,大家可以先行自己研究研究。