王新阳

wangxinyang

PHPExcel官方示例

PHPExcel已停止开发,需要使用新类库PhpSpreadsheet
https://github.com/PHPOffice/PhpSpreadsheet



转自: http://blog.csdn.net/beyond__devil/article/details/53457849

1.使用 PHPExcel_IOFactory 读取文件
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
2.使用一个特定的读取类,读取文件
$objReader = new PHPExcel_Reader_Excel5();
objPHPExcel = $objReader->load($inputFileName);
3.使用 PHPExcel_IOFactory 创建一个特定的读取类
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
读取类型有:
$inputFileType = 'Excel5';
$inputFileType = 'Excel2007';
$inputFileType = 'Excel2003XML';
$inputFileType = 'OOCalc';
$inputFileType = 'SYLK';
$inputFileType = 'Gnumeric';
$inputFileType = 'CSV';

4.使用 PHPExcel_IOFactory 来鉴别文件应该使用哪一个读取类
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
5.只读取数据,忽略里面各种格式等(对于Excel读取,有很大优化)
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($inputFileName);
6.加载Excel所有的工作表
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setLoadAllSheets(); // 加载所有的工作表
$objPHPExcel = $objReader->load($inputFileName);
$objPHPExcel->getSheetCount(); // 获取工作表的个数
$objPHPExcel->getSheetNames(); // 获取所有工作表的名字数组
7.加载单个的命名的工作表
$sheetname = 'Data Sheet #2'; // 单个工作表,传入字符串
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setLoadSheetsOnly($sheetname); // 加载单个工作表,传入工作表名字(例如:'Data Sheet #2')
$objPHPExcel = $objReader->load($inputFileName);
8.加载多个命名的工作表
$sheetnames = array('Data Sheet #1', 'Data Sheet #2'); // 多个工作表,传入数组
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setLoadSheetsOnly($sheetnames); // 加载多个工作表,传入工作表名字数组
$objPHPExcel = $objReader->load($inputFileName);
9.自定义一个读取过滤器
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// 只读取1-7行&A-E列中的单元格
if ($row >= 1 && $row <= 7) {
if (in_array($column,range('A','E'))) {
return true;
}
}
return false;
}
}
$filterSubset = new MyReadFilter();
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadFilter($filterSubset); // 设置实例化的过滤器对象
$objPHPExcel = $objReader->load($inputFileName);
10.同样是自定义一个读取过滤器,但可配置读取的行和列范围
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0; // 开始行
private $_endRow = 0; // 结束行
private $_columns = array(); // 列跨度
public function __construct($startRow, $endRow, $columns) {
$this->_startRow = $startRow;
$this->_endRow = $endRow;
$this->_columns = $columns;
}
public function readCell($column, $row, $worksheetName = '') {
if ($row >= $this->_startRow && $row <= $this->_endRow) {
if (in_array($column,$this->_columns)) {
return true;
}
}
return false;
}
}
$filterSubset = new MyReadFilter(9,15,range('G','K'));
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadFilter($filterSubset); // 设置实例化的过滤器对象
$objPHPExcel = $objReader->load($inputFileName);
11.分块读取Excel,原理还是:自定义读取过滤器
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0; // 开始行
private $_endRow = 0; // 结束行
public function __construct($startRow, $chunkSize) { // 我们需要传递:开始行号&行跨度(来计算结束行号)
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$chunkSize = 20; // 定义每块读取的行数
// 就可在一个循环中,多次读取块,而不用一次性将整个Excel表读入到内存中
for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
$chunkFilter = new chunkReadFilter($startRow, $chunkSize);
$objReader->setReadFilter($chunkFilter); // 设置实例化的过滤器对象
$objPHPExcel = $objReader->load($inputFileName);
// 开始读取每行数据,并插入到数据库
}
12.分块读取Excel的第2个版本
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0; // 开始行
private $_endRow = 0; // 结束行
// 定义了一个读取指定范围行的方法
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$chunkSize = 20; // 定义每块读取的行数
// 在循环外部,实例化过滤器类,而不用循环内每次实例化(应该更优化)
$chunkFilter = new chunkReadFilter();
$objReader->setReadFilter($chunkFilter);
for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
// 循环内部,使用实例化的对象的方法,来调整读取的行范围即可
$chunkFilter->setRows($startRow,$chunkSize);
$objPHPExcel = $objReader->load($inputFileName);
}
13.读取多个CSV文件
$inputFileNames = array('./sampleData/example1.csv','./sampleData/example2.csv'); // CSV文件数组
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
/*
说明下面是干啥的:
1.先载入第一个CSV作为第一个工作表 | 设置工作表的标题
2.依次将多个CSV再入到 objPHPExcel 对象中,依次追加到第N个工作表 | 设置工作表的标题
3.获取Excel此时所有的标题,通过标题来依次获取工作表,然后对工作表进行操作!
*/
$inputFileName = array_shift($inputFileNames); // 第一个CSV文件
$objPHPExcel = $objReader->load($inputFileName); // 读取第一个CSV文件
$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); // 设置标题
foreach($inputFileNames as $sheet => $inputFileName) {
$objReader->setSheetIndex($sheet+1); // 将工作表切换到下个工作表
$objReader->loadIntoExisting($inputFileName,$objPHPExcel); // 将下一个CSV文件,载入到已存在的PHPExcel对象中
$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); // 设置当前工作表的标题
}
// 循环所有的工作表名称
$loadedSheetNames = $objPHPExcel->getSheetNames();
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName); // 通过 '工作表名称' 来设置当前工作表为激活状态
// 接着对当前激活的工作表,进行读取、数据库写入
}
14.将一个大的CSV文件,按 '块' 分成多个工作表(结合了12&13的示例)
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0; // 开始行
private $_endRow = 0; // 结束行
// 定义了一个读取指定范围行的方法
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$chunkSize = 100; // 定义每块读取的行数
// 在循环外部,实例化过滤器类,而不用循环内每次实例化(应该更优化)
$chunkFilter = new chunkReadFilter();
$objReader->setReadFilter($chunkFilter)
  ->setContiguous(true); // 这里出现了一个没见过的方法(先放着,忘记是干啥的了)
