王新阳

wangxinyang

Incorrect string value: '\xF0\x9F\x98\xAD",...' for column...的解决方法

最近在微信开发时遇到以下错误:
Incorrect string value: '\xF0\x9F\x90\xB3 \xE4...' for column 'nickname' at row 69302

原因:用户昵称中有emoji表情,而emoji表情为4字节utf-8字符,mysql只支持不超过3字节的utf-8字符,所以写入失败。

4字节utf-8字符包括Emoji表情(Emoji 是一种特殊的 Unicode 编码,常见于 iOS 和 Android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

MySQL 版本>=5.5.3支持utf8mb4编码,使用这个编码可以支持4字节utf-8字符。
MySQL低于5.5.3版本,可以过滤掉4字节字符,或采用base64_encode进行编码后保存,输出时再base64_decode解码。

/**
 * 过滤掉emoji表情(4字节utf8编码字符)
 */
function filter_emoji($str){
  return preg_replace_callback('/./u', 
    function(array $match){return strlen($match[0]) >= 4 ? '' : $match[0];}, 
    $str);
}

参考:
http://blog.csdn.net/yan791124465/article/details/70738939
http://blog.csdn.net/hzw19920329/article/details/55670782
http://blog.csdn.net/secretx/article/details/21253559

微信投票防刷票方法汇总中……

1、在活动进行中不显示每个人的票数,不显示排行

2、投票前必须先关注公众号(涉嫌诱导关注),然后每个openid在活动期间只能投1票(增加刷票成本),取消关注减票

3、如果有条件可以添加第三方的行为验证码,防机刷

4、每分钟票超过N票,锁定X分钟

5、限制单个选手每天可以获取的最多票数

6、单独做刷票检测程序,如果某选手的票数某段时间内每分钟都有增加,就有刷票嫌疑

7、有大量昵称为随机字母,且缺少基本信息(头像、性别、地区等)的微信用户投票,有刷票嫌疑

8、大量基本信息中地区为非中国地区的微信用户投票, 有刷票嫌疑

9、给某个选手投票的微信用户头像是同一类型的图片(美女、动物等),有刷票嫌疑

10、投票周期不要太长

11、活动规则要明确刷票后果,可以在规则中说明刷票后果等等

12、手机验证码防刷票

13、网络投票的票数不是唯一的判断标准。在公开投票结束后,再增加一轮参赛选手投票,每个选手只能投一票,且不能投给自己。选手投票权重要远高于公众投票(如:选手1票=公开投票期总票数/参赛选手数),这样是不是又会出现有人用多个号报名,提前潜伏?!

反思:某严惩刷票的投票活动中,选手C为了挤掉排在自己前面的选手A,而雇水军恶意给A刷票,A被举办方查到有刷票行为,而取消参赛资格,C获胜,此事可有解?(不显示每个人的票数,貌似可行)

14、参考投票吧防刷票 http://www.vote8.cn/AntiCheat

15、使用行为验证码,这个比较可行


以下转载至投票吧防刷票专题
http://www.vote8.com/AntiCheat

  • 邀请码

    1、什么是邀请码: 投票者必须凭邀请码才能投票,且只能使用一次。

    2、适用场景: 适合投票人群固定的小范围投票活动使用,由投票组织人向每人发放一个邀请码,可有效杜绝作弊刷票。

    3、如何生成邀请码: 点击下方的"生成邀请码"按钮即可进入生成向导。可以自动生成指定数量的邀请码,还可以为每个邀请设置对应的用户名称标识(如姓名、QQ、工号等),便于识别哪些用户还没投票。

    邀请码功能演示

    使用邀请码能精确监控投票进行情况

    使用邀请码能精确监控投票进行情况

  • 地理位置限制

    可限定指定省份或城市的用户才允许投票,对于区域性投票活动的防刷票特别有效。技术上,除了通过IP地址,投票吧还使用了最新的html5技术用于地理位置识别,可更精确的实现用户地理位置定位。地理位置识别功能演示

    可限制特定省份、城市的用户才能投票

    可限制特定省份、城市的用户才能投票

  • 微信号验证

    如启用微信号验证,可限制每个微信号只能投一次或每天若干次,并可在投票日志记录用户的微信号公开信息(昵称、头像等),可非常有效的防止微信刷票行为。 微信验证同时支持电脑和手机投票:使用电脑投票会提示用微信客户端扫描电脑屏幕的二维码;使用手机等移动设备投票,则必须通过微信客户端进入投票,投票前会提示授权验证微信账号(一键授权验证,无需密码),按此了解《如何创建发起微信投票》。 微信验证功能演示

  • 关注微信公众号才能投票

    可限制必须关注特定微信公众号才能投票,既能防刷票又能吸粉。 关注指定微信公众号才能投票演示

  • QQ号验证

    投票前要求在网页进行QQ登录验证(通过QQ官方接口验证),以限制每个QQ号只能投票一次,可在一定程度上增加刷票难度。

  • 邮箱验证码

    系统会将验证码发送到投票者指定的邮箱,相同的邮箱,不能重复参与投票。当然,作弊者可以通过注册大量真实邮箱来绕过这个限制,所以邮箱验证码只能说是增加了作弊成本。 邮箱验证码功能演示

  • 限定指定邮箱

    这是对邮箱验证码功能的补充,除实现相同邮箱不能重复投票功能外,管理员还需要明确指定允许哪些邮箱参与投票,对于可确定投票者邮箱的小范围投票活动,可非常有效的防范刷票作弊。

  • 手机验证码

    与邮箱验证码类似,系统会将验证码用短信发送到投票者指定的手机,相同的手机号,不能重复参与投票。相比邮箱验证码,如果作弊者要刷票,必须掌握大量手机号才可以,将大大增加作弊成本。

  • 高级设备特征识别技术

    常见的限制一台手机、一台电脑投票次数的手段是通过浏览器的Cookie进行记录和识别,但删除Cookie即可绕过限制,投票吧应用了进阶的设备特征技术,通过特定算法识别出设备的唯一性,且不需要依赖Cookie,可以更为有效的实现"一机一票"有效防范刷票行为,此技术对微信也有较好的支持,可有效限制同一台手机通过切换微信账号的微信刷票。

  • 自定义输入栏

    自定义输入栏用于让投票者提交更多信息,常用于信息收集,例如要求录入"联系方式、居住地";还可用于实名投票,例如要求录入"姓名、工号"等个人资料,并勾选"禁止重复",可在一定程度上防范作弊刷票。 自定义输入栏功能演示

  • 日志分析

    所有投票人次的时间、IP、所选选项、邮箱、手机都会一一记录,管理员可通过对日志的人工分析,发现可疑的投票行为。

  • 投票结果显示

    可以自有设置在投票前或投票后是否显示投票结果,为防范刷票,建议设置为投票结束后才显示票数。

  • 强制停留时间

    可要求用户在投票网页停留一定时间才能投票,可一定程度增加刷票成本。


我的.htaccess

RewriteEngine On
#以old开头的请求301跳转到www.XXX.com首页
RewriteCond %{request_uri} ^/old [NC]
RewriteRule ^(.*)$ http://www.XXX.com/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(robots\.txt|favicon\.ico)$
RewriteCond $1 !^.+\.(ico|js|css|jpg|jpe|jpeg|png|bmp|gif|mp4|flv|swf|txt|pdf|zip|rar|htm|doc|docx|xls|xlsx)$
#部分IIS中!-f无效,需要下面一行以防止手机站被index.php解析
RewriteCond $1 !^m\.php
RewriteRule ^(.*)$ index.php/$1 [L]

允许跨域

Header add Access-Control-Allow-Origin "http://aaa.example"

中文-未验证

RewriteRule ([\x80-\xffa-zA-Z]{1,})-([0-9]{1,}).html$ test.php?action=$1&id=$2

根据域名跳转,下面把abc.com的所有访问临时跳转到def.com(含querystring)

Rewritecond %{HTTP_HOST} ^(www\.)?abc.com$ [NC]
Rewriterule ^(.*)$ http://def.com/$1 [R=302,L]

RewriteCond %{request_uri} ^/old [NC]
RewriteRule ^(.*)$ http://www.XXX.com/ [L,R=301]
以上会把 http://abc.com/old?kw=text 跳转到 http://www.xxx.com/?kw=text
如果要舍弃QUERY_STRING,只需在跳转网址后加问号(正则结尾)即可,如下:
RewriteCond %{request_uri} ^/old [NC]
RewriteRule ^(.*)$ http://www.XXX.com/? [L,R=301]

下面可以用于不支持asp的服务器,把百度收录的原asp网页跳转到指定页面。

RewriteRule ^(.*)\.asp http://www.abc.com/baidu/index/$1 [R=301,L]

nginx伪静态

if (!-e $request_filename) {
	rewrite ^/manage\.php /manage.php last;
	rewrite ^.*$ /index.php last;
}

不是ico/jpg/png/gif中的一种时才进行伪静态重写

location ~* .*(?<!\.(ico|jpg|png|gif))$ {
	if (!-e $request_filename) {
		rewrite ^/manage\.php /manage.php last;
		rewrite ^.*$ /index.php last;
	}
}

防止网站内部搜索被他人恶意利用

详见百度站长学院:https://zhanzhang.baidu.com/college/articleinfo?id=117

除了文章中说的方法,也可以把搜索页地址写入robots.txt,禁止搜索引擎收录。

Fatal error: Call-time pass-by-reference has been removed in...的处理方法

以前的php代码在升级到5.4版本的php可能会出现这种错误:
当我们这样使用函数(或者类)的话,会产生一个error:
foo(&$var);
实际上,这样用本来就是错的,只是之前的错误级别仅仅是Deprecated而已。
而正确的使用方法应该是在函数定义时:
function foo(& $var) {
    //other code
}
而在调用时直接传参就行了: foo($var);

PHP:Fatal error: Class 'COM' not found in … 的处理办法

一般执行3、4两条即可

1、首先在windows的“服务”里面检查COM+服务是否已经启动。如果未启动,请启动它。

大概是该服务:Windows Management Instrumentation

2、检查php目录ext文件夹下面php_com_dotnet.dll是否存在。(顺便说一下,ext通常作为php程序的扩展目录,在安装php的时候一般已经设置好。否则就应该不仅仅报主题所说的错咯。)

3、如果没问题,在php.ini里面加入以下语句:
[PHP_COM_DOTNET]
extension=php_com_dotnet.dll

4、php.ini中设置
com.allow_dcom = true

5.PHP版本
PHP 5.4.5以前的版本,只需要在php.ini中把com.allow_dcom = true打开就可以了,但是5.4.5版本以后,PHP把com/dotnet 模块集成到了一个单独的扩展中,所以需要在php.ini中加一行扩展extension=php_com_dotnet.dll,是加一行,不是打开,默认配置文件中没有这一行的,然后重启IIS或Apache,再次运行就正常了!

CodeIgniter使用rewrite时出现404的原因

.htaccess中有如下一条,本意是要把/m重写为/m.php,结果总是 404错误

RewriteRule ^m/(.*)$ m.php/$1 [L]

原因:
config/config.php

$config['uri_protocol'] = 'REQUEST_URI';

要改为

$config['uri_protocol'[ = 'PATH_INFO';

否则CI无法根据重写后的uri获取请求的class和method,从而导致出错。
当访问地址为 http://abc.com/m   没有以 / 结尾时仍不能正确重写到 m.php,需要在.htaccess中增加如下一行(加在 RewriteRule ^m/(.*)$ m.php/$1 [L] 的前面):

RewriteRule ^m$ /m/ [R=301,NC,L]

参考:http://blog.csdn.net/newjueqi/article/details/12014673

如果服务器不支持$_SERVER['PATH_INFO'],可以在服务器上输入$_SERVER数组,查看是否支持$_SERVER['ORIG_PATH_INFO'],支持的话以ORIG_PATH_INFO代替PATH_INFO,当前要观察两个值是否相同,如果不相同,需要同时修改 system/core/URI.php 中关于$uri获取的部分。我本地电脑中ORIG_PATH_INFO和PATH_INFO的值不一样。阿里云虚拟主机不支持PATH_INFO,但ORIG_PATH_INFO的值却与我本地的PATH_INFO一样。

border-radius溢出

如下CSS鼠标滑过时在360浏览器的极速模式下,会出现border-radisu溢出,图片仍是方形,直至transform动画结束。

a{
	display:block;
	width:100px;
	height:100px;
	border-radius:50%;
	overflow:hidden;
}
a img{
	width:100%;
	height:100%;
	transition:transform ease .5s;
}
a:hover img{
	transform:scale(1.05);
}

解决方法:

a{
	position:relative;
	z-index:1;
}

MySQL运算符优先级

常常发现很多基础的知识才是最重要的,是我们修复Bug的利器。

#MySQL运算符的优先级

运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。

MySQL中所有运算符的优先级的顺序按照从高到低,从上到下,依次降低。一般情况下,级别高的运算符先进行计算,如果级别相同,MySQL按照表达式的顺序从左到右依次计算。

MySQL运算符的优先级如下:

优先级 运算符
(最高)  !
 3     -(负号),~(按位取反)
 4     ^(按位异或)
 5     *,/(DIV),%(MOD)
 6     +,-
 7     >>,<<
 8     &
 9     |
10     =(比较运算),<=>,<,<=,>,>=,!=,<>,IN,IS NULL,LIKE,REGEXP
11    BETWEEN AND,CASE,WHEN,THEN,ELSE
12    NOT
13    &&,AND
14    XOR
15    ||,OR
(最低)    =(赋值运算),:=

我们可以看出,不同运算符的优先级是不同的。在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。

301转跳

ASP:

<%
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", new_url
%>

PHP:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://abc.com".$_SERVER['REQUEST_URI']);
?>
2024-11-22 星期五 农历十月二十二