php中STRPOS查找失败返回的是FALSE注意事项
STRPOS用法
strpos(string,find,start)
我们看看strpos的一段代码:
//ajax获取分词
public function get_segment_words() {
$title = I('title');
$content = I('content');
$Segment = M('Segment');
$Segment_content = M('Segment_content');
$segment_array = $Segment->getField('id,word');
$setment_words = array();
foreach ($segment_array as $id => $word) {
if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
$segment_words[] = $word;
}
}
$segment_words = array_unique($segment_words);
$segment_words = implode(',', $segment_words);
echo $segment_words;exit; //ajax获取填充
}
注意这句代码:
if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
//TODO
}
如果匹配失败,strpos会返回bool类型的false,这个一定要注意。不然会出现什么情况呢?假如你要匹配的字符正好在第一个位置,对于strpos这个函数来说返回的是0,也就是位置0.这个时候实际上是匹配到了,结果返回0,如果这样判断就错了:
if (!strpos($content, $word))
举个例子:
内容:购物袋范德萨法拉点撒范德萨。
匹配:购物
如果要找内容里面是否有“购物”两个字,strpos会返回0,表示存在“购物”两个字,位置是0.
因此要用false!=strpos($find,$content)来判断匹配是否成功。
在手机中使用PHP接口与web对接时我们会做一个加密的值进行握手验证了,下面我们就来为各位介绍一些方法与原理了。方法一,固定一个值,如md5('www.111cn.net') 然后把生成的字符在url或post传递时进行验证
方法二,稍微复杂点双方约定好生成的格式
下面例子www.111cn.net简单讲解PHP接口开发加密技术:
如app要请求用户列表,api是“index.php?module=user&action=list”
app生成token = md5sum (‘user’.’2012-11-28′.’www.111cn.net’.list) = 880fed4ca2aabd20ae9a5dd774711de2;
则实际发起请求为 “index.php?module=user&action=list&token=880fed4ca2aabd20ae9a5dd774711de2”
服务器端接到请求用同样方法计算token:
$module = $_GET['module']; $action = $_GET['action']; $token = md5sum($module.date('Y-m-d',time()).'www.111cn.net'.$action); if($token != $_GET['token']){ alarm('access deny'); exit(); }
这样就判断了请求url参数是合法的,允许访问。关键是接口token参数的构造。
还有一种方法用到cookie,这种情况则不适用于读取接口数据的应用场景,适合在浏览器中访问接口。
1.请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。
优点:防止了服务器端api被随意调用。
缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。
2.第一次请求,要求username和password,验证通过,种cookie到客户端,app保存cookie值。
每次请求带上cookie。
点评:和pc上浏览器认证的原理一样了。
字符串与数字转换的前提是字符串为数字型否则就会转成0了,下面我们要介绍的是像0001000我们要转成1000,00这种,下面来看看。PHP 是一门脚本语言,但它很神奇,你用POST一串数字过去,用var_dump()打印出来,你会发现,这串数字的格式是string。
今天,我要做一个功能,把12位数字,如:000000100000
像上面这种以分为单位的数字,一般人看起来很麻烦,所以,我们要处理一下显示成如下的样子
像这样,就看起来方便一点。要怎么处理,我本打算用正则,但/d 是匹配出0-9的数字,我要从新写匹配方式,再三反思,还是用
简单的方式
function transAmt($value) { //将字符串转换成数组 $array = str_split($value); //对数组进行遍历 foreach($array as $key=>$va) { if($va != 0) { $start = $key; break; } } //对字符串组进行分割 $len = strlen($value) - $start; $substr = substr($value,$start,$len); //对数据进行处理,先获取子串的长度 $smallnum = substr($substr,-2,2); $bignum = substr($substr,0,$len-2); return $bignum.".".$smallnum; }
这样就完事了,就是把字符串转换成数组,再操作数组。
这应该算是PHP 操作字符串的惯用手法。
编程的最简单的思路:遇到问题,针对问题提出解决问题的方法,再多个问题总结,得到共同点。
总的来说,就是把面向过程的函数转换成面向对象的类。
文件上传中有一块非常重要的就是安全验证了,如果验证不合理就很容易给一些人把此利用上传非常的黑客文件了,那么对于新学php新手文件上传验证有多了解呢?如果不懂可以看看本文章。
最近遇到一个事,把自己坑了好久,我想说说我开始的想法
PHP的上传机制封装的很完全,基本几行代码就能实现,他的实现流程是这样的
UPLOAD到文件到临时目录中?>使用move_uploadde_file()到指定的目录
这就是PHP上传流程,或者你在中途再进行一些验证。例如判断是不是通过upload方式提交的文档,或者文件的扩展是不是我们允许的
等等一系列验证。我给出简单的代码也算是抛砖引玉了。
$targetFolder = '/uploads'; // 定义根目录 if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; if(is_uploaded_file($tempFile)) { $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder; $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name']; $fileTypes = array('jpg','jpeg','gif','png'); // 允许的后缀扩展 $fileParts = pathinfo($_FILES['Filedata']['name']); if (in_array($fileParts['extension'],$fileTypes)) { move_uploaded_file($tempFile,$targetFile); echo '1'; } else { echo '非法上传文档.'; } }else { echo "非法上传文件"; } }
上面的这种方式基本就满足了文件上传。但我需要的不是这样的。
需求:先点击上传文档,然后选择上传文件,JS上传后会返回一个值,显示当前时间戳问名称的文件在文档名称这个框框中。
然后点击提交后,提交表单。
服务器处理提交的表单,对上传的文件进行重命名。
问题也随之而来了,服务器是IIS的,然后它是用的映射的方式实现的虚拟跟目录。
这样的话$_SERVER[‘DOCUMENT_ROOT’]就不在PHP站点的根目录
虽然完成了上传的功能,但无法下载这个文件。从服务器的安全考虑,还是打算把文件放在PHP站点内。
然后我就陷进了一个思维局限中。
再仔细想一想:
为何我不用实现PHP的上传机制的方式在重复一次。
PHP不是将文件先放到临时目录里面吗?然后我为嘛假设JS上传成功后的目录也是一个临时目录,
然后在再一次提交表单的时候进行文件复制。到指定的目录这样就完成了需要的功能。
PHP有一个文件复制函数Copy(); 然后在配合rename()函数。这样就可以完成上传后文件的第二次移动和重命名了。
注意:在window平台下如果复制一个零字节的文件,copy() 将返回 FALSE ,但文件也会被正确复制。
然后PHP在文件处理上,积极的参考了Liunx的文件处理机制。PHP的文件操作效率,这跟I/O对写和操作系统有关。
总结:其实解决问题的方式很多,而且不要给自己画圈从而限定自己的思维。
数组与Json格式其实是非常像了,我们可以利用相关的函数来进行相互转换的,下面来给各位整理一个从mysql读取数据之后再利用php函数转换成json回传,具体如下
数组转Json
<?php header("Content-Type: text/html; charset=utf-8"); $mydb=mysql_connect("localhost","root","root"); if (!$mydb){ die('Could not connect:'. mysql_error()); } $db_selected=mysql_select_db("mysql",$mydb); //$sql = "SELECT * from Person WHERE Lastname='Adams'"; $sql="SELECT * from user"; $result=mysql_query($sql,$mydb); //print_r(mysql_fetch_array($result)); //处理输出数组格式 //$db1=mysql_query("select * from `tb_info`"); /* $arr=array(); while($rows=mysql_fetch_array($db1)){ $key=$rows['id'] $arr[$key] = $rows['qucount'] } */ /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); } $array = array ( 'Name'=>'希亚', 'Age'=>20 ); /* $array=array ( 0 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 1 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 2 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '25', 'name' => '男士', 'province' => '上海', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 3 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '186****1046', ), 4 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '200元的爱玛电动车代金券', 'mobile' => '186****1046', ), 5 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 6 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 7 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 8 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '河南', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 9 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 10 => array ( 'icon' => array ( 'hasPhoto' => '1', 'photoPath' => '/201412/11/11/49/1418269782350A03EA57_c.jpg', ), 'age' => '20', 'name' => '白日做梦', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), ); */ echo JSON($array); ?>
json对象转成
普通数组 也就是 Array 的最简单方法还是 用 json_decode() 方法,只需要在后面多写一个参数就可以搞定
json_decode($json,true);
这样就可以将 json 转换成数组形式了,key 保持原来格式
$json = ’{“name”:”zhangsan”,”age”:20,”sex”:”nan”}’; print_r(json_decode($json,true));
这样的json数据解析后 就会成为下面这样的数组
Array
(
[name] => zhangsan
[age] => 20
[sex] => nan
)
数组转json 中文字符
<?php $josin=array( '0'=>array( 'name'=>'四海一家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '1'=>array( 'name'=>'四海二家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '2'=>array( 'name'=>'四海三家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '3'=>array( 'name'=>'四海四家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '4'=>array( 'name'=>'四海五家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), ); $k=JSON($josin); echo $k; /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); }
相关文章
- 这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
- 下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25总结android studio注意事项及打不开等问题解决方法
经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20- 这篇文章主要介绍了Jrebel启动失败解决方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-07
- 小米手机如果想要刷机就必须要先解锁验证才可以,那么,如果遇到小米解锁验证失败以及小米解锁工具登录失败的现象怎么办呢?对此,本文就为大家进行解答,有需要的朋友来看看。...2016-12-21
- 这篇文章主要介绍了Mybatis执行update失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
如何解决springcloud feign 首次调用100%失败的问题
这篇文章主要介绍了如何解决springcloud feign 首次调用100%失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-23- 有部分小伙伴表示自己遇到了51模拟器程序不能打开的情况,那么51模拟器打不开怎么回事?下面我就来为大家分享一下解决的方法,有需要的小伙伴就来看一看吧。  &...2017-07-06
- 这篇文章主要介绍了nestjs返回给前端数据格式的封装实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
- 测试代码如下:复制代码 代码如下:<?php$fp=fopen("http://www.sina.com.cn", 'r');$stream_meta = stream_get_meta_data($fp);print_r($stream_meta);?>在我本机输出如下:Array( [wrapper_data] => Array...2013-10-04
- 这篇文章主要介绍了Mybatis返回结果封装map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- 今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说文字转曲的操作方法以及注意事项,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看看吧。...2016-09-14
- 这篇文章主要介绍了解决微信授权成功后点击按返回键出现空白页和报错的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-08
解决PHPstudy Apache无法启动的问题【亲测有效】
这篇文章主要介绍了PHPstudy Apache无法启动的问题及解决方法【亲测有效】,本文给大家总结了三种方法供大家参考,需要的朋友可以参考下...2020-10-30- 这篇文章主要给大家介绍了关于Vue实现返回顶部按钮的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-21
- PHP是现在很多程序比较常用的软件,一些人在写php代码时候,会遇到需要返回值的情况。这里可以统一设置下返回值格式,下面文章就给大家介绍返回值设置实例,下面一起来看看。...2017-07-06
解析Mybatis的insert方法返回数字-2147482646的解决
这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-02- 1、检查标题。2、检查版权信息,尤其是电话号码。3、图片、文件定位问题。4、产品页面首页指向产品类别问题。5、文章页面首页指向文章类别问题。6、产品图片大小...2016-09-20
- 这篇文章主要介绍了微信小程序页面开发注意事项整理的相关资料,需要的朋友可以参考下...2017-05-22