$objPHPExcel = new PHPExcel();
$sheet = 0; // 第一个工作表下标
for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
$chunkFilter->setRows($startRow,$chunkSize);
    $objReader->setSheetIndex($sheet); // 切换工作表
    $objReader->loadIntoExisting($inputFileName,$objPHPExcel); // 将读取到的CSV块,载入到工作表
    $objPHPExcel->getActiveSheet()->setTitle('Country Data #'.(++$sheet)); // 设置工作表标题
}
// 循环所有的工作表名称
$loadedSheetNames = $objPHPExcel->getSheetNames();
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName); // 通过 '工作表名称' 来设置当前工作表为激活状态
// 接着对当前激活的工作表,进行读取、数据库写入
}

15.使用 'Advanced Value Binder' 读取通过 'tab' 分隔值的文件
PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() ); // 设置单元格
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setDelimiter("\t"); // 设置分隔符为 '\t'(tab分隔)
$objPHPExcel = $objReader->load($inputFileName);
$objPHPExcel->getActiveSheet()->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); // 设置标题
$loadedSheetNames = $objPHPExcel->getSheetNames(); // 获取所有工作表名称

$objPHPExcel->getActiveSheet()->toArray($nullValue, $calculateFormulas, $formatData, $returnCellRef);
mixed $nullValue
单元格不存在时的返回值
boolean $calculateFormulas
是否对单元格进行计算,如 =1+2 True返回3
boolean $formatData
是否格式化值,尤其是时间列,false返回excel时间,true返回如 3/18/17 8:00
false时可以用 PHPExcel_Shared_Date::ExcelToPHP 把返回的excel时间转为php时间戳
boolean $returnCellRef
TRUE返回数组格式array(1=>array('A'=>'', 'B'=>''))
FALSE返回数组格式array(0=>array(0=>'', 1=>''))

