php7实践指南-ch15MySQL数据库的使用PHP操作MySQL数据库

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"
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值