设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] PHP以指定字段为索引返回数组数据

[复制链接]

尚未签到

发表于 2017-4-10 11:37:47 | 显示全部楼层 |阅读模式
  很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码。所以,在完成每个新项目的时 候,适当的做些项目总结、代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好、速度更快的实现方法等等。
  牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性、逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员。我们不做日夜加班到深夜,拼代码量的程序员!
  这篇博客和大家分享几个使用得PHP编程技巧,有些技巧是在看别人代码的时候学来的,有些是自己总结的。
  以特定字段为索引,返回数据库取的数据数组
  举个例子容易些:
  假如你要统计指定站点从其它网站来的流量情况,并且做一个小后台,查看每个网站每天带来的流量情况。我们先建2张数据表:
  表一、站点配置表(只统计这些网站的流量)

CREATE TABLE `site_config` (
`id` smallint(5) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`site_url` varchar(128) NOT NULL COMMENT '网站URL地址',
`site_name` varchar(80) NOT NULL COMMENT '网站名称',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY  (`id`),
UNIQUE KEY `adid` (`sid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='站点配置表';


表二、站点流量统计表(来一个用户一条记录)
CREATE TABLE `site_stat` (
`id` int(11) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`ip_address` varchar(32) NOT NULL COMMENT '用户IP',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='站点流量统计表' ;

  因为site_config表读操作大于写操作,所以类型设置为MyISAM;而site_stat表写操作大于读操作,因此,我把表类型设置为InnoDB。(这些地方也是你在设计数据的时候需要考虑的,速度提高不少)。
  回到正题,假如表site_config里有这样几条数据:
  数据格式为:id,sid,site_url,add_time
  1,200,baidu.com,2013-06-30 14:20:00
  2,201,google.com,2013-06-30 14:20:00
  3,202,cnblogs.com,2013-06-30 14:20:00
  4,203,codejia.net,2013-06-30 14:20:00
  站点流量统计表site_stat里已经产生了一些数据,如下:
  数据格式为:id,sid,ip_address,add_time
  1,200,167.87.32.4,2013-06-30 14:40:00
  2,200,192.168.11.56,2013-06-30 14:40:10
  3,202,167.87.32.4,2013-06-30 14:40:10
  4,202,192.168.11.56,2013-06-30 14:40:20
  5,203,167.87.32.4,2013-06-30 14:40:20
  6,202,10.10.10.10,2013-06-30 14:40:30
  7,200,167.87.32.4,2013-06-30 14:40:31
  你在后台需要做的报表格式为:日期,网站ID,网站URL,流量数 (没有流量的站点也要展示,流量显示为0)
  你可能会想到根据日期,在表site_stat里根据sid group by之后再left join表site_config,这显然不是我将分享的方法。
  用2条SQL来搞定,一条是取所有的站点;另一条是取指定日期下站点流量统计数。
  SQL1取所有站点:

SELECT sid,site_url,site_name FROM site_config


SQL2取站点统计(假如为今天):
SELECT sid,COUNT(1) AS come_total FROM site_stat
WHERE add_time>='2013-06-30 00:00:00'
AND add_time<='2013-06-30 23:59:59'
GROUP BY sid


前面说了一大堆都是为后面做铺垫,分享一个PHP以传过去的字段为索引,返回二维数组的方法:
protected function getList($sql,$filed = null){
$res = mysql_query($sql,$this->link_sc);
$data = array();
if($filed === null){
while($row = mysql_fetch_assoc($res)){
$data[] = $row;
}
}else{
while($row = mysql_fetch_assoc($res)){
$data[$row[$filed]] = $row;
}
}
return $data;
}

  把你的SQL传进入,并把需要索引的字段传进入就OK,前提是传进去的字段必须要在select返回的字段里。
  我们在取所有站点的时候不需要传过去字段,但在取站点流量统计的时候我们把,站点sid传过去,即如下:

$sites = getList($sql1);  //所有站点
$data = getList($sql2,'sid');  //站点流量数据,以sid为索引返回二维数组


最后在展示报表的时候,用foreach循环$sites,取流量的时候到数组$data里去取索引为sid的数据就OK了。  非常方便,并且非常容易掌握,我就经常这么干。
  最后看下上表的统计结果报表:
  格式为:日期,网站ID,网站URL,流量数
  2013-06-30,200,baidu.com,3
  2013-06-30,201,google.com,0
  2013-06-30,202,cnblogs.com,3
  2013-06-30,203,codejia.net,1
  总结:貌似写这么多就说明那样一个小的技巧哈,但是,可千万别小看这个技巧,能节约你很多时间。所以,大家在写代码的时候多多总结,多多来博客园和大家交流、学习,编程水平一定会进步很快的!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362881-1-1.html 上篇帖子: 解决php snoopy远程获取数据的稳定性问题 下篇帖子: Java与php共享Memcached存储数据中的问题与解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表