生产环境必须关闭的PDO配置(ATTR_EMULATE_PREPARES隐藏风险曝光)

第一章:生产环境必须关闭的PDO配置(ATTR_EMULATE_PREPARES隐藏风险曝光)

在PHP的PDO扩展中,ATTR_EMULATE_PREPARES 是一个默认开启的配置项,用于模拟预处理语句。虽然它提升了兼容性,但在生产环境中若未正确关闭,可能带来严重的安全与性能隐患。

为何必须关闭模拟预处理

当 ATTR_EMULATE_PREPARES 开启时,PDO并不会真正将SQL语句和参数分开发送给数据库,而是由PHP层拼接后执行。这可能导致绕过预处理的安全防护机制,尤其在处理复杂类型或编码异常的输入时,增加SQL注入风险。

如何正确配置PDO

在建立数据库连接后,应显式禁用模拟预处理,并确保使用真正的预处理语句:
// 创建PDO实例并禁用模拟预处理
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES   => false,  // 关键配置:关闭模拟预处理
]);
上述代码中,PDO::ATTR_EMULATE_PREPARES => false 确保所有预处理请求都交由数据库原生处理,避免客户端拼接SQL。

潜在问题与应对策略

禁用模拟预处理后,某些特殊情况可能引发异常,例如:
  • 不支持原生预处理的驱动(如旧版MySQL Native Driver)
  • 批量插入时的数据类型绑定问题
  • 字符集处理不一致导致的注入漏洞残留
为确保稳定性,建议进行如下验证:
  1. 确认数据库驱动支持原生预处理(如MySQLnd)
  2. 在测试环境中运行SQL语句覆盖率检测
  3. 启用日志监控真实SQL执行情况
配置项开发环境推荐值生产环境推荐值
ATTR_EMULATE_PREPAREStruefalse
ATTR_ERRMODEPDO::ERRMODE_WARNINGPDO::ERRMODE_EXCEPTION

第二章:深入理解PDO预处理机制

2.1 预处理语句的工作原理与执行流程

预处理语句(Prepared Statement)是数据库操作中提升性能与安全性的核心技术。其核心思想是将SQL语句的解析、编译与执行阶段分离,实现一次编译、多次执行。
执行流程解析
预处理语句的执行分为两个阶段:准备阶段和执行阶段。数据库服务器在准备阶段对SQL模板进行语法分析、生成执行计划;执行阶段仅传入参数,复用已有计划。
  • 客户端发送带有占位符的SQL模板,如 SELECT * FROM users WHERE id = ?
  • 服务器解析并生成执行计划,返回语句句柄
  • 客户端绑定参数并执行句柄,获取结果
PREPARE stmt FROM 'SELECT name, email FROM users WHERE age > ?';
SET @min_age = 18;
EXECUTE stmt USING @min_age;
上述代码展示了MySQL中预处理语句的使用。PREPARE 创建语句模板,EXECUTE 结合参数运行。参数绑定有效防止SQL注入,同时避免重复解析开销。
阶段操作优势
准备解析SQL、生成执行计划减少编译频率
执行传参运行、返回结果提升安全性与效率

2.2 模拟预处理与真实预处理的本质区别

在自动化测试与系统集成中,模拟预处理和真实预处理的核心差异在于数据源与执行环境的真实性。
执行环境差异
模拟预处理运行于隔离的测试环境中,依赖伪造数据和桩模块;而真实预处理直接作用于生产级数据流,涉及实际数据库、消息队列和外部服务调用。
代码行为对比
// 模拟预处理:返回固定响应
func MockPreprocess(data []byte) (*ProcessedData, error) {
    return &ProcessedData{Value: "mock_result"}, nil
}

// 真实预处理:执行实际解析与校验
func RealPreprocess(data []byte) (*ProcessedData, error) {
    parsed, err := parseJSON(data)
    if err != nil {
        return nil, err
    }
    return validateAndEnrich(parsed)
}
上述代码展示了两种模式的实现路径:模拟版本跳过解析逻辑,直接返回预期结构;真实版本则包含完整的错误处理与数据转换流程,反映系统在真实负载下的行为复杂性。
关键特性对比
维度模拟预处理真实预处理
延迟微秒级毫秒至秒级
数据一致性不可靠强保证

2.3 ATTR_EMULATE_PREPARES开启时的安全隐患分析

