资讯专栏INFORMATION COLUMN

PHP 数据库操作

Jingbin_ / 450人阅读

摘要:操作数据库的种形式使用扩展类库推荐使用扩展类库这是类库的升级版,但已经不推荐使用扩展包含哪三个类与区别可以支持多种数据库,而且操作方法一致只支持数据库如何使用连接数据库什么是如何关闭连接通过来连接数据库,其中必须传入数据源名称数据源名称是

PHP操作数据库的2种形式

使用 PDO 扩展类库(推荐)

使用 Mysqli 扩展类库(这是Mysql类库的升级版,但已经不推荐使用)

PDO 扩展包含哪三个类

PDO

PDOStatement

PDOException

PDO 与 Mysqli 区别

PDO 可以支持多种数据库,而且操作方法一致

Mysqli 只支持Mysql数据库

如何使用PDO连接数据库?什么是DSN?如何关闭连接?

通过new PDO()来连接数据库,其中必须传入DSN数据源名称

try {
    $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

DSN(数据源名称)是告诉PDO使用哪款驱动来连接数据库,每一种数据库DSN都不同

Mysql的DSN mysql:host=localhost;dbname=test
oracle的DSN oci:dbname=//localhost:232/mydb;charset=utf-8

关闭连接: $db = null;

PDO 与连接相关的选项如何设置?

设置连接选项的2种方式

1、new PDO()的第四参数

//设置持久数据库连接必须使用这种方式,否则无效
$opt = array(
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_TIMEOUT => 3600,
    PDO::ATTR_AUTOCOMMIT => true
);
try {
    $db = new PDO($dsn,$user,$password,$opt);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

2、使用PDO对象的setAttribute()方法

try {
    $db = new PDO($dsn,$user,$password);
    $db -> setAttribute(PDO::ATTR_TIMEOUT, 3600);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
//与getAttribute()方法配套
PDO 错误处理模式该如何设置?

错误处理模式有哪三种?

1、PDO::ERRMODE_SILENT (默认,不提示,需要结合errorCode()与errorInfo())
2、PDO::ERRMODE_WARNING (警告)
3、PDO::ERRMODE_EXCEPTION (报异常,推荐使用)

一般使用案例

try {
    $db = new PDO($dsn,$user,$password);
    $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
PDO 执行SQL有哪些方法?

exec() ----不推荐,后面会有解释

exec() 主要:执行无结果集的SQL语句 增删改创建 返回影响行数

query() ----不推荐,后面会有解释

query() 主要:执行有结果集的SQL语句 查询 返回PDOStatement对象

对于某些SQL 既不是操作,也没有返回结果,使用上面某种方法都可以

prepare() ----推荐,后面会有解释

PDO 事务如何实现?

操作的Mysql的数据表必须是InnoDB

关闭自动提交 $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);

开启事务 $db->beginTransaction();

手动提交 $db->commit();

事务回滚 $db->rollBack();

事务完成后,最好把自动提交开启 $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);

什么是SQL注入?SQL注入如何防止?

SQL注入其实就是用户输入的数据带有攻击成分,所以用户输入的信息都是不可靠的

由于以上原因,导致之前exec()query()方法不常用,因为不安全,但只要不是用过用户数据生成的SQL都可以使用exec()query()

使用预处理语句来防止SQL注入

try{
    //只是将这个语句放到数据库上,编译后等待,没有执行
    $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)");

    //绑定参数(?)
    $stmt -> bindParam(1,$name);
    $stmt -> bindParam(2,$pwd);
    $stmt -> bindParam(3,$age);

    $name = "wwww";
    $pwd = "12112";
    $age = 18;
    
    //执行存储在数据库中的语句
    $stmt -> execute();
    
    $name = "bbb";
    $pwd = "ad22121";
    $age = 20;
    
    //执行存储在数据库中的语句
    $stmt -> execute();
}catch(PDOException $e){
    echo $e->getMessage();
    exit();
}

简化模式:

try{
    //只是将这个语句放到数据库上,编译后等待,没有执行
    $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)");
    
    //执行存储在数据库中的语句
    $stmt -> execute(array("wwww","12112",18));
    
}catch(PDOException $e){
    echo $e->getMessage();
    exit();
}
预处理语句中有哪两种占位符?注意事项是什么?

2种占位符:命名占位符问号占位符

问号占位符就是上面那种
命名占位符,如下,推荐使用命名控制符

try{
    //只是将这个语句放到数据库上,编译后等待,没有执行
    $stmt = $db -> prepare("insert into user(name,pwd,age) values(:name,:pwd,:age)");

    //绑定参数(?)
    $stmt -> bindParam(1,$name);
    $stmt -> bindParam(2,$pwd);
    $stmt -> bindParam(3,$age);

    $name = "wwww";
    $pwd = "12112";
    $age = 18;
    
    //执行存储在数据库中的语句
    $stmt -> execute();
    
    $name = "bbb";
    $pwd = "ad22121";
    $age = 20;
    
    //执行存储在数据库中的语句
    $stmt -> execute();
}catch(PDOException $e){
    echo $e->getMessage();
    exit();
}

