要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更重要的就是它的预处理能力,也就是 PDOStatement 所提供的功能。因为它的存在,才让我们可以安心地去使用而不用操心 SQL 语句的拼接不好所带来的安全风险问题。当然,预处理也为我们提升了语句的执行效率,可以说是 PDO 的另一大杀器。
当我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而使用PHP的PDO扩展的 prepare 方法,就可以避免sql injection 风险。 PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,如
源/https://www.startutorial.com/articles/view/modern-php-developer-pdo
预处理语句就是准备好一个要执行的语句,然后返回一个 PDOStatement 对象。一般我们会使用 PDOStatement 对象的 execute() 方法来执行这条语句。为什么叫预处理呢?因为它可以让我们多次调用这条语句,并且可以通过占位符来替换语句中的字段条件。相比直接使用 PDO 对象的 query() 或者 exec() 来说,预处理的效率更高,它可以让客户端/服务器缓存查询和元信息。当然,更加重要的一点是,占位符的应用可以有效的防止基本的 SQL 注入攻击,我们不需要手动地给 SQL 语句添加引号,直接让预处理来解决这个问题,相信这一点是大家都学习过的知识,也是我们在面试时最常见到的问题之一。
PDOStatement::setFetchMode — 为语句设置默认的获取模式。(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现。只不过大部分情况下,大家都在使用框架,手写的机会非常少。
PDOStatement::fetch — 从结果集中获取下一行(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
一般在数据库中,我们保存的都只是 int 、 varchar 类型的数据,一是因为现代的关系型数据库对于这些内容会有很多的优化,二是大部分的索引也无法施加在内容过多的字段上,比如说 text 类型的字段就很不适合创建索引。所以,我们在使用数据库时,很少会向数据库中存储很大的内容字段。但是,MySQL 其实也为我们准备了这种类型的存储,只是我们平常用得不多而已。今天我们就来学习了解一下使用 PDO 如何操作 MySQL 中的大数据对象。
本文实例讲述了php封装的pdo数据库操作工具类与用法。分享给大家供大家参考,具体如下:
设置数据库句柄属性。下面列出了一些可用的通用属性;有些驱动可能使用另外的特定属性。
基于驱动: 1、安装扩展 php_pdo.dll 2、安装驱动 php_pdo_mysql.dll
PDOStatement::execute — 执行一条预处理语句(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
核心: 修复了错误#79329(一个空字节后get_headers()默默地被截断)(CVE-2020-7066) 修复了错误#79244(PHP在解析INI文件时崩溃)的问题。 修复了错误#63206(restore_error_handler无法还原以前的错误掩码)。 COM: 修复了错误#66322(COMPersistHelper :: SaveToFile可以保存到错误的位置)。 修复了错误#79242(COM错误常量与x86上的com_exception代码不匹配)。 修复了错误#79247(垃圾收集变体对象段错误)。 修复了错误#79248(遍历空的VT_ARRAY会引发com_exception)。 修复了错误#79299(com_print_typeinfo打印重复的变量)。 修复了错误#79332(永远不会释放php_istreams)。 修复了错误#79333(com_print_typeinfo()泄漏内存)。 CURL: 修复了错误#79019(复制的cURL处理上载空文件)。 修复了错误#79013(发布带有curl的curlFile时缺少Content-Length)。 DOM: 修复了错误#77569 :(在DomImplementation中写入访问冲突)。 修复了错误#79271(DOMDocumentType :: $ childNodes为NULL)。 Enchant: 修复了错误#79311(在大端架构下,enchant_dict_suggest()失败)。 EXIF: 修复了错误#79282(在exif中使用未初始化的值)(CVE-2020-7064)。 Fileinfo: 修复了错误#79283(libmagic补丁中的Segfault包含缓冲区溢出)。 FPM: 修复了错误#77653(显示运行者而不是实际的错误消息)。 修复了错误#79014(PHP-FPM和主要脚本未知)。 MBstring: 修复了错误#79371(mb_strtolower(UTF-32LE):php_unicode_tolower_full处的堆栈缓冲区溢出)(CVE-2020-7065)。 MySQLi: 修复了错误#64032(mysqli报告了不同的client_version)。 MySQLnd: 已实现FR#79275(在Windows上支持auth_plugin_caching_sha2_password)。 Opcache: 修复了错误#79252(预加载会导致php-fpm在退出过程中出现段错误)。 PCRE: 修复了错误#79188(preg_replace / preg_replace_callback和unicode中的内存损坏)。 修复了错误#79241(preg_match()上的分段错误)。 修复了错误#79257(重复的命名组(?J),即使不匹配,也更倾向于最后一种选择)。 PDO_ODBC: 修复了错误#79038(PDOStatement :: nextRowset()泄漏列值)。 反射: 修复了错误#79062(具有Heredoc默认值的属性对于getDocComment返回false)。 SQLite3: 修复了bug#79294(:: columnType()在SQLite3Stmt :: reset()之后可能失败。 标准: 修复了错误#79254(没有参数的getenv()未显示更改)。 修复了错误#79265(将fopen用于http请求时,主机标头注入不当)。 压缩: 修复了错误#79315(ZipArchive :: addFile不支持开始/长度参数)。
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
以下常量由本扩展模块定义,因此只有在本扩展的模块被编译到PHP中,或者在运行时被动态加载后才有效。
php mysql PDO 查询操作的实例详解 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', '
在生产环境中系统的错误信息不能暴露给用户,入口文件的 APP_DEBUG 默认为开启状态
PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(PHP 5 = 5.1.0, PECL pdo = 0.9.0)
PDOStatement::execute — 执行一条预处理语句(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::columnCount — 返回结果集中的列数。(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。(PHP 5 = 5.1.0, PECL pdo = 0.9.0)
PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::bindColumn — 绑定一列到一个 PHP 变量(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
在 ThinkPHP 5.1.23 之前的版本中存在 SQL 注入漏洞,该漏洞是由于程序在处理 order by 后的参数时,未正确过滤处理数组的 key 值所造成。如果该参数用户可控,且当传递的数据为数组时,会导致漏洞的产生。
PDOStatement::setAttribute — 设置一个语句属性(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
PDO::setAttribute — 设置属性(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::getColumnMeta — 返回结果集中一列的元数据(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个抽象访问层。启用方法是在php.ini中把extension=php_pdo.dll的注释去掉即可。 PDO包含三个预定义类,PDO、PDOStatement、PDOException,其中PDOException是对Exception类的扩展。 下面的这些类的方法很常用,故列出来进行说明。 1)PDO PD
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令(PHP 5 = 5.1.0, PECL pdo = 0.9.0)
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。(PHP 5 = 5.1.0, PECL pdo = 0.2.4)
PDOStatement::getAttribute — 检索一个语句属性(PHP 5 = 5.1.0, PECL pdo = 0.2.0)
本节我们将实现以下功能:创建并连接数据库、创建运营表、创建model类、编写login模板和编写登录功能,下面开始写bug
PDO(PHP Data Object)是有MySql官方封装的、基于面向对象编程思想的、使用C语言开发的数据库抽象层。
很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易;但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百万条数据为例,导出时间不过20秒,值得学习的一种大数据导出方式。
作者:matrix 被围观: 224 次 发布时间:2021-12-28 分类:mysql PHP | 无评论 »
PDO::getAttribute — 取回一个数据库连接的属性(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
PDOStatement::bindParam — 绑定一个参数到指定的变量名(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言,Java语言,和Perl的特点,利于学习,使用广泛,主要适用于web开发,PHP做出来的动态页面与其他的编程语言相比,PHP是将持续嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多,PHP还可以执行编译后的代码,编译后可以达到加密和优化代码的目的,让代码运行更快。
PDOStatement::bindValue — 把一个值绑定到一个参数(PHP 5 = 5.1.0, PECL pdo = 0.1.0)
关于预处理语句我们在上篇教程中已经简单介绍过,我们可以将其与视图模板类比,所谓预处理语句就是预定义的 SQL 语句模板,其中的具体参数值通过占位符替代:
说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程。实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常重要的类,这个类含有三个主要的武器:MySqlConnection, MySqlGrammar, MySqlProcessor。MySqlConnection主要就是在执行SQL时做连接MySql数据库操作,MySqlProcessor主要就是用来对执行SQL后的数据集做后置处理操作,这两点已经在之前上篇聊过,那MySqlGrammar就是SQL语法编译器,用来编译Fluent Api为SQL。最后使用MySqlConnection::select(sql, bindings)执行SQL。
不支持查询操作,返回受影响的行数。数据表使用此文中的pic表:MySQL指南之SQL语句基础
在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。
领取专属 10元无门槛券
手把手带您无忧上云