基于工作中遇到的一些问题,总结一下经验:
单双引号的区别
大家都知道 php 里双引号可以解析变量,单引号不可以,其实换行符等特殊情况也需要双引号处理。
$aWhiteIP = explode('\n', $sWhiteIP);
结果是:
array(1) { [0]=> string(24) "192.168.0.1 192.168.0.2" }
改成双引号才可以正确解析。
$aWhiteIP = explode("\n", $sWhiteIP);
结果是:
array(2) { [0]=> string(12) "192.168.0.1 " [1]=> string(11) "192.168.0.2" }
如果是逗号等作为分隔符,单双引号都一样,但是使用函数的参数最好用双引号。
Textarea的写法
如图,显示是这样子,我还以为 textarea 自带首行缩进,想用css关闭,其实是因为html里多了换行。
<textarea type="text" name="whiteip" style="resize:none;" >
<?php echo $aParams['whiteip']; ?>
</textarea>
改成这样就好了。
<textarea type="text" name="whiteip" style="resize:none;" ><?php echo $aParams['whiteip']; ?>
</textarea>
IE的placeholder之坑
做一个联想搜索框,在input里加了placeholder。
<input type="text" placeholder="请选择考试产品" name="examstr" autocomplete="off"
style="text-align:center;width:300px;" >
Chrome下是正常的。
单击出现选择框:
选中后赋值:
IE下就比较奇怪。
单击出现选择框:
选中后却无法赋值,而且选择框也没了,感觉像是点了两下,先点了空白处:
我花了好长时间才发现是placeholder的问题,因为Chrome单击第一下出现指针和选择框,IE是出现指针,同时把提示文字隐藏掉。查了下是因为IE本来不支持placeholder,后来为了兼容留的坑,无法正常触发事件。
in_array区分大小写
很多时候用 in_array 对输入数据判断是否重复,而诸如邮箱等是不区分大小写的,可以用 strtolower 统一转成小写比较。
if(in_array(strtolower($val), array_map('strtolower',$arr)))
如果只是比较两个字符串(不区分大小写),可以用 strcasecmp,相等则返回0。
strcasecmp("shanghai","SHANGHAI");
host文件的位置
1 虚拟机配置或者网页url跳转:
目录 C:\Windows\System32\drivers\etc\hosts
增加ip和网站地址,比如:
10.100.51.148 internal.51job.com
10.100.3.163 zhiding.com.cn
2 虚拟机内部代码访问:
目录 etc/hosts
增加ip和网站地址,比如:
10.100.2.10 openapi.51job.com
10.100.3.172 vapi.51job.com
windows切换路径
和Linux不同,这个时候是没用的,并没有切换到指定路径。
再输入D:就切换到D盘下了。
disabled取不到值
做一个单选框,由于业务需要只能单向变更,发现设置disabled的值获取到都是空,可能html发现加了disabled属性就使得value失效,需要在后台判断并重新赋值。
<td nowrap>
<input type="radio" name="chatauthstatus" value="0" > 是
<input type="radio" name="chatauthstatus" value="1" disabled>否
</td>
包括checkbox也是如此,像下面这样是取不到值为1的。
<input name="isvar" type="checkbox" value="1" checked disabled>
PHP的引用传值
官方文档要求是放在函数定义的参数里:
function operateUserInfo($inputpara, &$aCrmcreditContact)
其实在传参时也可以,相当于把变量地址传过去了,操作了变量本身。
$aUserResult = $this->operateUserInfo($inputpara, &$aCrmcreditContact);
强制类型转换
如果是把字符串转成数字,要注意整形的最大值是2147483647,超过这个数字不管是用 (int) 还是用 intval() 都会改成它。
if(in_array($sKey, array('ctmid','userid','ctrid','accid','accsubid')) && $sVal !== '')
{
$sVal = (int)$sVal;
}
有些Java接口会要求传参id为数字类型,但合同id等可能超过整形最大值的还得字符串。
json_encode和编码转换
json_encode只支持UTF-8,通常用GBK调接口需要把中文及其 符号 转码。
在没有转码的情况下:
- 中文逗号会导致 整个 json_encode失败,返回false,低版本PHP返回null。
- 其他中文符号会导致 单个 转换失败变成null。像这样:“dbid”:“1”,“divids”:null,“email”
兼容中英文符号可用str_replace替换,或者用iconv转码使其能正确解析。
htmlspecialchars的传参
/*
* @param string $p_sInput 需要进行HTML实体转换的字符串
* @param string $p_iFlag 转换方式
* @param string $p_sEncoding 转换编码
*/
$return = htmlspecialchars($p_sInput, $p_iFlag, $p_sEncoding);
其中$p_iFlag 为 ENT_COMPAT 则只转换双引号,为 ENT_QUOTES 则同时转换双引号和单引号。
此函数不提供GBK编码,因此可能有些字会被转换成空,如果转空,可以通过str_replace来实现。
if (empty($return))
{
$return = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $input);
}
Mysql insert 语句
insert into s_el_solution_relation('solutionid','lessonid','rank','status')values(?,?,?,?)"
数据没进去也没有报错,返回status=1,但是affected_rows为空,也没有id。
查询 MYSQL_CMNUPD.out 日志:
2022-09-23 09:33:31 Error:ServiceName=[MYSQL_CMNUPD.group11.master0] Error=[Call mysql_stmt_prepare failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '‘solutionid’,‘lessonid’,‘rank’,‘status’ at line 1] Recvbuf=[0|insert into s_el_solution_relation(‘solutionid’,‘lessonid’,‘rank’,‘status’)values(?,?,?,?)|8|4|94|0|1] Errno=[1064]
1064错误是关键字冲突,突然发现字段误加了引号,这样status就会认为是关键字,导致报错。