注意事项

参数绑定不能应用到表名上

//错误
$sth = $dbh->prepare("SELECT name, colour, calories FROM ?  WHERE calories < ?");

//正确
$sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE calories < ?");

参数绑定不能应用到列名

//错误
$sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE ? < ?");

//正确
$sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE calories < ?");
PDO 预处理语句如何增删改查?

增删改

try{
    $db = new PDO($dsn,$name,$pwd);
    $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

try{
    $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)");
    $stmt -> execute(array("wtao","23232",14));
    $count = $stmt -> rowCount();
    if($count === 0){
        throw new PDOException();
    }
    
    $id = $db -> lastInsertId();
}catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

try{
    $db = new PDO($dsn,$name,$pwd);
    $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

try{
    $stmt = $db -> prepare("SELECT name, age, title FROM fruit WHERE id < ?");
    $stmt -> execute(array(14));
    while(list($name,$age,$title) = $stmt->fetch(PDO::FETCH_NUM)){
        
    }
}catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}
注意事项

$stmt -> execute()的返回值,如果在异常模式下,可以不用处理返回值的,只有在不是异常处理的模式下才需要判断处理

$db -> prepare(); 准备预处理语句都是多带带的,返回PDOStatement对象也就是多带带的,如果某个功能需要执行多条SQL语句,请先准备好多个PDOStatement对象,然后分别执行

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25644.html

相关文章

  • PHP 开发中的外围资源性能分析(一)

    摘要:而是说,程序的外部资源,往往是影响性能的重要因素,尤其是当外部资源的连接和数据获取本身速度达不到理想的结果时。 暂且不讨论「PHP 是不是最好的编程语言」,本文我们将分别分析一下在 PHP 程序的后端外围资源和前端外围资源,它们对整个 PHP Web 应用体验的影响,这往往比语言本身大得多。 首先,后端外围资源,是指跟 PHP 运行过程中与语言本身无关的网络与 IO 操作、存储服务、中...

    anquan 评论0 收藏0
  • Linux下PHP支持MSSql的配置

    摘要:下面程序员雷雪松就详细的看看下如何配置支持下载并安装,是一套为和允许程序来跟微软和数据库交互的动态库。注意的路径重启查看已经安装的扩展这样扩展就安装完成了,就可以使用相关函数操作数据库了。原文来源程序员雷雪松的个人博客 因为项目以前的数据库为SQLServer(MSSql),客户希望不要换数据库。在当今客户就是上帝的理念下,于是只能采用Linux下PHP操作MSSql。由于之前没什么经...

    张春雷 评论0 收藏0
  • PHP回顾之流

    摘要:本文先简要跟踪底层流的原理,再回到用户态中流的使用。底层流我们知道中的函数可以打开本地文件等并返回一个句柄,函数能对资源句柄进行读写,用于关闭资源。更多关于底层流的操作可参考官方文档中开发者的流章节,本文不再深入。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 sessi...

    gself 评论0 收藏0
  • 从0开始构建一个属于你自己的PHP框架

    摘要:如何构建一个自己的框架为什么我们要去构建一个自己的框架可能绝大多数的人都会说市面上已经那么多的框架了,还造什么轮子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何构建一个自己的PHP框架 为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说市面上已经那么多的框架了,还造什么轮子?。我的观点造轮子不是目...

    vpants 评论0 收藏0
  • 途牛原创|大话权限中心的PHP架构之道

    摘要:权限中心的依赖声明声明依赖关系检查代码规范声明开发依赖命名空间检查代码规范,执行单元测试。单元测试持续交付一切都如此的完美,没有测试,又如何可以证明这件事情的完美,又如何可以保障交付的质量。 序 权限管理是无线运营系统中的核心模块,通过访问控制策略的配置,来约定人与资源的访问关系。 本文着重讲解如何通过PHP来构建一个灵活、通用、安全的权限管理系统。 关于权限 首先我们来聊聊权限。 权...

    miracledan 评论0 收藏0
  • php性能怎么优化?php性能优化及安全策略

    摘要:性能问题一般不会超过占整个项目性能的,一般在。内置函数的性能优劣。几乎与在函数中调用局部变量的速度相当。递增一个全局变量要比递增一个局部变量慢倍。类似的方法调用所花费的时间接近于次的局部变量递增操作。 php性能怎么优化?性能是网站运行是否良好的关键因素, 网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是我们每个开发人员必备的素质,也是我们良好...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

Jingbin_

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<