当PDO的`ATTR_EMULATE_PREPARES`设置为`true`时,预处理语句将被客户端模拟而非交由数据库服务器原生执行,这可能导致安全漏洞。
SQL注入风险加剧
在模拟预处理模式下,参数绑定由PDO驱动在PHP层完成,字符串拼接可能提前发生,绕过真正的预处理保护机制。例如:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userInput]); // 恶意输入可能被错误解析
上述代码中,若`$userInput`包含经过编码的恶意 payload(如`1' OR '1'='1`),模拟解析可能无法完全隔离SQL语义,导致注入成功。
安全配置建议
  • 生产环境应显式关闭模拟预处理:ATTR_EMULATE_PREPARES = false
  • 确保数据库连接使用持久化连接时仍保持原生预处理
  • 结合`ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION`及时捕获异常

2.4 不同数据库驱动下的行为差异实测

在实际开发中,不同数据库驱动对SQL执行、连接管理及事务处理存在显著差异。以Go语言为例,database/sql接口虽统一了调用方式,但底层驱动实现各异。
主流驱动对比测试
测试涵盖MySQL(github.com/go-sql-driver/mysql)、PostgreSQL(github.com/lib/pq)和SQLite(github.com/mattn/go-sqlite3),重点关注预处理语句行为与参数占位符支持:
// MySQL 使用 ? 占位符
db.Exec("INSERT INTO users(name, age) VALUES (?, ?)", "Alice", 30)

// PostgreSQL 使用 $1, $2 序号占位符
db.Exec("INSERT INTO users(name, age) VALUES ($1, $2)", "Bob", 25)
上述代码展示了参数绑定语法的不兼容性:MySQL使用问号,PostgreSQL依赖序号,而SQLite两者皆支持但默认模式不同。
行为差异汇总
数据库预处理默认占位符语法事务隔离级默认值
MySQL启用?REPEATABLE READ
PostgreSQL模拟$1, $2READ COMMITTED
SQLite本地编译? 或 :nameDEFERRED

2.5 性能对比:模拟 vs 原生预处理的实际开销

在数据库操作优化中,预处理语句的实现方式直接影响执行效率。原生预处理利用数据库协议层支持,而模拟预处理则在驱动层解析SQL,两者在性能上存在显著差异。
执行开销对比
原生预处理将SQL模板发送至数据库服务器编译缓存,后续仅传参执行,减少SQL解析开销。模拟模式则每次拼接完整SQL,增加网络传输与解析成本。
模式准备阶段耗时执行阶段耗时安全性
原生预处理较高(首次)低高(自动转义)
模拟预处理低高依赖手动过滤
代码示例与分析

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 启用原生预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
上述配置关闭模拟预处理,确保请求通过数据库原生预处理机制执行。参数PDO::ATTR_EMULATE_PREPARES设为false后,PDO将使用MySQL的PREPARE指令,提升批量执行效率并增强安全性。

第三章:安全风险的真实案例剖析

3.1 SQL注入漏洞在模拟预处理中的复活场景

当开发者误以为“模拟预处理”能防御SQL注入时,漏洞便可能悄然复活。所谓模拟预处理,是指在应用层拼接SQL语句,而非交由数据库驱动执行真正的参数化查询。
典型错误实现

-- 错误示例:字符串拼接模拟预处理
String query = "SELECT * FROM users WHERE id = " + userId;
该方式未使用PreparedStatement,攻击者可构造 userId=1 OR 1=1 实现注入。
安全对比表
方式是否真实预处理抗注入能力
模拟预处理否弱
参数化查询是强
真正防御需依赖数据库协议级的预处理机制,杜绝SQL拼接。

3.2 字符编码欺骗攻击的实战复现

字符编码欺骗攻击常利用浏览器对不同编码解析的差异,诱导系统错误解码恶意输入,从而触发XSS或文件包含漏洞。
攻击场景构建
搭建基于PHP的测试页面,其根据用户传入的charset参数设置响应头编码:

<?php
$charset = $_GET['charset'] ?? 'UTF-8';
header("Content-Type: text/html; charset=$charset");
echo "<script>alert('安全编码:$charset')</script>";
?>
当攻击者传入charset=GBK时,可利用%81-%FE范围内的双字节特性构造有效载荷。
恶意负载注入
  • 输入:?charset=GBK 并附加%A1%BCscript%3Ealert(1)%3C/script%3E
  • 在GBK解析下,%A1%BC被识别为合法字符,绕过前端过滤
  • 浏览器误将后续内容解析为JavaScript代码
该过程揭示了编码一致性校验缺失带来的严重安全隐患。

3.3 生产环境中因配置不当导致的数据泄露事件