1)格式化输出
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true); // 注意4个参数的区别
}
2)未格式化输出
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,false,true); // 注意4个参数的区别
}
3)单元格原生值
foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
$objPHPExcel->setActiveSheetIndexByName($loadedSheetName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true); // 注意4个参数的区别
}
16.使用 'try/catch' 控制Excel加载时的异常
try {
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
} catch(PHPExcel_Reader_Exception $e) {
die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}
17.获取Excel的工作表名称列表
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$worksheetNames = $objReader->listWorksheetNames($inputFileName); // 列出工作表名称
foreach($worksheetNames as $worksheetName) {
echo $worksheetName,'<br />';
}
18.不加载整个文件,或者Excel的工作表名称列表
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$worksheetData = $objReader->listWorksheetInfo($inputFileName); // 列出工作表列表
foreach ($worksheetData as $worksheet) {
echo '<li>', $worksheet['worksheetName'], '<br />';
echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '<br />';
echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows'];
echo '</li>';
}
19.全程,有一个方法:
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,false,false,true);
getActiveSheet() - 获取当前激活的工作表
toArray() - 将当前激活的工作表,解析全部放入数组中

jQueryUI拖拽排序部件 sortable

DEMO  http://jqueryui.com/sortable/

API   http://api.jqueryui.com/sortable/

PHPExcel笔记(CI框架中使用)

参考:
http://www.jquerycn.cn/a_12224
http://www.jquerycn.cn/a_12222

一、因PHPExcel命名规则不同于CodeIgniter(类名必须与文件名相同),为减少对PHPExcel源代码的修改,所以不使用CI的加载类$this->load->library(),而直接使用 require_once
require_once FCPATH.'libraries/PHPExcel.php';
$phpexcel = new PHPExcel;

必须修改的地方: PHPExcel/IOFactory.php  的构造函数 private function __construct() { } 
private 改为 public

二、设置列格式
1、设置A1单元格为文本格式,设置整列为 getStyle('A')
需要 PHPExcel/Style/NumberFormat.php
$this->phpexcel->getActiveSheet()->getStyle('A1')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
注意:此方法对长数字字符串还是以文本方式来显示科学计数法的结果,原因可能php在处理大数字时采用的科学计数法。

2、需要 PHPExcel/Cell/DataType.php
$objPHPExcel->getActiveSheet()->setCellValueExplicit('D1',123456789033,PHPExcel_Cell_DataType::TYPE_STRING);

3、在数字字符串前加一个空格使之成为字符串
$objPHPExcel->getActiveSheet()->setCellValue('D1', ' ' . 123456789033);

推荐第2种方法

在线代码编辑器CodeMirror

支持几十种编程语言的在线编辑,支持所有主流的浏览器。支持自动完成、代码折叠、HTML预览、全屏、代码格式化、Mustache模板高亮等。

http://codemirror.net/

https://zhuanlan.zhihu.com/p/22163474

http://blog.csdn.net/cuixiping/article/details/6278645

http://www.hyjiacan.com/category/trans/codemirror-doc/


我的CodeMirror配置:

<link rel="stylesheet" href="/static/codemirror-5.29/lib/codemirror.css">
<link rel="stylesheet" href="/static/codemirror-5.29/addon/display/fullscreen.css">
<script src="/static/codemirror-5.29/lib/codemirror.js"></script>
<script src="/static/codemirror-5.29/addon/edit/matchbrackets.js"></script>
<script src="/static/codemirror-5.29/addon/selection/active-line.js"></script>
<script src="/static/codemirror-5.29/addon/display/fullscreen.js"></script>
<script src="/static/codemirror-5.29/mode/htmlmixed/htmlmixed.js"></script>
<script src="/static/codemirror-5.29/mode/xml/xml.js"></script>
<script src="/static/codemirror-5.29/mode/javascript/javascript.js"></script>
<script src="/static/codemirror-5.29/mode/css/css.js"></script>
<script src="/static/codemirror-5.29/mode/clike/clike.js"></script>
<script src="/static/codemirror-5.29/mode/php/php.js"></script>
<style>.CodeMirror{height:500px;border:1px solid #999;}</style>
<script>
var CM_editor=CodeMirror.fromTextArea($("textarea[name='content']")[0],{
	styleActiveLine:true,
	flattenSpans:false, //禁止合并span(值为true时未发现到底哪种情况会合并)
	autofocus:true, //自动获取焦点
	lineNumbers: true, //显示行号
	matchBrackets: true, //括号匹配
	mode: "application/x-httpd-php",
	indentUnit: 4, //tab宽度
	indentWithTabs: true, //tab缩进
	//theme:"default", //主题
	lineWrapping:true, //代码自动换行
	
	extraKeys: { //全屏
		"F11": function(cm){cm.setOption("fullScreen", !cm.getOption("fullScreen"));},
		"Esc": function(cm){if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);}
	}
});
//全屏
$('.js-btn-fullscreen').click(function(){
	CM_editor.setOption("fullScreen", !CM_editor.getOption("fullScreen"));
	CM_editor.focus();
});
//加载主题
$('select.js-theme').change(function(){
	var theme=$(this).val();
	if(!theme)return;
	if(theme!='default')$('<link rel="stylesheet" href="/static/codemirror-5.29/theme/'+theme+'.css">').appendTo('head');
	CM_editor.setOption('theme', theme);
});
//自动换行
$('.js-lineWrapping').click(function(){
	CM_editor.setOption('lineWrapping', $(this).prop('checked'));
});
</script>

