赞
踩
PHP与MySQL是在编程中经常搭配使用的。在一般的网站架构模式中经常采用LAMP的形式,即Linux、Apache、MySQL、PHP,包括近年来兴起的LNMP, N即代表将其中的Apache服务器换成Nginx服务器。
在PHP 5.x的版本中支持三种PHP扩展方式连接数据库:MySQL、MySQLi和PDO。在PHP 7中去掉了纯面向过程的MySQL连接数据库的方式。下面分别介绍MySQLi和PDO连接操作数据库的内容。
15.7.1 MySQLi连接操作数据库
MySQLi支持面向过程和面向对象两种风格的操作数据库的形式。操作数据库分为3个步骤。
(1)连接数据库和选择数据库。
(2)执行SQL语句。
(3)关闭结果集。
1.连接和选择数据库
(1)MySQLi面向过程风格的连接数据库语法如下:
function mysqli_connect ($host = '', $user = '', $password = '', $database = '', $port = '', $socket = '') false|mysqli
(2)MySQLi对象化风格的连接语法如下:
public function mysqli::connect ($host, $user, $password, $database, $port, $socket) void
2.执行SQL语句
通过MySQLi向表test_table中插入一行数据,代码如下:
- <?php
- $db=new mysqli('localhost','root','123456','db_test');
- $sql="insert into test_table(title,author,content,submit_time,click) values (?,?,?,?,?);"; //预设的SQL语句,表示需要绑定的参数
- $title='titlemysqli';
- $author='authormysqli';
- $content='contentmysqli';
- $submit_time='2020-01-25 10:00:00';
- $click=10011;
- $stmt=$db->prepare($sql);//预执行SQL语句
-
- //绑定参数到SQL语句,注意第一个参数的字符数量要和后面的参数数量保持一致
- $stmt->bind_param("sssss",$title,$author,$content,$submit_time,$click);
-
- if($stmt->execute()){
- echo "insert successfully";
- }
- $db->close();
-

