PHP程序循环迭代中谨慎操作数据库
PHP草根滴我们,一直以为数据库是万能,为了实现功能却很少去考虑效率与数据库瓶颈问题。比如在一个循环中查询数据库,一个迭代方法中查询数据库都是非常不可取滴,尤其是前端程序!在访问量不大,并发少时看不出任何问题!一旦访问量突增,并发访问量多时往往就成数据库服务器负荷过重,严重情况会宕机,后果真不堪设想,而且在这种情况下PHP程序员往往很难查具体原因。
先看一个迭代案例代码,当分类达到1000个以上滴时候,调用一次就要查询超1000次以上滴数据库查询,这样滴代码是何其恐怖,不用再细说了吧!
代码如下 | 复制代码 |
/** |
再有一些例子,有些同学喜欢用while,for等循环中作数据库查询操作,同样是不可取滴,还是那句话,当数据库并发更新不大,或者访问量不大滴情况下,数据库服务器负荷也是很重滴,操作时须谨慎。特别是在作为封装滴函数内部,因为往后滴程序你会不小心滴多调用几次这个函数,那造成服务器滴开销是无法估量滴。
PHP5.2.0及以上版本具有json_decode函数,该函数是用来解析JSON格式的数据,可以返回array(数组)或object(对象)两种结果,下面将分两种情况具体介绍json_decode的用法以及如何取得我们想要的值。1.json_decode()
json_decode
(PHP 5 >= 5.2.0, PECL json >= 1.2.0)
json_decode — 对 JSON 格式的字符串进行编码
说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
参数
json
待解码的 json string 格式的字符串。
assoc
当该参数为 TRUE 时,将返回 array 而非 object 。
返回值
Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned.
范例
Example #1 json_decode() 的例子
代码如下 | 复制代码 |
<?php 上例将输出: object(stdClass)#1 (5) { array(5) {
结果为: Array ( [0] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => stdClass Object ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) ) |
可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下
代码如下 | 复制代码 |
echo json_decode($data,true); 结果: Array ( [0] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [1] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) [2] => Array ( [Name] => a1 [Number] => 123 [Contno] => 000 [QQNo] => ) ) |
可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode("$arr",true)是把它强制生成PHP关联数组.
假如我们获取的JSON数据如下:(可以使用curl、fsockopen等方式获取)
代码如下 | 复制代码 |
{ |
一、json_decode返回array的方式:
json_decode($data,true);用json_decode函数返回array的方式得到:
代码如下 | 复制代码 |
Array ) ) |
我们在PHP语言中可以用以下方法取得我们想要的值:
代码如下 | 复制代码 |
<?php |
二、json_decode返回object的方式:
json_decode($data);
用json_decode函数返回object的方式得到:
代码如下 | 复制代码 |
stdClass Object ) ) |
我们在PHP语言中可以用以下方法取得我们想要的值:
代码如下 | 复制代码 |
<?php STR; |
根据IP地址查找我们的IP地址所在地,这个最简单办法就是直接把ip在百度搜索就可以知道你的IP地址所在地了,但对于一些网站我们不能使用此方法,但可以通过api来实现
例子,利用第三方接口实例
代码如下 | 复制代码 |
<p>请输入ip地址:<input type="text" name="ip" /></p> <p><input type="submit" value="查询" /></p> </form> <?php //获取ip地址 //$ip = $_SERVER['REMOTE_ADDR']; //自动获取客户端的IP //ip对应的地区 if(!empty($_POST['ip'])){ $ip = $_POST['ip']; //接口地址,这样返回的是一个xml结果集, $str = file_get_contents("http://www.yodao.com/smartresult-xml/search.s?type=ip&q=".$ip); //这里要得到里面的地址信息,提取xml方法有很多,我用的是正则。 preg_match_all( "/<location>(.*?)</location>/",$str,$addr1); //最终结果,如图2; $addr = $ip."=>".$addr1[1][0]; echo $addr; } ?> |
例子,利用QQWry
目前只支持PHP5版本。
安装
1.sudo pecl install qqwry-beta或者直接下载编译,phpize && ./configure && make && sudo make install
2.编辑php.ini,加入extension=qqwry.so
3.重启http server
使用很简单,首先就是实例化,传入纯真数据库的文件路径,然後调用q方法。该方法返回一个数组,第一个值为地址1,例如南宁市,第二个值为地址2,例如邕 宁区电信ADSL。看例子吧,一目了然。下面的iconv是把数据从GB2312转到UTF-8,如果你的站点是用GB2312,那么这一步是不需要的。
代码如下 | 复制代码 |
list($addr1,$addr2)=$qqwry->q('127.0.0.1'); $arr=$qqwry->q('222.216.47.4'); $arr=$qqwry->q('64.233.187.99'); |
输出:
本机地址|
广西南宁市|(青秀区)电信ADSL
美国|加利福尼亚州Google公司
例子,如果你只要查查IP地址就不需相面那么复杂了,如我在百度输入 110.110.110.110
显示地址为
IP地址: 110.110.110.110黑龙江省哈尔滨市 铁通
如下图所示
在php中php://input和$_POST有什么区别呢,post是我们常用的获取表单提交的数据的一个例子,但是php://input估计很多朋友和我一样没有怎么用过,下面我们就一起来看看吧。
我们先来看两个实例
例子:php://input
代码如下 | 复制代码 |
<form action="post.php" method="post"> |
post.php
代码如下 | 复制代码 |
<? echo file_get_contents("php://input");?> |
例子,post
html
代码如下 | 复制代码 |
<form action="welcome.php" method="post"> |
welcome.php
代码如下 | 复制代码 |
Welcome <?php echo $_POST["name"]; ?>.<br /> You are <?php echo $_POST["age"]; ?> years old! |
通过 HTTP POST 发送的变量不会显示在 URL 中。
当我们用$_POST接受不到页面传过来信息时,我们可以用php://input去接受值,那么他俩有什么区别
首先当$_POST 与 php://input可以取到值时$HTTP_RAW_POST_DATA 为空;
$http_raw_post_data是PHP内置的一个全局变量。它用于,PHP在无法识别的Content-Type的情况下,将POST过来的数据原样地填入变量$http_raw_post_data。它同样无法读取Content-Type为multipart/form-data的POST数据。需要设置php.ini中的always_populate_raw_post_data值为On,PHP才会总把POST数据填入变量$http_raw_post_data。
然后$_POST以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换;
而php://input 通过输入流以文件读取方式取得未经处理的POST原始数据;
php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype=”multipart/form-data”;
php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。
今天在要php5.4.6中编译安装一个php-screw了,但是怎么操作都不成功了,后来看到有朋友博客写到一篇关于php-screw在php5.4.6上编译失败问题的解决方案,于是拿过来试了一下没想到还真解决了,下面我把文章拿出来与大家一起分享。php-screw版本问题,报错
make
/bin/sh /root/php_screw-1.5/libtool --mode=compile cc -I. -I/root/php_screw-1.5 -DPHP_ATOM_INC -I/root/php_screw-1.5/include -I/root/php_screw-1.5/main -I/root/php_screw-1.5 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/php_screw-1.5/php_screw.c -o php_screw.lo
libtool: compile: cc -I. -I/root/php_screw-1.5 -DPHP_ATOM_INC -I/root/php_screw-1.5/include -I/root/php_screw-1.5/main -I/root/php_screw-1.5 -I/usr/include/php -I/usr/include/php/main www.111cn.net -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/php_screw-1.5/php_screw.c -fPIC -DPIC -o .libs/php_screw.o
/root/php_screw-1.5/php_screw.c: In function ‘zm_startup_php_screw’:
/root/php_screw-1.5/php_screw.c:124: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
/root/php_screw-1.5/php_screw.c: In function ‘zm_shutdown_php_screw’:
/root/php_screw-1.5/php_screw.c:133: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
make: *** [php_screw.lo] Error 1
修改php-screw.c
代码如下 | 复制代码 |
|
相关文章
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
Antd-vue Table组件添加Click事件,实现点击某行数据教程
这篇文章主要介绍了Antd-vue Table组件添加Click事件,实现点击某行数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-17- 这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
- 这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
- 这篇文章主要介绍了vue 获取到数据但却渲染不到页面上的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-19
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
- 某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
- 这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
- 这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
- mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
jquery中常用的SET和GET$(”#msg”).html循环介绍
复制代码 代码如下: $(”#msg”).html(); //返回id为msg的元素节点的html内容。 $(”#msg”).html(”new content“); //将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content $(”...2013-10-13- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04