CSS3之filter

.gray { 
    -webkit-filter: grayscale(100%);
    -moz-filter: grayscale(100%);
    -ms-filter: grayscale(100%);
    -o-filter: grayscale(100%);
    filter: grayscale(100%);
}

http://www.runoob.com/cssref/css3-pr-filter.html

注意: 滤镜通常使用百分比 (如:75%), 当然也可以使用小数来表示 (如:0.75)。

Filter描述
none默认值,没有效果。
blur(px)给图像设置高斯模糊。"radius"一值设定高斯函数的标准差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊;

如果没有设定值,则默认是0;这个参数可设置css长度值,但不接受百分比值。
brightness(%)给图片应用一种线性乘法,使其看起来更亮或更暗。如果值是0%,图像会全黑。值是100%,则图像无变化。其他的值对应线性乘数效果。值超过100%也是可以的,图像会比原来更亮。如果没有设定值,默认是1。
contrast(%)调整图像的对比度。值是0%的话,图像会全黑。值是100%,图像不变。值可以超过100%,意味着会运用更低的对比。若没有设置值,默认是1。
drop-shadow(h-shadow v-shadow blur spread color)

给图像设置一个阴影效果。阴影是合成在图像下面,可以有模糊度的,可以以特定颜色画出的遮罩图的偏移版本。 函数接受<shadow>(在CSS3背景中定义)类型的值,除了"inset"关键字是不允许的。该函数与已有的box-shadow box-shadow属性很相似;不同之处在于,通过滤镜,一些浏览器为了更好的性能会提供硬件加速。<shadow>参数如下:

<offset-x> <offset-y> (必须)
这是设置阴影偏移量的两个 <length>值. <offset-x> 设定水平方向距离. 负值会使阴影出现在元素左边. <offset-y>设定垂直距离.负值会使阴影出现在元素上方。查看<length>可能的单位.
如果两个值都是0, 则阴影出现在元素正后面 (如果设置了 <blur-radius> and/or <spread-radius>,会有模糊效果).
<blur-radius> (可选)
这是第三个code><length>值. 值越大,越模糊,则阴影会变得更大更淡.不允许负值 若未设定,默认是0 (则阴影的边界很锐利).
<spread-radius> (可选)
这是第四个 <length>值. 正值会使阴影扩张和变大,负值会是阴影缩小.若未设定,默认是0 (阴影会与元素一样大小). 
注意: Webkit, 以及一些其他浏览器 不支持第四个长度,如果加了也不会渲染。
 
<color> (可选)
查看 <color>该值可能的关键字和标记。若未设定,颜色值基于浏览器。在Gecko (Firefox), Presto (Opera)和Trident (Internet Explorer)中, 会应用colorcolor属性的值。另外, 如果颜色值省略,WebKit中阴影是透明的。
grayscale(%)

将图像转换为灰度图像。值定义转换的比例。值为100%则完全转为灰度图像,值为0%图像无变化。值在0%到100%之间,则是效果的线性乘子。若未设置,值默认是0;

hue-rotate(deg)

给图像应用色相旋转。"angle"一值设定图像会被调整的色环角度值。值为0deg,则图像无变化。若值未设置,默认值是0deg。该值虽然没有最大值,超过360deg的值相当于又绕一圈。

invert(%)

反转输入图像。值定义转换的比例。100%的价值是完全反转。值为0%则图像无变化。值在0%和100%之间,则是效果的线性乘子。 若值未设置,值默认是0。

