PHP GBK编码下生僻字 带来的一些bug


今天在一个老项目上往数据库里存“碶”这个字时造成了乱码,最终找到原因如下:

GBK编码中这些生僻字右边有个\,使用下面的代码就可以看出来

<?php
$str = '碶啊';
echo $str;//碶啊
var_export($str);//'碶\啊'
$str = var_export($str, true);
echo $str;//'碶\啊'

然后存入数据库后多了一个\造成了乱码,临时找了个办法可以解决掉这个问题:

<?php
$str = str_replace("\\","\\\\",$str);

后来又发现了个方法也可以解决这个问题,因为这个\在utf-8下不存在
所以转出UTF-8再存入数据库也不会有问题

$sql = iconv("gbk","utf-8",$sql);
mysql_set_charset("utf-8");
mysql_query($sql);

应该还有很多生僻字,比如:芢碶黒匼,大概都会有这个问题


Google Map Javascript Api 坐标/经纬度拾取


主要参考的API在https://developers.google.com/maps/documentation/javascript/3.exp/reference?authuser=1#Map
中的Events.click

代码如下,注意需要修改KEY

<!DOCTYPE html>
<html>
<head>
    <style>
        #map {
            height: 600px;
            width: 100%;
        }
    </style>
</head>
<body>
<div id="map"></div>
<script>
    function initMap() {
        var uluru = {lat: 23.4302665, lng: 121.5833201};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 7,
            center: uluru
        });
        var marker = new google.maps.Marker;

        map.addListener('click', function(ApiMouseEvent) {

            marker.setMap(null);

            var lat = ApiMouseEvent.latLng.lat();
            var lng = ApiMouseEvent.latLng.lng();
            var locationJson = ApiMouseEvent.latLng.toJSON()

            var contentString = '<div id="content" style="text-align:center;">'+lat+','+lng+'<br/><button onclick="select('+lat+','+lng+');">选择该位置</button></div>';

            var infowindow = new google.maps.InfoWindow({
                content: contentString
            });
            marker = new google.maps.Marker({
                position: locationJson,
                map: map,
                title: lat+','+lng
            });

            infowindow.open(map, marker);
        });


    }
</script>
<script async defer
        src="https://maps.googleapis.com/maps/api/js?key=YOURKEY&callback=initMap">
</script>
<script>
    function select(lat,lng){
        console.log(lat)
        console.log(lng)
    }
</script>
</body>
</html>

PHP判断SQL语句是否存在写操作


可用于的场景:
1.读写分离
2.给用户一个sql查询窗口时,略微安全一点

注:片段来自CI3.0

public function is_write_type($sql) {
  return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql);
}

鼠标单击变双击测试工具


最近鼠标貌似坏了,单击有时候会变成双击,为了验证下了写了小工具

在线测试地址

测试结果展示
testResult.jpg

代码如下,精度写了120毫秒,即两次点击间隔小于120毫秒视为双击了,我这个鼠标快速手动点击间隔都在160毫秒以上。

<input type='button' onclick='testMouse();' value='双击测试'/>
<p></p>
<div></div>
<script src="http://ajax.useso.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script>
var i=0;
var lastClick=0;
var ok=0;
var error=0;
function testMouse(){
    i++;
    nowTime = Math.round(new Date().getTime());
    clickTime = lastClick==0?0:(nowTime-lastClick);
    lastClick = nowTime;
    if(clickTime<120&&clickTime>0){
        is_doubleClick = "疑似双击";
        error++;
    }else{
        is_doubleClick = "正常";
        ok++;
    }
    $("div").prepend("点击第"+i+"次 间隔时间:"+clickTime+"毫秒 "+is_doubleClick+"<br/>");
    $("p").html("正常"+ok+"次 双击"+error+"次 错误率"+Math.round(error/ok*10000)/100+"%");
}
</script>