保存以上文件为insert.php,运行文件则会向数据库中插入数据。
使用MySQLi更新数据的示例代码如下:
- <?php
- $db=new mysqli('localhost','root','123456','db_test');
- $sql="update test_table set title=? where id=1001";
- $title='mysqltitle';
- $stmt=$db->prepare($sql);
- $stmt->bind_param("s",$title);
-
- if($stmt->execute()){
- echo "update successfully";
- }
- $db->close();
-
只是对insert.php中的代码稍做改动便可实现更新数据表的操作,保存以上代码为update.php并运行便可更新数据表中的记录行。
使用MySQLi删除表中的数据也很简单,示例代码如下:
- <?php
- $db=new mysqli('localhost','root','123456','db_test');
- $sql="delete from test_table where id=?";
- $id = 1007;
- $stmt=$db->prepare($sql);
- $stmt->bind_param("s",$id);
-
- if($stmt->execute()){
- echo "delete successfully";
- }
- $db->close();
保存以上文件为delete.php并运行,将会删除表中id为1007的记录行。
对于查询数据表中的内容,MySQLi也提供了多种查询方式。查询数据的示例代码如下:
- <?php
- $db=new mysqli('localhost','root','12345678','db_test');
- $sql="select * from test_table where click> 2";
- $res=$db->query($sql);
-
- echo "<pre>";
- while($arr=$res->fetch_assoc()){
- var_dump($arr);
- }
- $res->free();//释放查询结果
- $db->close();
保存以上代码为fetch_assoc.php,运行文件,在浏览器中查看输出结果 array(6) { ["id"]=> string(4) "1001" ["title"]=> string(10) "mysqltitle" ["author"]=> string(12) "authormysqli" ["content"]=> string(13) "contentmysqli" ["submit_time"]=> string(19) "2020-01-25 10:00:00" ["click"]=> string(5) "10011" } array(6) { ["id"]=> string(4) "1002" ["title"]=> string(11) "titlemysqli" ["author"]=> string(12) "authormysqli" ["content"]=> string(13) "contentmysqli" ["submit_time"]=> string(19) "2020-01-25 10:00:00" ["click"]=> string(5) "10011" }从结果中可知,查询结果数组中的索引为表中字段名称,值为表中字段对应的值。这是因为我们使用了fetch_assoc方式进行查询。如果将代码中的$res->fetch_assoc()换成$res->fetch_array(),那么查询到的结果数组中将会包含索引数组和关联数组,其中索引数组的值为表中字段的值。如果换成$res->row(),就会只得到索引数组。读者可自行编写代码尝试。
上面介绍了MySQLi连接操作数据库的内容,并且只是介绍了MySQLi面向对象风格的实现方式。我们应该习惯这种方式,面向对象是编程中应该具备的一种思想。MySQLi也支持面向过程化的操作,但是不建议大家在实际应用中采用这种方式,这里也不进行详细介绍了,读者可查询相关资料进行实践。
15.7.2 PDO连接操作数据库
PDO扩展为PHP访问数据库定义了一个轻量级、一致性的接口。它提供了一个数据访问抽象层,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。
1. PDO连接数据库
使用PDO创建一个数据库连接语法如下:
其中,数据源名称或叫作DSN包含了请求连接到数据库的信息。连接成功就返回一个PDO对象,如果试图连接到请求的数据库失败就抛出一个PDO异常。
使用PDO连接数据库的示例代码如下:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='123456';
- try{
- $dbh= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
2.执行SQL语句
向test_table中插入数据的示例代码如下:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='123456';
- try{
- $db= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
- $sql1="SET NAMES utf8";
- $db->exec($sql1);
- $author=['陈小龙','陈大龙','李小龙','李大龙','张小龙','张大龙'];
-
- for($i=0;$i<100;$i++){
- $sql="insert into test_table (title,author,content,submit_time,click)
- values ('title".$i."','".$author[rand(0,5)]. "','content".$i."','".date('Y-m-d H:i:s')."',".rand(100,1000).")";
-
- //echo $sql;
- if($db->exec($sql)){ //执行语句
- echo "success<br/>";
- }else{
- var_dump($db->errorInfo());//错误信息
- exit();
- }
-
- }
-
-

将以上代码保存为insert.php并在浏览器中运行,将会向表test_table中插入一百行记录。
使用PDO连接数据库更新表中的内容和MySQLi差不多,也很简单。下面的代码用于演示如何修改数据表中的内容:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='123456';
- try{
- $db= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
- $sql1="SET NAMES utf8";
- $db->exec($sql1);
-
- $sql="update test_table set title='titlepdo' where id > 50";
- if($db->exec($sql)){
- echo "update sucessfully";
- }else{
- var_dump($db->errorInfo());
- exit();
- }
- $db->close();
-
-
-

保存以上代码为update.php文件并在浏览器中运行该文件,将会更新表中id大于50的记录行中的title字段值。
同样,使用PDO的方式删除表中的数据也主要是编写正确的SQL语句,和更新数据的形式基本一致,代码如下:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='admin123/';
- try{
- $db= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
- $sql1="SET NAMES utf8";
- $db->exec($sql1);
-
- //$sql="update test_table set title='titlepdo' where id > 50";
- $sql="delete from test_table where id>50";
- if($db->exec($sql)){
- echo "delete sucessfully";
- }else{
- var_dump($db->errorInfo());
- exit();
- }
- $db->close();
-
-
-

保存以上文件为delete.php并在浏览器中运行该文件,将会删除表中id值大于50的记录行。
使用PDO查询数据表,比如要查询test_table表中click字段值大于950的记录行,代码如下:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='admin123/';
- try{
- $db= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
- $sql1="SET NAMES utf8";
- $db->exec($sql1);
-
- $sql ="select content from test_table where click>950";
-
- echo "<pre>";
- $res=$db->prepare($sql); //预处理SQL语句
- $res->execute();
- $arr=$res->fetchAll(); //获取所有查询结果集
- var_dump($arr);
- $db->close();

保存以上代码为select.php并在浏览器中运行,结果如下所示
array(1) { [0]=> array(2) { ["content"]=> string(9) "content44" [0]=> string(9) "content44" } }
图15-33 PDO查询结果
在select.php中的代码$res->fetchAll()除了使用fetchAll外还可使用fetch。fetch的语法如下:
其作用是从一个PDOStatement对象相关的结果集中获取下一行。fetch_style参数决定POD如何返回行。fetch_style的参数说明如表15-8所示。
下面的例子演示如何使用PDOStatement::fetch()获取查询结果:
- <?php
- /* Connect to an ODBC database using driver invocation*/
- $dsn='mysql:dbname=db_test;host=127.0.0.1';
- $user='root';
- $password='admin123/';
- try{
- $db= new PDO($dsn,$user,$password);
- }catch (PDOException $e){
- echo 'Connection failed:'.$e->getMessage();
- }
- $sql1="SET NAMES utf8";
- $db->exec($sql1);
-
- $sql ="select content from test_table where click>950";
-
- echo "<pre>";
- $res=$db->prepare($sql); //预处理SQL语句
- $res->execute();
-
- //while($arr=$res->fetch(PDO::FETCH_OBJ)){ //将查询结果以匿名对象形式返回
- // var_dump($arr);
- //}
-
- while($arr=$res->fetch(PDO::FETCH_ASSOC)){ //
- var_dump($arr);
- }
-
- $db->close();
-
-
-

使用以上代码查询到的结果如下所示。
array(1) { ["content"]=> string(9) "content44" }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。