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