在多个生产系统中,数据库权限与访问控制的配置疏漏是引发数据泄露的主要根源。常见问题包括默认账户未禁用、防火墙规则过于宽松以及敏感服务暴露于公网。
典型误配置场景
  • 数据库监听所有IP(0.0.0.0)而未限制内网访问
  • 使用弱密码或硬编码凭证于配置文件中
  • 云存储桶设置为公共可读
代码示例:危险的数据库配置
database:
  host: 0.0.0.0
  port: 5432
  username: admin
  password: password123
  ssl: false
上述YAML配置将数据库绑定至公网接口,且使用默认账户与明文弱密码,极易被扫描工具捕获并利用。
防护建议
通过最小权限原则、启用TLS加密、定期审计日志和自动化配置扫描工具可显著降低风险。

第四章:正确配置与迁移实践指南

4.1 如何检测当前环境是否启用模拟预处理

在开发与测试过程中,准确识别当前运行环境是否启用了模拟预处理机制至关重要。
检查环境标志变量
许多系统通过环境变量控制模拟模式。可通过读取特定变量判断状态:
if [ "$SIMULATION_MODE" = "enabled" ]; then
  echo "模拟预处理已启用"
else
  echo "模拟预处理未启用"
fi
该脚本通过比对环境变量 SIMULATION_MODE 的值,判断当前是否处于模拟状态。此方法适用于CI/CD流水线或容器化部署场景。
程序接口探测
应用层可封装检测函数:
func IsSimulationEnabled() bool {
    return config.Get("features.simulate") == "true"
}
该函数从配置中心获取模拟功能开关状态,实现动态感知。参数说明:config.Get 为配置读取方法,路径 features.simulate 对应配置项层级。

4.2 安全关闭ATTR_EMULATE_PREPARES的步骤与验证

在PHP应用中,PDO的`ATTR_EMULATE_PREPARES`属性控制预处理语句是否由驱动原生实现。为提升SQL注入防护能力,建议关闭模拟预处理,启用原生预处理。
操作步骤
  • 确认数据库驱动支持原生预处理(如MySQL的mysqlnd)
  • 在PDO实例化后显式设置属性
  • 进行SQL兼容性测试,避免占位符使用错误
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
上述代码禁用模拟预处理,使参数绑定交由数据库服务器执行。此举增强安全性,防止攻击者绕过绑定机制。
验证方法
执行预处理语句并检查底层是否真实解析:
验证项预期结果
错误语法捕获数据库层报错
参数类型严格匹配类型不匹配应报错

4.3 兼容性问题排查与应用层适配策略

在跨平台或版本迭代场景中,兼容性问题常导致服务异常。需建立系统化的排查流程,优先确认接口协议、数据格式与依赖版本的一致性。
常见兼容性问题类型
  • API 接口字段变更导致解析失败
  • 序列化格式差异(如 JSON 与 Protobuf)
  • 第三方库版本冲突
应用层适配方案
通过中间层转换屏蔽底层差异,例如使用适配器模式统一接口输出:

func AdaptV1ToV2(oldData OldFormat) NewFormat {
    return NewFormat{
        ID:   oldData.LegacyID, // 字段映射
        Name: strings.TrimSpace(oldData.Name),
    }
}
上述代码实现旧版数据结构到新版的无损转换,确保上游逻辑无需修改即可兼容新接口。
兼容性检测表
检查项工具/方法建议阈值
API 响应一致性DiffTester字段差异 ≤ 5%
调用成功率监控告警系统≥ 99.5%

4.4 高可用架构下的平滑切换方案

在高可用系统中,服务的平滑切换是保障业务连续性的关键环节。通过引入负载均衡器与健康检查机制,可实现故障节点的自动摘除与流量重定向。
数据同步机制
主备节点间需保持状态一致,常用异步复制或半同步复制方式。以MySQL为例:

-- 配置主从复制
CHANGE MASTER TO 
  MASTER_HOST='master_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001';
START SLAVE;
该配置确保从库实时拉取主库binlog,延迟控制在毫秒级。
切换策略对比
策略优点缺点
主动-被动资源隔离好资源利用率低
主动-主动高并发处理数据冲突风险
流量灰度切换
通过权重逐步迁移流量,例如Nginx配置:

upstream backend {
    server 192.168.1.10 weight=8;  # 旧节点
    server 192.168.1.11 weight=2;  # 新节点
}
参数weight控制分发比例,实现渐进式切换,降低风险。

第五章:构建更安全的数据库访问体系