opacity(%)

转化图像的透明程度。值定义转换的比例。值为0%则是完全透明,值为100%则图像无变化。值在0%和100%之间,则是效果的线性乘子,也相当于图像样本乘以数量。 若值未设置,值默认是1。该函数与已有的opacity属性很相似,不同之处在于通过filter,一些浏览器为了提升性能会提供硬件加速。

saturate(%)

转换图像饱和度。值定义转换的比例。值为0%则是完全不饱和,值为100%则图像无变化。其他值,则是效果的线性乘子。超过100%的值是允许的,则有更高的饱和度。 若值未设置,值默认是1。

sepia(%)

将图像转换为深褐色。值定义转换的比例。值为100%则完全是深褐色的,值为0%图像无变化。值在0%到100%之间,则是效果的线性乘子。若未设置,值默认是0;

url()

URL函数接受一个XML文件,该文件设置了 一个SVG滤镜,且可以包含一个锚点来指定一个具体的滤镜元素。

例如:

filter: url(svg-url#element-id)

IIS php-cgi.exe - FastCGI 进程意外退出

2024-12-01更新

换个PHP版本


2022-11-12更新

windows缺少某个系统文件,找到php安装目录,双击php.exe/php-cgi.exe,提示"由于找不到 VCRUNTIME140.dll,无法继续执行代码。重新安装程序可能会解决此问题。"

问题找到,下载或从其他电脑复制相应文件,32位系统复制到C:\Windows\System32目录下,64位系统请将文件复制到C:\Windows\SysWOW64目录。


2017-08-28更新

可能原因一:

遇到这个情况是因为php执行程序是基于VC++ 11运行库开发运行的,而你的电脑上没有安装vc++ 11。那什么是vc++ 11版本呢?

它就是Microsoft Visual C++ Redistributable 2012或2013运行库,要解决这个问题,按照下面的地址下载安装对应的版本就可以了:

32位 Microsoft Visual C++ Redistributable 2012下载:http://download.microsoft.com/download/9/C/D/9CD480DC-0301-41B0-AAAB-FE9AC1F60237/VSU4/vcredist_x86.exe

64位 Microsoft Visual C++ Redistributable 2012下载:http://download.microsoft.com/download/9/C/D/9CD480DC-0301-41B0-AAAB-FE9AC1F60237/VSU4/vcredist_x64.exe

参考:https://www.itsvse.com/thread-3867-1-1.html

可能原因二:

1,应用程序池"启用32位应用程序改成true
2,进程模型-标识,改成LocalSystem

参考:https://www.jianshu.com/p/5e7d2d260aae


2016-02-18更新

HTTP 错误 500.0 - Internal Server Error
C:\PHP\php-cgi.exe - FastCGI 进程意外退出

网站正常运行中突然出现上面的错误,百度n多方法都没解决,重装php都不行。
DOS中php安装目录下 php -v 一切正常
IIS运行phpinfo()正常
由此判断应该是php程序修改中出错,对最后的修改逐行检查,最终发现原来是对数组的调用没有使用[ ]而是用了圆括号(),改之,一切正常!

Fatal error: Can't use function return value in write context in F:\...\config_model.php on line 73
正常情况这种错误应该是上面的提示,这次不知道怎么会这样,总之解决了就好。

WIN10-WEB相关内容备份路径

关键内容备份路径

iis
C:\Windows\System32\inetsrv\config\applicationHost.config
仅文件中的 <sites> 部分

sqlyog
C:\Documents and Settings\Administrator\Application Data\SQLyog\sqlyog.ini
C:\Users\Administrator\AppData\Roaming\SQLyog

mysql
C:\ProgramData\MySQL\MySQL Server 5.5\data

leapftp
C:\Users\Administrator\Local Settings\VirtualStore\Program Files (x86)\LeapFTP_v3.1\users\default
config.xml  sites.dat

eclipse
C:\Documents and Settings\Administrator\workspace\.metadata

远程桌面连接记录所在注册表项:
计算机\HKEY_USERS\S-1-5-21-3819701229-2991288751-3115585910-500\Software\Microsoft\Terminal Server Client
计算机\HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default
计算机\HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers

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;
	}
}
2025-04-05 星期六 农历三月初八