工作中常见问题汇总(不定期更新)

基于工作中遇到的一些问题,总结一下经验:

单双引号的区别

大家都知道 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调接口需要把中文及其 符号 转码。

在没有转码的情况下:

  1. 中文逗号会导致 整个 json_encode失败,返回false,低版本PHP返回null。
  2. 其他中文符号会导致 单个 转换失败变成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('&amp;', '&quot;', '&#039;', '&lt;', '&gt;'), $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就会认为是关键字,导致报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值