介绍
介绍
今天开始我们来学习各种语言操作数据库的技巧,根据福哥学习编程的顺序,我们先来将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; }
数据表列表
同样的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; }
插入数据
插入数据
插入数据也是通过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(); }
第一次执行的时候不会报错,多次执行就会有下面的错误信息了!
获取自增列数值
刚刚福哥向用户表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(); }
更新数据
更新数据就是执行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(); }
删除数据
删除数据是通过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(); }
查询数据
查询语句就是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; }
注意事项
使用PDO库操作MySQL数据库有一些注意事项,大家一定要认真看哦~~
连接MySQL和选择数据库可以放到包含文件里面,这样可以实现代码的复用。
无论自己的数据库是不是utf-8编码的都设置一下连接编码,毕竟你不能保证运行你的程序的环境一定是utf-8的。
尽量不要阻止PDO抛出异常,有bug我们就解决bug,这样系统才健康!
执行“set names utf8”语句时候,编码不要用“`”这个字符括起来,会被PDO当成编码的一部分解析!
总结
今天福哥给童鞋们演示了使用PDO库连接MySQL数据库进行各种常规操作的技巧,这里面都是一些简单的基础操作。不过,即使是复制的SQL语句也和今天福哥将的内容大同小异,举一反三就可以实现了。
后面福哥会找时间专门给童鞋们讲解SQL语句的使用技巧,包括各种复杂的使用场景,各种复杂的查询语句,大家可以先行自己研究研究。