最小权限原则的实施
在生产环境中,数据库账户应遵循最小权限原则。例如,Web应用账户不应拥有DROP或ALTER权限。通过创建专用角色并分配必要权限,可显著降低误操作与攻击风险。
  • 为读写用户仅授予 SELECT、INSERT、UPDATE、DELETE
  • 禁止普通应用账户访问系统表(如 mysql.user)
  • 定期审计权限分配,移除长期未使用的账户
使用连接池与加密传输
现代应用通常通过连接池管理数据库连接。以下是一个使用 Go 的 database/sql 配合 TLS 加密的示例:
db, err := sql.Open("mysql", 
    "user:password@tcp(localhost:3306)/dbname?tls=custom")
if err != nil {
    log.Fatal(err)
}
// 配置连接池
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
确保服务器配置强制启用 TLS,并在 DSN 中验证证书。
动态凭证与 Secrets 管理
静态密码存在泄露风险。推荐集成 Vault 等 secrets 管理工具,实现动态生成短期有效的数据库凭证。
方案有效期适用场景
Vault 动态凭证1小时微服务架构
IAM Token 认证15分钟云数据库(如 RDS IAM Auth)
SQL 注入防护实践
预编译语句是防御 SQL 注入的核心手段。避免字符串拼接构造查询:
stmt, _ := db.Prepare("SELECT name FROM users WHERE id = ?")
rows, _ := stmt.Query(userID) // userID 来自外部输入
同时部署 WAF 规则监控异常查询行为,如频繁出现的 'OR 1=1' 模式。
模仿学习(Imitation Learning)概述 什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。...... 阅读详情

相关推荐

[面试]SoC验证工程师面试常见问题(三)

SoC 验证工程师面试中,SystemVerilog、UVM 和 SystemC 的代码题目通常涵盖面向对象编程、约束随机化、UVM 组件设计、内存建模等主题。通过练习上述示例题目和理解关键点,你可以更好地应对现场编码环节。如果有具体的面试方向(如特定协议验证)或公司偏好,可以提供更多信息,我会进一步定制题目和答案。祝你面试顺利!

元直的博客 1614

phaiapi数据库重写类

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34138139的博客 260

ADG同步性能优化:如何正确配置standby redolog避免WAIT_FOR_LOG状态

本文深入剖析了Oracle ADG(Active Data Guard)同步中常见的WAIT_FOR_LOG状态,指出其根源在于Standby Redo Log(SRL)配置不当。文章提供了从诊断到优化的完整实践指南,重点阐述了SRL大小匹配、组数充足等黄金配置法则,帮助架构师从根本上避免同步延迟,实现稳定高效的实时数据同步。

weixin_29200485的博客 333

PDO::ATTR_EMULATE_PREPARES

PDO有一项参数,名为PDO::ATTR_EMULATE_PREPARES ,表示是否使用PHP本地模拟prepare,此项参数默认值未知。而且根据我们刚刚抓包分析结果来看,php 5.3.6+默认还是使用本地变量转,拼接成SQL发送给MySQL Server的,我们将这项值设置为false,

笔记 1万+

提供一个微信投票刷票的js代码

最近几天,有个朋友找我去写一个脚本帮他 在微信上刷票、微信投票刷票,我大概看了一下,本次微信投票刷票其实就是根据微信的openid来限制,每个openid只能投三次票的限制。上图可以看出,其实只要openid,和toopenid即可,openid是自己的微信id,toopenid是投票对象的微信id,那我们定时修改openid即可给某一个人刷投票。把这段代码复制到浏览器F12之后的console里,直接回车即可开始微信投票刷票(刷新或关闭浏览器即可停止刷票)//生成随机的ip地址。

qq_858865388专业提供快速微信投票教程攻略和方法的博客 2万+

从零玩转显示屏:手把手教你用Arduino驱动SPI屏幕(附引脚定义图)

本文提供了一份详尽的Arduino驱动SPI屏幕的入门指南。从SPI接口的核心引脚定义(如DC、RESET)与RGB接口的区别讲起,手把手指导硬件连接与软件库配置,并最终通过一个天气显示器实战项目,帮助读者掌握驱动SPI屏幕、显示RGB色彩内容的核心技能。

weixin_29189987的博客 131

为什么99%的PHP高手都禁用ATTR_EMULATE_PREPARES?真相令人震惊

解决PHP预处理隐患,掌握PDO安全最佳实践。通过关闭PDO ATTR_EMULATE_PREPARES,确保SQL语句由数据库原生预处理,杜绝SQL注入风险,提升执行效率。适用于高安全要求的Web应用开发,值得收藏。

LiteCode的博客 755

【LLC快速上手系列】如何在LLC谐振里优雅地调死区时间?

