PHP与mysql这对黄金搭档配合的相当默契,但偶尔也会遇到一些小需求不知道该怎么做,例如今天要谈到的:如何判断sql语句查询的结果集是否为空!...我们以查询学生信息为例,来看看究竟如何实现我们的需求。...2 李四 男 15 18 2 3 王美丽 女 16 17 5 我们来看看sql查询功能代码,我们要将年龄为16岁的学生信息都查出来; 以上便是查询功能,当结果集不为空时,一切正常,当数据集为空时,会得到一个空白的ul标签, 作为使用者却不知道为什么没有得到数据,此时我们需要给用户一个提示信息,那么我们就需要判断这个结果集是否为空...php //方法一 获取select结果集的行数 $rows=mysql_query("select * from `student` where `age`='16';"); if (mysql_num_rows
* 20110630 * 整体修改方法,合并部分参数 * 规范代码,一个方法里只有1个return语句 */ /* 参数说明 int $debug 是否开启调试,开启则输出...需要查询的数据库字段,允许为空,默认为查找全部 string $sqlwhere 查询条件,允许为空 string $orderby 排序,允许为空,默认为id倒序 */ function...数据库表 string $fields 需要插入数据库的字段 string $values 需要插入数据库的信息,必须与$fields一一对应 */ function hrInsert...delete,无返回信息 1 返回执行条目数 string $table 数据库表 string $sqlwhere 删除条件,允许为空 */ function...> 另外一段代码是基于我这个数据库操作类的事务实例: /* 注意,数据库操作表类型必须为InnoDB,其他类型不支持事务 PDO事务机制 $pdo->beginTransaction(
,开启则输出sql语句 int $getcount 是否记数,返回值为行数 int $getrow 是否返回值单条记录...string $table 数据库表 string $fields 需要查询的数据库字段,允许为空,默认为查找全部...string $sqlwhere 查询条件,允许为空 string $orderby 排序,允许为空,默认为id倒序 *...需要插入数据库的字段 string $values 需要插入数据库的信息,必须与$fields一一对应 */ function hrInsert...,允许为空 */ function hrDelete($debug,$execrow,$table,$sqlwhere=""){ global$pdo;
PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个抽象访问层。...f.lastInsertId:返回最小插入数据库的行。 g.prepare:为执行准备SQL语句,配合绑定操作等,返回语句后需要执行PDOStatement。...a.bindColumn:绑定一个PHP变量到结果集的输出列。 b.bindParam:绑定一个PHP变量到预处理语句中的参数。...c.bindValue:绑定一个值与处理语句中的参数。 d.columnCount:返回结果集中列的数量。...为了利用PDO的安全性,因此在拼接SQL时,需要将用户输入的参数使用占位符进行替换(即在拼接时使用冒号+字段名,或者使用问号),并且在完成sql拼接以及PDO类的prepare方法后,使用PDOStatement
PDO::exec PDO::exec — 执行一条 SQL 语句,并返回受影响的行数(PHP 5 = 5.1.0, PECL pdo = 0.1.0) 说明 语法 int PDO::exec (...PDO::exec() 不会从一条 SELECT 语句中返回结果。对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用PDO::query()。...参数说明: statement :要被预处理和执行的SQL 语句。 返回值 PDO::exec()返回受修改或删除 SQL 语句影响的行数。如果没有受影响的行,则 PDO::exec() 返回 0。...下面例子依赖 PDO::exec() 的返回值是不正确的,其中受影响行数为 0 的语句会导致调用 die() : <?...实例 执行一条 DELETE 语句 计算由一条不带 WHERE 字句的 DELETE 语句删除的行数。 <?
,允许为空,默认为查找全部,两种传值模式 * 普通模式: * 'username, password' * 数组模式: * array...('username', 'password') * string/array $sqlwhere 查询条件,允许为空,两种传值模式 * 普通模式: * 'and...* array('username = "test"', 'type = 1', 'dt = now()') * string/array $sqlwhere 修改条件,允许为空...无返回信息 * 1 返回执行条目数 * string $table 数据库表 * string/array $sqlwhere 删除条件,允许为空,两种传值模式...有时候,sql过于复杂,导致无法使用类里提供的方法去组装sql语句,这时候就需要一个功能,就是能直接传入我已经组装好的sql语句执行,并返回信息。
PDO(PHP Database Object)扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。...PDO为PHP访问各类数据库定义了一个轻量级一致性的接口,无论什么数据库,都可以通过一致的方法执行查询和获取数据,而不用考虑不同数据库之间的差异,大大简化了数据库操作。...使用PDO可以支持mysql、postgresql、oracle、mssql等多种数据库。 什么是预处理? 成熟的数据库都支持预处理语句(Prepared Statements)的概念。...$sql = "delete from persons where id = ?"...auto_increment 解决方法 可以加入自增长或者预处理语句中加入主键字段 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn
PHP中的PDO操作学习(三)预处理类及绑定数据 要说 PDO 中最强大的功能,除了为不同的数据库提供了统一的接口之外,更重要的就是它的预处理能力,也就是 PDOStatement 所提供的功能。...因为它的存在,才让我们可以安心地去使用而不用操心 SQL 语句的拼接不好所带来的安全风险问题。当然,预处理也为我们提升了语句的执行效率,可以说是 PDO 的另一大杀器。...绑定字段 接下来就是重点内容了,在预处理语句中,我们可以使用占位符来绑定变量,从而达到安全处理查询语句的作用。通过占位符,我们就不用去自己拼装处理带单引号的字段内容了,从而避免了 SQL 注入的发生。...当然,预处理语句和占位符是任何操作语句都可以使用的。它的作用就是用绑定的值来替换语句中的占位符所在位置的内容。...() 语句执行之前完成,否则绑定的就是一个空的数据 bindColumn 这个方法是用于绑定查询结果集的内容的。
image.png 了解pdo,连接数据库的方法,pdo中执行sql语句的方法,pdo中获取结果集的方法,掌握pdo中获取sql语句中的错误,错误处理的方法,事务处理,pdo中存储过程。...> dsn为数据源,提供连接数据库需要的信息。...:host=$host; dbname=$dbName"; $query="delete from tb_da where id=2"; // sql语句 try{ $pdo = new PDO($dsn...> pdo中捕获sql语句中的错误 使用默认模式 PDO::ERRMODE_SILENT pdo::errmode_silent 使用警告模式 PDO::ERROMODE_WARNING...$query); // 执行查询语句,并返回结果集 echo "errorCode为: ".
PHP中的PDO对象操作学习(一)初始化PDO及原始SQL语句操作 PDO 已经是 PHP 中操作数据库事实上的标准。包括现在的框架和各种类库,都是以 PDO 作为数据库的连接方式。...查询语句 大多数情况下,使用 PDO 我们都会用它的预处理能力来编写 SQL 语句,一来是性能更好,二来是更加安全。...而 user2 类则是一个空的类。通过测试结果来看,类的属性对于 PDO 来说并不重要。它会默认创建数据库查询到的字段属性,并将它赋值给对象。...很多小伙伴会以这个进行判断是否更新成功,但如果数据没有修改,那么它返回的将是 0 ,SQL 语句的执行是没有问题的,逻辑上其实也没有问题。...也就是说,在前端判断更新操作的时候,需要判断字段是否都有改变,如果没有改变的话那么不应该提示更新失败。
1.判断是否存在注入,注入是字符型还是数字型 2.猜解SQL查询语句中的字段数 3.确定显示的字段顺序 4.获取当前数据库 5.获取数据库中的表 6.获取表中的字段名 7.下载数据 下面对四种级别的代码进行分析...2.猜解SQL查询语句中的字段数 输入1' or 1=1 order by 1 #,查询成功: ? 输入1' or 1=1 order by 2 #,查询成功: ?...说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。...2.猜解SQL查询语句中的字段数 抓包更改参数id为1 order by 2 #,查询成功: ? 抓包更改参数id为1 order by 3 #,报错: ?...说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。 3.确定显示的字段顺序 抓包更改参数id为1 union select 1,2 #,查询成功: ?
(PHP Data Objects),简称为PDO,是为解决数据库访问问题而构建的PHP扩展。...我们可以通过捕获异常来优雅的处理它。值得庆幸的是,在这种情况下,我们不再需要把连接放在if语句中,因为它有一个干净且易于阅读的代码库(try...catch语句)。...PDOStatement 类实现可Traversable 接口吗,该接口是迭代器的基本接口,这也意味着它可以在循环等迭代语句中使用。...但是,这里要注意的一件更重要的事情是,PHP会验证列表的值是否和数据库中的字段数据类型相匹配,列表这么多的数据,这就很容易产生不匹配错误。...5.1、IN 子句: 在prepare 语句中构建IN子句是一项有趣的任务。
,我们没有给 PDO 对象指定 PDO::ATTR_DEFAULT_FETCH_MODE 属性,所以它是返回的默认的 PDO::FETCH_BOTH 格式,也就是字段名和下标同时存在的。...所以我们如果在不重新 execute() 情况下再次调用 fetchAll() 的话,获取的就是空的数据。因为游标已经到底了。...查询语句返回行数 需要注意的是,在查询语句中,有些数据是可能返回此语句的行数的。但这种方式不能保证对所有数据有效,且对可移植的应用更不要依赖这种方式。...其实它就像是 PDO 对象的 exec() 方法所返回的数据。在不使用预处理语句的情况下,直接使用 PDO 的 exec() 方法执行 SQL 语句后,返回的也是语句执行后受影响的行数。...(); echo $rowCount, PHP_EOL; // 41 增、删、改语句返回受影响的行数 $stmt = $pdo->prepare("insert into zyblog_test_user
PDO 错误模式为异常 //编写操作数据库的程序 $conn=null;//关闭 } catch(PDOException $e){...PDO 错误模式为异常 // $sql = "insert into userinfo "." values(1,"."'"....设置第一个字段是空,意思是不填写第一个字段(默认就会自动递增) ? ? 运行测试 http://47.92.31.46/PHPPDOtest.php?...为直观看到下面的测试增加一个用户名和密码 ? ?...查询表格中的所有username字段的值 $sql = "select username from userinfo";//查询表格中的所有username字段的值 $
堆叠查询注入攻击 堆叠查询注入攻击的测试地址在本书第2章。 堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠查询注入就是利用这个特点,在第二个SQL语句中构造自己要执行的语句。...堆叠查询注入的语句如下: ';select if(substr(user(),1,1)='r',sleep(3),1)%23 从堆叠查询注入语句中可以看到,第二条SQL语句 (select if(substr...图4-43 后面获取数据的操作与时间注入的一样,通过构造不同的时间注入语句,可以得到完整的数据库的库名、表名、字段名和具体数据。执行以下语句,就可以获取数据库的表名。...图4-44 堆叠查询注入代码分析 在堆叠查询注入页面,程序获取GET参数ID,使用PDO的方式进行数据查询,但仍然将参数ID拼接到查询语句中,导致PDO没起到预编译的效果,程序仍然存在SQL注入漏洞...> 使用PDO执行SQL语句时,可以执行多语句,不过这样通常不能直接得到注入结果,因为PDO只会返回第一条SQL语句执行的结果,所以在第二条语句中可以用update语句更新数据或者使用时间注入获取数据。
普通注入 ●数字型SQL注入 当程序的变量没有做处理而直接拼接在SQL注入语句中,没有单引号的保护,就容易造成SQL注入。...SQL注入语句中,虽然有单引号的保护,但我们如果能闭合SQL,也就产生了SQL注入漏洞。...例如 PHP的编码方式为UTF-8,而 mysql的被设置了使用GBK编码时,由于mysql在使用GBK编码的时候,会产生宽字节自主漏洞,即将两个ascii字符误认为是一个宽字节字符(如汉字)。...预编译 防止SQL注入 ③PDO扩展: PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口。...PDO扩展也为开发者经常使用的扩展,例如thinkphp框架就是使用的PDO扩展。
当开发人员在运行过程中根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。...以PHP语句为例,命令如下: $query = "SELECT * FROM users WHERE id = $_GET['id']"; 由于这里的参数ID可控,且被带入数据库查询,所以非法用户可以任意拼接...当传入的参数ID为and1=1时,执行的SQL语句如下: select * from users where id = 1 and 1=1 因为1=1为真,且where语句中id=1也为真,所以页面会返回与...2.使用预编译语句 使用PDO预编译语句时需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库中数据的增加、删除、修改、查询。示例代码如下: <?...php $pdo=new PDO('mysql:host=127.0.0.1;dbname=test','root','root'); $stmt=$pdo->prepare('select * from
几种常见的SQL注入攻击 堆叠查询注入 先说一下堆叠查询,堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠注入就是利用这个特点,在第二条SQL语句中构造自己要执行的句子。 然后看代码 在堆叠注入页面中,程序获取GET参数id,使用PDO的方式进行数据查询,但是还是将id拼接到SQL语句中,导致POD没起到预编译的效果。程序仍然存在SQL注入。...使用PDO执行SQL语句时,可以执行多条语句,但只返回第一条执行的结果。所以第二条语句中可以使用时间盲注等来会获取数据。时间注入上一篇文章分析了。...我们发现构造的时间注入语句成功执行,之后可以通过这种方法猜解出,库名,表名,字段及内容。...宽字节注入攻击 先说一下宽字节注入原理,如果我们注入的参数为字符型,我们构造自己的SQL语句的时候需要用单引号闭合前面的SQL语句,但是咱们输入的单引号被转义(反斜杠)了,导致参数无法逃逸单引号的包围,
以下为一些语法规则: PHP 中 SQL 查询语句必须使用引号 在 SQL 查询语句中的字符串值必须加引号 数值的值不需要引号 NULL 值不需要引号 INSERT INTO 语句通常用于向 MySQL...在前面的几个章节中我们已经创建了表 "MyGuests",表字段有: "id", "firstname", "lastname", "email" 和 "reg_date"。...注意: 如果列设置 AUTO_INCREMENT (如 "id" 列) 或 TIMESTAMP (如 "reg_date" 列),,我们就不需要在 SQL 查询语句中指定值; MySQL 会自动为该列添加值...以下实例向 "MyGuests" 表添加了新的记录: 实例 (MySQLi - 面向对象) 实例 (PDO) <?
对象用于执行SQL $command=$connection->createCommand($sql); // 接下来,将SQL语句中的形式参数,替换为实际参数 $command->bindParam(...":username",$username,PDO::PARAM STR); // 这与PDO有点不同,PDO中不带冒号 $command->bindParam(":email",$email,PDO...// 使用CDbDataReader对象的bindColumn()方法将结果集中的列绑定到PHP变量。...AR类中的一个属性表示,如果试图通过属性访问表中没有字段,将会抛出一个异常。...// 如果关系查询执行后没有匹配的结果,返回将会是NULL或空的数组。 2).eager loading approach 热心的关系查询 //这名字真的很萌!
领取专属 10元无门槛券
手把手带您无忧上云