PDO为PHP访问各类数据库定义了一个轻量级一致性的接口,无论什么数据库,都可以通过一致的方法执行查询和获取数据,而不用考虑不同数据库之间的差异,大大简化了数据库操作。使用PDO可以支持mysql、postgresql、oracle、mssql等多种数据库。
本文以基础讲解常用的PHP以PDO方式操作MySQL,包括常用的CURD语句执行,以及预处理语句和事务的应用。虽然很多朋友使用开发框架封装好了数据库操作层,或者使用ORM等不直接接触SQL语句,但是在一些小项目中可能会用到原生的数据库操作,所以虽然是基础但是很有用。
准备
我们准备一张mysql数据表mycomments,这是一张常见的评论表。
连接
首先创建PDO对象,建立与数据库服务器的连接。
PDO::setAttribute()用于设置属性,如上面的代码中就设置了使用异常模式处理错误。
查询
如果我们不使用预处理语句,可以直接使用query()和exec()方法执行sql语句。
而实际开发中我们最常用的是预处理语句,简单的说预处理语句预先将sql命令分析一次,可以多次执行,提高了处理效率,而且能有效防止SQL注入。在执行单个查询时快于直接使用query()或exec()的方法,速度快且安全,所以强烈推荐使用预处理语句。
使用预处理语句处理时配套的方法是prepare()和execute()。
我们用预处理语句来查询符合条件的数据记录:
我们在sql语句中使用问号(?)参数作为占位符,使用bindParam()可以设置绑定参数值。
不过,如果有很多参数需要传递,我们最常用的是这样写:
在execute()方法中加入参数占位符数组,不使用?占位符可能更直观点。
fetch()返回查询结果中的一行数据,数据以数组形式返回,该方法可以带参数,其中参数默认为 PDO::FETCH_BOTH,即返回一个索引为结果集列名和以0开始的列号的数组,而常用的参数PDO::FETCH_ASSOC则返回一个索引为结果集列名的数组。
fetchAll()可以获取结果集中的所有行,并赋给返回的二维数组。和fetch()一样也可以带参数。
如查询表中用户id为2的所有数据,可能会有多行结果:
打印$row结果看下,是不是一个二维数组?
插入
最常用的插入数据表的写法,如果有自增长id(一般必须有),使用lastInsertId()可以获取到插入成功后的id。
更新
使用预处理更新数据,rowCount()返回影响行数,大于0即表示执行成功的记录数。
删除
对于只有一个参数需要绑定的,可以使用问号?占位符。删除后同样使用rowCount()返回影响行数,大于0表示执行成功。
事务
事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作。如果组中的所有SQL语句都操作成功,则认为事务成功,事务则被提交。如果在事务的组中只有一个环节操作失败,事务也不成功,则整个事务将被回滚,该事务中所有操作都被取消。事务在开发中也经常用到,因为很多业务过程都包括多个步骤,如果任何一个步骤失败,则所有步骤都不应发生。
值得注意的是,如果要用到事务处理功能,你的MySQL应该使用InnoDB引擎或者其他支持事务的引擎,切不可以使用MyISAM引擎。
来看PDO事务处理实例:
上述代码中首先是启动一个事务,然后依次执行三条sql,然后提交事务。细心的同学可能会发现,在第2条sql中查询条件sid=2有误,因为我们在前面创建mycomments表的时候没有sid这个字段,所以在执行到第2条sql时就会出错,这个时候会抛出异常,使用try{}cache(){}语句即可捕获异常,于是就执行了回滚事务rollBack(),而并没有提交事务。换句话说就是上面的代码虽然第一条sql执行完了,但是最终执行不成功,数据库没有任何写入和更新。
之前写了篇文章介绍php操作mysql有网友给小编留言说现在都流行的是mysqli链接数据库。小编今天介绍一下php操作mysqli的常见语法。
和mysql有比较多类似的地方。我们先看看mysqli怎么连接数据库。
我们先定义几个常量,数据库账户,数据库密码,还有要连接的数据库。
php怎么操作mysqli然后运行一下代码,查看是否得到需要的数据
mysqli查询结果这里我们可以看到基本操作很简单。类似mysql实例化$mysqli=new Mysqli(HOST,USER,PWD,DB);就可以了
我们看看常见的语法
mysqli_result类我们可以都试试看得出什么数据,方便在自己项目中运用到
$row=$result->fetch_row();
//$row=$result->fetch_array();
//$row=$result->fetch_assoc();
//$row=$result->fetch_object();
//释放结果集
$result->free();
//$result->free_result();
//$result->close();
//关闭连接
$mysqli->close();
然后释放资源,关闭连接。是不是也没那么难呢
本篇文章给大家带来的内容是关于Mysql的数据表操作方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
数据表插值
操作数据表中最重要的操作,保存我们的网站数据,用户数据。我们先来看一下命令规则:
INSERT [INTO] tbl_name [(col_name,col_name,...)] VALUES(val,val,...)
从上面的规则我们可以看到,[(col_name,col_name,...)]是可填可不填,区别在于;不填[(col_name,col_name,...)]就必须一次传入所有字段的值,填入[(col_name,col_name,...)]就可以传入对应col_name值。
所以,我们来查看一下上一次建的数据表user的结构在进行传值,输入命令
SHOW COLUMNS FROM user;
我们可以看到有四个字段
usename,age,passwrod,gz,我们先来一次性对所有字段插值。
INSERT user VALUES('Tom',25,'abc123456',12000);
运行命令~成功。
现在我们来给usename,passwrod两个字段进行插值
INSERT user (usename,passwrod) VALUES('Jieke','101010');
运行命令~成功
查找记录值
我们刚刚插入了几个值,现在我们来查询字段的值是否与我们插入的一样。查找记录值命令规则:
SELECT expr,... FROM tbl_name;
输入命令:
//当然实际上的查询命令非常,现在只是演示简单查找命令SELECT * FROM user;
可以看到刚刚插入的值都存在数据表中了。
空值与非空值
在网站注册资料中,有必填字段和可填字段的设定。在mysql中也拥有此设定,就是空值与非空值
NULL,NOT NULL。现在我们来创建一个新的数据表并创建字段。
CREATE TABLE newuser(name VARCHAR(20) NOT NULL, age TINYINT UNSIGNED NULL)
上面我们设定了两个字段,name字段不可为空值,age字段可为空值。
现在我们来插入字段值INSERT newuser (name,age) VALUES('Timo',null);
插入值成功。**现在,我们来试一下插入name字段的值为NULL会怎么样。
INSERT newuser (name,age) VALUES(NULL,NULL);
可以看到报错,
Columns 'name' cannot be null
name字段不可设置为空值。所以我们设定的空值与非空值已经成功生效了。
默认值
我们可以为字段设定默认值DEFAULT,当插入记录时,如果没有明确赋值,则自动赋值设定的默认值。
现在我们来重新创建一个数据表tb2,并为name,sex中的sex设定默认值。输入命令行:
CREATE TABLE tb2(name VARCHAR(20), sex ENUM('1','2','3') DEFAULT '3' );
插入记录name,不对sex插入记录
INSERT tb2(name) VALUES('ggb');
插入成功,我们对数据表记录输出,看看sex有没有值
可以看到sex值为3,已经被赋值默认值了。
删除操作指对数据表的单个记录或者多个记录的删除操作,示例代码如下:
// 删除数据Db::name('data')->where('id', 18) ->delete();
和更新操作一样,ThinkPHP不允许使用无条件删除操作,如果不带条件可以直接使用主键删除:
// 删除数据Db::name('data')->delete(18);// 删除多条数据Db::name('data') ->delete([1, 5, 8]);
如果你确定要执行无条件删除操作, 可以使用下面的方式:
// 删除所有数据Db::name('data')->delete(true);
事实上,对于业务数据表,基本上不建议使用删除操作,而是使用软删除(逻辑删除,其实执行的是数据表的更新操作)替代实际的物理删除。
掌握了基本的CURD操作后,我们就来熟悉下链式方法的概念,其实就是前面我们提到的辅助查询方法。首先链式方法的目的是为了让查询更清晰和直观,下面的两个代码实现哪个更清晰易懂大家可以比较下。
事实上,我们前面使用的table、where、limit之类的方法都称之为链式方法,辨别一个方法是否属于链式方法的一个显著特征就是看这个方法是否返回当前的对象实例。正因为链式操作方法返回的是当前对象实例,所以不同的链式方法在调用的顺序上没有先后的概念,但相同的链式方法调用顺序会影响最终的查询,下面的两个例子完全等效:
上面两个查询最终生成的SQL语句是完全相同的。但下面两个查询最终生成的SQL是不同的
多个where方法和order方法的调用顺序最终影响了生成的SQL语句,虽然有时候并不会影响查询结果。上面的两个例子where方法的顺序并不会影响查询条件,而order方法的顺序则改变了最终数据的排序。链式方法的调用顺序取决于你的思维习惯或者说团队规范。
解析结果集
PDO(PHP Data Object)
PDO是PHP数据对象的英文缩写,英文全称为PHP Data Object,是又MySQL官方封装的、基于面向对象编程思想的、使用C语言开发的数据库抽象层。
配置PDO
Windows下启动PDO需要在“php.ini”文件中进行配置,添加扩展:
extension=php_pdo.dll
在最新版PHP中,PDO已经默认开启,只需要启动其他数据库扩展即可。配置好这些后重启Apache服务。执行phpinfo()函数,看到PDO配置项,说明开启成功。
MySQL访问数据库
与mysqli扩展类似,PDO扩展也是实例一个PDO对象,然后可以调用相关方法和属性来执行数据库的操作。
连接服务器
使用PDO与服务器建立连接,需要先使用构造方法来创建PDO实例,PDO的构造方法如下:
_construct(stringdata_source_name [,string user[,string pwd[,array driver_options]]])
datasourcename : 数据源,该参数包括了数据库名,主机名。MySQL数据库的DSN为:“mysql:host=localhost;dbname=account_db; port=3306”
user:数据库服务器用户名
pwd:为数据库服务器密码
数据库连接成功后,将返回一个PDO的实例,连接失败将会抛出一个PDOException异常,通常会使用try/catch语句进行处理。
关闭数据库
要想关闭连接,需要销毁对象以确保所有到它的引用都被删除,可以给变量赋一个NULL。
执行SQL语句
PDO提供了三种执行SQL语句的方法,分别是exec(),query(),预处理语句。
exec()
exec()方法可以执行一条语句,并返回受影响的行数,它的语法格式如下:
int PDO::exec(String sql)
exec()方法通常用于insert into,delete,update等语句。
<?phpecho "<pre>"; $dbms = "mysql"; $server = "localhost"; $username = "root"; $password = "123456"; $dsn = "$dbms:host=$server"; try { $pdo = new PDO ( $dsn, $username, $password ); echo "PDO连接MySQL数据库服务器成功"; print ($pdo->exec ( "create database account_pdo_db" )) ; print ($pdo->exec ( "use account_pdo_db" )) ; print ($pdo->exec ( "set names utf8" )) ; print ($pdo->exec ( "create table account(id int auto_increment primary key, username varchar(50) not null, password varchar(50) not null, email varchar(50) not null)" )) ; print ($pdo->exec ( "insert into account(username, password, email) values ('Jack', '123456', 'jack@example.com')" )) ; print ($pdo->exec ( "insert into account(username, password, email) values ('Lucy', '123456', 'lucy@example.com')" )) ; $pdo = null; } catch ( PDOException $e ) { echo "PDO连接MySQL数据库服务器失败"; die (); }?>
query()
query()方法不同于exec(),通常用于select语句中,它的返回值是PDOStatement的实例,是POD里的结果集。它的语法如下:
PDOStatement PDO::query(String sql)
<?phpecho "<pre>";$dbms = "mysql";$server = "localhost";$username = "root";$password = "123456";$dbname = "account_pdo_db";$dsn = "$dbms:host=$server;dbname=$dbname";try {$pdo = new PDO ( $dsn, $username, $password ); echo "<p>PDO连接MySQL数据库服务器成功</p>"; $result = $pdo->query ( "select * from account" ); foreach ( $result as $row ) { var_dump ( $row ); } $pdo = null;} catch ( PDOException $e ) { echo "PDO连接MySQL数据库服务器失败"; die ();}?>
读取操作就是指对数据表(包括单表和多表)的各种查询操作,该操作涉及的内容和营养较多,也是数据库操作中最复杂和最难掌握的,所以我们会陆续花大量的篇幅来讲解,这里先简单了解下几个单表查询最基础的方法,查询单个数据用法示例:
// 查询查个数据$data = Db::table('data')->where('id', 8) ->find();dump($data);// 简化写法,直接传入主键查询$data = Db::table('data') ->find(8);
find方法存在查询结果的话返回一个数组,没有的话返回null,要获取查询记录的值,可以使用数组方式操作:
echo $data['id'];echo $data['name'];
查询多个数据:
// 查询多个数据$list = Db::table('data')->where('id','in', [1, 5, 8]) ->select();dump($list);// 直接传入多个主键的值查询$list = Db::table('data') ->select([1,5,8]);
select方法存在查询结果的话返回一个二维数组,如果没有数据则返回一个空数组。可以遍历获取记录的值,例如:
foreach ($list as $data) {echo $data['name'];}
我们修改数据库配置文件中的resultset_type值
// 数据集返回类型 'resultset_type' => 'collection',
select方法的返回值就会变成一个数据集对象(think\Collection)。二维数组和数据集对象的区别在于,数据集对象提供了更多的内置数据处理方法,但在基本使用上,这两种方式没有不同,很多开发者一看到对象的输出信息就不知所措了,完全没必要,除非你有“对象”恐惧症,关于数据集的用法我们会在后续进行详细讲解。
column的返回类型永远都是数组,不受resultset_type参数的影响。你可能现在会对where方法的用法心存疑虑,确实查询构造器大部分的工作和复杂度都集中在where方法,不过不用着急,请耐心往下看,在学习完本章和下一章的内容后你基本上就会对where方法驾轻就熟了。
使用查询构造器进行查询,起码需要掌握查询类的几个关键的方法。这些方法对SQL稍微了解一点的用户理解起来应该不难,find和select方法的区别在于find方法只是查询一条记录(即使满足条件的记录有很多),并且返回的是一个一维数组(没有结果返回Null),而select方法返回的是一个二维数组(没有结果返回空数组),除此之外,他们的查询语法都是相同的。这些常用方法其实包含两种大的类别,一个是辅助方法(辅助查询用的,也称为链式方法,例如table、field、where、order和limit等方法),一个是真正的查询方法(find、select、insert、update和delete方法),查询方法是必须的,而辅助方法是可选的,并且辅助方法必须在查询方法之前被调用,并且在查询调用之后自动失效。使用查询构造器进行查询,能够最大程度的避免写针对特定数据库的查询语句,减少跨数据库类型的迁移成本。下面我们对数据库的CURD操作给出基本的用法。创建操作指往数据表添加新的记录,下面是示例代码:
insertAll方法的数据集中的元素请确保字段列表一致,否则会出错。由于insert和insertAll方法最终都是调用连接类的execute方法,我们已经知道execute方法的返回值是影响的记录数,所以insert和insertAll方法的返回值也是影响(新增)的记录数,并不会返回主键值。主键id如果是自增类型,可以使用:
// 插入单个记录Db::table('data')->insert(['name' => 'kancloud']);
如果需要获取自增id的值,可以在insert方法之后紧接着调用getLastInsID方法:
// 插入单个记录Db::table('data')->insert(['name' => 'kancloud']);// 获取上次写入的自增Id$id = Db::getLastInsID();
由于PDO内部的原因,insertAll方法后调用getLastInsID方法返回的自增Id可能存在偏差。或者直接合并上面的代码为:
// 插入单个记录 并返回自增Id$id = Db::table('data')->insertGetId(['name' => 'kancloud']);对于不在数据表中的字段写入,系统默认会抛出异常,但可以配合strict(false)方法忽略错误继续执行,下面的test数据会被忽略(data表不存在test字段)。
// 插入单个记录 并返回自增Id$id = Db::table('data')->strict(false) ->insertGetId([ 'name' => 'kancloud', 'email' => 'kancloud@qq.com', 'test' => '这个数据不会被写入', ]);
你并不需要考虑写入数据失败的情况,数据库操作过程有任何的错误都会抛出异常,你需要做的只是修正BUG或者捕获异常自行处理。
连接MySQL服务器
建立与MySQL数据库的连接,使用mysqli_connect()函数,它的语法格式如下:
mysqli mysqli_connect ([string server[, string username[, string password[, string dbname[, int port[, string socket]]]]]])
它的参数含义如下:
server:可选参数,MySQL服务器地址。username:可选参数,MySQL服务器用户名。password:可选参数,MySQL服务器用户密码。dbname:可选参数,要连接的数据库名字。port:可选参数,MySQL服务器的端口号,默认3306。socket:可选参数,使用设置的socket或者pipe。注意:前四个参数比较常用,后两个很少用到。
PHP选择MySQL数据库
PHP提供了mysqliselectdb()函数来选择MySQL数据库,它的语法格式如下:
<?php$server = "localhost"; $username = "root"; $password = "123456"; $dbname = "php_db"; // 快速写法 $mysqli = new mysqli ( $server, $username, $password, $dbname ); // 兼容写法 $mysqli = new mysqli ( $server, $username, $password ); mysqli_select_db ( $mysqli, $dbname ); // 对象写法 $mysqli = new mysqli (); $mysqli->connect ( $server, $username, $password ); $mysqli->select_db ( $mysqli, $dbname );?>
断开MySQL服务器
使用mysqli_close()函数来关闭与MySQL服务器的连接。
执行SQL语句
数据库的“增删改查”说到底都是一句SQL语句,PHP提供了mysqli_query()函数来执行SQL语句,它的语法如下:
mixed mysqli_query (mysqli link, string query[, int resultmode])
link : 是调用mysqli_connect()函数返回的mysqli对象,
query : 是要执行的SQL语句,
resultmode : 是可选参数,它的默认值是MYSQLISTORERESULT,如果需要查询的数据量很大,需要使用MYSQLIUSERESULT。
<?php$server = "localhost"; $username = "root"; $password = "123456"; $dbname = "account_db"; $mysqli = new mysqli ( $server, $username, $password, $dbname ); // 增 $result = mysqli_query ( $mysqli, "insert into account(username, password, email) values('张三', '123456', 'zhangsan@example.com')" ); // 删 $result = mysqli_query ( $mysqli, "delete from account where user='张三'" ); // 改 $result = mysqli_query ( $mysqli, "update account set password='abcdefg' where user='张三'" ); // 查 $result = mysqli_query ( $mysqli, "select * from account " ); mysqli_close ( $mysqli );?>
面向对象的编程-抽象类和接口「程序员培养之路第四十六天」
面向对象的编程-__autoload()「程序员培养之路第四十五天」
面向对象的编程-多态「程序员培养之路第四十四天」
数据库是编程的核心内容,在使用php做网站的过程中,固然要与数据库打交道,那么在php中,怎样来创建一个数据库呢?下面我们就一起来了解一下吧。
1、创建一个函数
我在这里是作为演示实例,所以没有用框架,用的是原生的,打开编辑器,新建一个文件,然后再文件里面,先新建一个函数,这里命名是create_data,接下来我们将在这个函数里面来写php怎样创建一个数据库?
2、登陆信息
要想创建数据库或者是对数据库的其他操作,都必须先连接数据库,先设置好用户名,主机名,密码这三个变量:
$Username="root";
$Password="";
$servernmae="localhost";
3、连接数据库
登陆信息创建好之后,我们就来连接数据库了,我这里使用的是mysqli的连接方式:
$connect=new mysqli($servernmae,$Username,$Password);
4、创建数据库
如果数据库连接成功的话,我们就开始创建数据库,创建数据库的sql语句格式是“create database +要创建的数据库名”,例子如下:
$sql="create database ceshi";
然后是执行这个sql语句:
if($connect->query($sql)){
echo "successful!";
}
else{
echo $connect->error;
}
5、访问测试。
开启本地的服务器和mysql服务器,然后在浏览器中输入刚才那个文件的地址进行访问,结果如下:
完整代码如下:
function create_data(){
$Username="root";
$Password="";
$servernmae="localhost";
$connect=new mysqli($servernmae,$Username,$Password);
if($connect){
$sql="create database ceshi";
if($connect->query($sql)){
echo "successful!";
}
else{
echo $connect->error;
}
}
}
create_data();
PHP连接mysql数据库是PHP新手们必须要掌握的一项技能,只要掌握了PHP对数据库进行增删改查等操作,就可以写出一些简单且常见的程序。如留言表,新闻页等。本篇文章主要给大家详细介绍PHP连接Mysql数据库的两种常用方法。
下面我们通过具体的代码示例来给大家详细介绍两种PHP连接mysql数据库的方法。
mysqli连接数据库和pdo连接数据库。
第一种方法:使用mysqli连接mysql数据库
代码实例如下:
<?php
$host='127.0.0.1';
$user='root';
$password='root';
$dbName='php';
$link=new mysqli($host,$user,$password,$dbName);
if ($link->connect_error){
die("连接失败:".$link->connect_error);
}
$sql="select * from admins";
$res=$link->query($sql);
$data=$res->fetch_all();
var_dump($data);
在经过一系列的连接操作后,我们再创建一个sql语句对其中数据表进行查询检验。在上述代码中,我们要先创建一些需要用到的变量,如数据库用户名、数据库名密码等。然后我们用面向对象的方式连接了名为php的数据库。再通过if条件语句,connect-error方法判断PHP连接数据库是否成功。
这里我们先登录phpmyadmin看看是否存在php数据库,从下图可以知道是存在php这个数据库的。
最后通过浏览器访问,结果如下图:
从图中可以得知,我们成功地连接了php数据库,并且能查询出数据表信息。
第二种方法:使用PDO连接数据库
代码示例如下:
<?php
$host='127.0.0.1';
$user='root';
$password='root';
$dbName='php';
$pdo=new PDO("mysql:host=$host;dbname=$dbName",$user,$password);
$sql="select * from admins";
$data=$pdo->query($sql)->fetch();
var_dump($data);
PHP连接Mysql步骤以上就是关于PHP连接数据库查询数据的两种常用方法详解,更多相关教程请访问php中文网mysql视频教程,欢迎参考学习!