用示波器死盯Vds波形,找到ZVS临界点;别听“经验值”,亲自调才准;死区时间并非越短越好,也不是越长越稳,而是要“刚刚好”;用热成像看MOSFET温升变化,ZVS调好了,温度马上掉2~5℃;轻载难ZVS?适当提升频率 or 降低Lr可破!

weixin_43199439的博客 493

WEB安全--SQL注入--PDO与绕过

PDO的原理与绕过手段

m0_74800552的博客 964

华为od 面试八股文_前端_01_含答案

华为od 面试八股文_前端_01_含答案

MISAYAONE的博客 2748

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

php cursor,PHP PDOStatement::closeCursor讲解

PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)说明语法bool PDOStatement::closeCursor ( void )PDOStatement::closeCursor()释放到数据库服务的连接,以便发出其他 SQ...

weixin_39613188的博客 252

IP-Guard安全网关实例

企业相关情况: 1.OA系统,主要为日常工作使用,该系统IP为192.168.1.2,端口为8080; 2.文件共享服务器,用于存放日常工作资料和文档,该文件共享服务器的IP为192.168.1.1,其中\\192.168.1.1\private 目录中的存放着公司重要文档,不能随意外传; 3.安全网关已采用串联的方式联入网络,IP为192.168.2.6,所有机器访问OA系统和文件共享服务...

IP-Guard专栏 706

$pdo->setAttribute是干什么的?

方法是PDO提供的一个非常有用的工具,可以用来定制PDO对象的行为,特别是错误处理模式的设置,这对于编写健壮的应用程序非常重要。通过合理设置PDO的属性,可以提高代码的可读性和可维护性,同时也能更好地控制程序的行为。

长风破浪会有时的博客 642

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PHP中PDO关闭连接的问题

PHP中PDO关闭连接的问题在之前我们手写 mysql 的连接操作时,一般都会使用 mysql_close() 来进行关闭数据库连接的操作。不过在现代化的开发中,一般使用框架都会让我们忽...

硬核项目经理 2367

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

php使用PDO从数据库表中读取数据

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

qq_16752369的博客 5182

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用PDO查询mysql避免SQL注入

使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严紧,就有SQL注入风险。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险。 PDO(PHP Data Object) 是PHP5新加入的一个重大功能...

weixin_34194359的博客 276

php pdo attr_emulate_prepares,PDO操作,设置了ATTR_EMULATE_PREPARES属性为false后发现还是在本地模拟prepare...

PDO操作,设置了ATTR_EMULATE_PREPARES属性为false后发现还是在本地模拟prepare//连接数据库部分try{$dbh = new PDO('mysql:dbname=test;host=localhost','root','root');//设置捕获异常$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCE...

weixin_33026363的博客 410

PDO::ATTR_EMULATE_PREPARES属性设置为false引发的血案

前段时间给pdo设置了下emulate_prepare属性,引发了这次的血案。在这记录下事情的经过,没准大家能避免同样的错误。 先说以下环境。php 5.2.5,mysql 5.0.81,服务器使用的GBK编码。 起因 首先是看到一个报错信息,说是sql语句的syntax err...

1376

简短的PDO指南 (1)

Q:什么是PDOA:pdo-php data object 是一个数据库访问层,提供统一的方法去访问多种数据库。连接msql数据库通过mysql_*方法可以说是老方法(已经在5.5之后被废除了)$link = mysql_connect('localhost', 'user', 'pass'); mysql_select_db('testdb', $link); mysql_set

请叫我搞向 930

php操作pdo实现删除

&lt;?php header("Content-type: text/html; charset=utf-8"); $dbms='mysql'; $dbName='goodsdb'; $user='root'; $pwd='root'; $host='localhost'; $charset = 'utf8'; $dsn="$dbms:host=$host;dbname=$dbName;char...

dzyweer的博客 3488

【JDBC】JDBC和连接池的关系

1. 前言 一直以为连接池是对JDBC的封装,今天再次回顾Java基础的时,才发现并非完全如此。连接池只是包装/操作了JDBC API 接口,然后再实际运行的时候,这些接口的具体实现则 下面是知乎上的一个图:JDBC和连接池的关系 2. JDBC和连接池的关系 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。简单说可以通过JDBC来访问数据库, 而连

pangpd的博客 2639
上一篇: 你真的懂[Bind(Prefix)]吗?ASP.NET Core模型绑定前缀的隐秘世界
下一篇: 【PHP 7.1类型系统升级】:可为空类型数组的5大实战应用场景揭秘
InstrFun
博客等级 码龄1年 142粉丝 1990原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值