在上节代码的基础上我们继续拓展功能,这节开始写查询功能。
先说说一个基本查询都有哪几个部分组成了?
select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
大体上一个基本查询有“表名”、“表字段”、“where子句”、“group by 子句”、“having子句”、“order by子句”、“limit子句”这几部分组成。我们准备这样设计,每一部分在类里都写一个方法专门做设置。看代码:
先设置两个私有属性,$_options数组用来存组成一条完整的SQL语句的各个部分,$_sql存一条完整的SQL语句。
把原先的getNew方法重新命名table,为$_options数组添加表名数据。30行是挺重要的一行代码,可防止上一条SQL语句的参数影响到下一条SQL语句。
各个部分的方法都已写好,开始写一个方法把$_options各项组成一条完整的SQL语句:
再写一个可以执行select语句的方法:
说明下:
130行执行了PDO对象的prepare方法,这个方法返回了另一个对象——PDOStatement对象
PDOStatement对象方法有:
131行execute方法执行一条SQL语句
132行 fetchall方法可以把结果集赋予一变量。它的参数可以指定返回结果集的形式,这里我们使用的最常用的“PDO::FETCH_ASSOC”,你也可以查手册或搜索都有哪些其他参数值。
最后我们再写一个方法:
139行合成一条SQL语句,140行执行这条SQL语句。
我们来测试下代码看看能不能查询出数据:
看来是没有问题了。
细节:
在mysql中,id字段是int类型,user_name字段是varchar类型,而通过PDO取得的结果集,所有的数据都是字符串类型。
这也是因为字符串类型是最安全的数据类型。假如mysql是64位,PHP是32位,按照原类型直接获取,就会报错。mysql bigint类型被PHP强制按照int类型获取,操作位数不够,获取的数值肯定是错误的。
如果觉着这样写反而不方便了,也可以使用Db类的query方法直接输入原生的SQL语句。