王新阳

wangxinyang

简单的PHP采集示例

<?php
header('Content-type: text/html; charset=utf-8');
set_time_limit(900);
$a=<<<EOD
复制html内容到这里
EOD;
//获取需要的链接
preg_match_all('/\\/chapter\\/110701\\/\\d+\\.html/i', $a, $arr);
//得到完整链接地址
$arr = explode(',', 'http://vip.book.sina.com.cn' . implode(',http://vip.book.sina.com.cn', $arr[0]));
$b = '文章正文内容开始前面的html';
$c = '/正则匹配章节标题和章节内容之间的html,如果此部门内容没有时间等不同的字符,可以直接用str_replace而不是preg_replace';
$e = '文章正文内容结束后面的html';
$result = '';
//要获取的文章内容
$txt = fopen('e:/web/abc.txt', 'wb');
ob_start();
for ($i = 0; $i < count($arr); $i++) {
	$result = '';
	$str = file_get_contents($arr[$i]);
	//也可以用curl
	$str = explode($b, $str);
	$str = explode($e, count($str) > 1 ? $str[1] : $str[0]);
	$str = explode('</h1>', $str[0], 2);
	$result = $str[0] . "\r\n";
	$str = preg_replace($c, '', $str[1]);
	$str = str_replace('<p>', '', $str);
	$str = str_replace('</p>', "\r\n", $str);
	$result .= $str;
	fwrite($txt, $result);
	echo str_replace("\r\n", '<br />', $result);
	flush();
}
fclose($txt);


file_get_contents()抓取 https 地址时出错:
SSL operation failed with code 1. OpenSSL Error message

原因是证书校验不通过,可以设置忽略证书校验:

$option=array(
	'ssl'=>array('verify_peer' => false, 'verify_peer_name' => false)
);
$stream=stream_context_create($option);
file_get_contents($url, false, $stream);

artDialog 网页对话框插件

http://aui.github.io/artDialog/

PHP curl示例

cur进行https请求时,如果出现 curl: (35) SSL connect error
一般是发起请求的服务器ssl_version为 NSS 需要改为 openSSL

/**
 * 通过curl请求远程数据
 * @param string $url
 * @param string $request_method 默认GET
 * @param array $post_data 默认null
 * @param string $do_what http_build_query/json_encode
 * @param array $opt_array 批量设置特殊选项
 * @return FALSE | string
 */
function my_curl($url, $request_method='GET', $post_data=NULL, $do_what='', $opt_array=NULL){
	$arr_header = array();
	if($post_data){
		switch($do_what){
			case 'json_encode': //需要发送json数据时,对数组或对象进行json编码(微信开发此处不能包含中文,否则会有:不合法的请求字符,不能包含\uxxxx格式的字符)
				$post_data = json_encode($post_data);
				$arr_header[] = 'Content-length: '.strlen($post_data);
				break;
			case 'http_build_query':
				$post_data = http_build_query($post_data); //对数组或对象使用http_build_query()以提高兼容性
				$arr_header[] = 'Content-length: '.strlen($post_data);
				break;
			default:
		}
	}
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //curl_exec执行成功则返回结果(默认返回true),失败返回false
	curl_setopt($ch, CURLOPT_HEADER, false); //启用时会将头文件的信息作为数据流输出
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //连接超时时间
	if(count($arr_header))curl_setopt($ch, CURLOPT_HTTPHEADER, $arr_header);
	if(strtolower($request_method)=='post')curl_setopt($ch, CURLOPT_POST, true); //POST方式时添加
	if(strpos(strtolower($url), 'https://')===0){
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //https请求时跳过cURL验证对等证书
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //https请求时跳过cURL验证域名
	}
	if($post_data)curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
	if(is_array($opt_array) && count($opt_array))curl_setopt_array($ch, $opt_array);
	$output = curl_exec($ch);
//	$outinfo = curl_getinfo($ch);
	$err_no = curl_errno($ch);
	$curl_error = $err_no ?  'curl: '.curl_error($ch)." $err_no" : ''; //失败时返回当前会话最后一次错误的字符串
	curl_close($ch);
	if($err_no){
		log_message('error', $curl_error);
		return FALSE;
	}else{
		return $output;
	}
}

PHP基础知识

● array get_defined_constants ([ bool $categorize = false ] )
返回当前所有已定义的常量名和值,$categorize=true 时返回常量分类后的多维数组

json_encode($value, $flag)
对变量主要是数组进行 JSON 编码

json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

JSON_ERROR_NONE (int)
没有错误发生。
JSON_ERROR_DEPTH (int)
到达了最大堆栈深度。
JSON_ERROR_STATE_MISMATCH (int)
出现了下溢(underflow)或者模式不匹配。
JSON_ERROR_CTRL_CHAR (int)
控制字符错误,可能是编码不对。
JSON_ERROR_SYNTAX (int)
语法错误。
JSON_ERROR_UTF8 (int)
异常的 UTF-8 字符,也许是因为不正确的编码。
JSON_ERROR_RECURSION (int)
传递给 json_encode() 函数的对象或数组包含了递归引用,导致无法被编码。如果打开了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则牵涉到递归引用的数据会转换成 null 后返回。
JSON_ERROR_INF_OR_NAN (int)
传递给 json_encode() 函数的参数中包含了 NAN 或 INF,导致编码出错。如果打开了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则牵涉到对应不可编码的数字,会转换成数字 0 后返回。
JSON_ERROR_UNSUPPORTED_TYPE (int)
传递了不支持的数据类型给 json_encode() 函数,比如 resource。如果打开了 JSON_PARTIAL_OUTPUT_ON_ERROR 选项,则对于不支持的数据类型,会转换成 null 后返回。
JSON_ERROR_INVALID_PROPERTY_NAME (int)
A key starting with \u0000 character was in the string passed to json_decode() when decoding a JSON object into a PHP object.
JSON_ERROR_UTF16 (int)
Single unpaired UTF-16 surrogate in unicode escape contained in the JSON string passed to json_encode().
下面的常量可以和 json_decode() 的 form 选项结合使用。

JSON_BIGINT_AS_STRING (int)
将大数字编码成原始字符原来的值。
JSON_OBJECT_AS_ARRAY (int)
将 JSON 对象作为数组解码。当调用 json_decode() 且第二个参数为 true 时此选项会自动添加。
下面的常量可以和 json_encode() 的 form 选项结合使用。

JSON_HEX_TAG (int)
所有的 < 和 > 转换成 \u003C 和 \u003E。
JSON_HEX_AMP (int)
所有的 & 转换成 \u0026。
JSON_HEX_APOS (int)
所有的 ' 转换成 \u0027。
JSON_HEX_QUOT (int)
所有的 " 转换成 \u0022。
JSON_FORCE_OBJECT (int)
使一个非关联数组输出一个类(Object)而非数组。 在数组为空而接受者需要一个类(Object)的时候尤其有用。
JSON_NUMERIC_CHECK (int)
将所有数字字符串编码成数字(numbers)。
JSON_PRETTY_PRINT (int)
用空白字符格式化返回的数据。
JSON_UNESCAPED_SLASHES (int)
不要编码 /。
JSON_UNESCAPED_UNICODE (int)
以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
用不可编码的值来代替失败。
JSON_PRESERVE_ZERO_FRACTION (int)
确保 float 值始终编码为为 float 值。
JSON_UNESCAPED_LINE_TERMINATORS (int)
The line terminators are kept unescaped when JSON_UNESCAPED_UNICODE is supplied. It uses the same behaviour as it was before PHP 7.1 without this constant. Available since PHP 7.1.0.
下面的常量可以和 json_decode() 及 json_encode() 的 form 选项结合使用。

JSON_INVALID_UTF8_IGNORE (int)
忽略无效的 UTF-8 字符。自 PHP 7.2.0 起生效。
JSON_INVALID_UTF8_SUBSTITUTE (int)
将无效 UTF-8 字符转换为 \0xfffd(Unicode 字符"虚缺号")。自 PHP 7.2.0 起生效。
JSON_THROW_ON_ERROR (int)
如果发生错误则会抛出 JsonException,而不是通过 json_last_error() 和 json_last_error_msg() 检索设置到全局的错误状态。JSON_PARTIAL_OUTPUT_ON_ERROR 优先于 JSON_THROW_ON_ERROR。自 PHP 7.3.0 起生效。

json_decode(string $json [, bool $assoc)
对 JSON 格式的字符串进行编码
当参数$assoc为 TRUE 时,将返回 array 而非 object 。

serialize(mixed $value)
产生一个可存储的值的表示,主要是把数组转换成字符串,便于传递
结果默认已经转义,无须再用 addslashes()

unserialize(string $str)
从已存储的表示中创建 PHP 的值,主要是把字符串还原成数组

● array get_defined_vars   — 获取由所有已定义变量所组成的数组

● array get_defined_functions — 获取所有已经定义的函数

● array get_loaded_extensions — 获取所有可用的模块

● array get_extension_funcs — 获取指定模块的可用函数,传入的参数(模块名称)必须是小写
  print_r(get_extension_funcs("gd"));
  print_r(get_extension_funcs("xml")); 

● array get_defined_constants — 获取关联数组的名字所有的常量和他们的价值

● array get_declared_classes — 获取由已定义类的名字所组成的数组

● get_included_files() 和 get_required_files()  — 返回被 include 和 require 文件名的 array

● 用 PHP_EOL 代替写入文本文件的回车换行(windows系统为 \r\n ,unix系统为 \n ,MAC 为 \r ,MAC OS X 为 \n

file_put_contents($file, $data, FILE_APPEND | LOCK_EX) 
  FILE_APPEND | LOCK_EX 追加方式写入,且写入时锁定

int memory_get_usage ([ bool $real_usage = false ] )
返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)。
int memory_get_peak_usage ([ bool $real_usage = false ] )
返回分配给你的 PHP 脚本的内存峰值字节数。
如果设置为 TRUE 可以获取从系统分配到的真实内存尺寸。 如果未设置,或者设置为 FALSE,仅会报告 emalloc() 使用的内存。

几个 PHP 的"魔术常量"

名称说明
__LINE__文件中的当前行号。
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
__FUNCTION__函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
__TRAIT__Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
__METHOD__类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

PHP函数处理函数


ASP中RecordSet Open和Connection.Execute的一些区别

rs.open sql,conn:如果sql是delete,update,insert则会返回一个关闭的记录集,不需要rs.close
如果sql是update,insert,delete则应该使用conn.execute(sql)也可以不要括号conn.execute sql
如果sql是select语句则应该使用set rs=conn.execute(sql)括号一定要,不能省略:这是因为vbscript的特性,带返回值的调用必须加括号,不带返回值的调用可以不要括号。

注意:不管是rs.open sql,conn还是conn.execute(sql) [这里的SQL是delete,update,insert]执行以后都会返回一个关闭的记录集,也就是说如果sql是插入、更新、删除语句,那么set rs=conn.execute(sql)中的RS就没什么意义。

1.conn.execute
sql="select * from admin where username='xiaozhu'"
set rs=conn.execute(sql)
执行完以后自动关闭记录集
最后只需要关闭连接就可以了
Set Rs=Nothing
conn.close
set conn=nothing

2.rs.open
set rs=server.createobject("adodb.recordset")
sql="select * from admin where username='xiaozhu'"
rs.open sql,conn,1,1
可以自己设定一些参数,即锁定和游标的移动方式
最后要关闭记录集和连接
rs.close
set rs=nothing
conn.close
set conn=nothing

3.command.execute
sql="select * from admin where username='xiaozhu'"
set rs=command.execute(sql)

*****************************************************************************
1.
set rs=conn.execute("如果是select语句") 得到的rs.recordcount=-1
rs.open sql,conn("sql为select语句") 得到的rs.recordcount为正常的记录数

2.
rs.open是打开数据库 conn.execute 是执行SQL指令
set rs=conn.execute(insert,update,delete)返回一个关闭了的记录集
set rs=conn.execute(select)返回一个没有关闭的记录集

3.
CONN.EXECUTE(SQL,RowsAffected,C)
参数含义:
SQL的值可以是SQL语句、表名、存储过程名,也可以是数据提供者所能接受的任意字符串。为了提高性能,最好为C参数指定合适的值
可选参数RowsAffected将返回INSERT、UPDATE或DELETE查询执行以后所影响的数目。这些查询会返回一个关闭的Recordset对象。
一个SELECT查询将返回RowsAffected值为-1并且返回带有一行或多行内容的打开的Recordset。

4.
conn.execute sql适合于不需返回recordset对象时使用,比如下面的代码:
sql="delete from enews where id="&cstr(id)
conn.execute sql

如果需要返回recordset对象,则使用如下代码:
sql="select from enews where id="&cstr(id)
set rs = conn.execute(sql)

如果去掉execute(sql)这儿的括号(即为set rs = conn.execute sql),就会提示“语句未结束”这样的错误提示,我翻看了一下语法格式,发现有二种格式,详解如下:
格式一:Connection对象名.Execute(SQL指令).
格式二:Connection对象名.Execute(数据表名)。
rs.open sql,conn 
rs.open sql,conn,1,1 
rs.open sql,conn,3,2 
rs.open sql,conn,3,3 
关于上面语句中后面的数字都代表什么意思?还有省略数字(rs.open sql,conn)时默认的是哪一个? 
 
最佳答案 
RS.OPEN SQL,CONN,A,B 
A: ADOPENFORWARDONLY(=0) 只读,且当前数据记录只能向下移动 
ADOPENKEYSET(=1) 可读写,当前数据记录可自由移动 
ADOPENDYNAMIC(=2) 可读写,当前数据记录可自由移动,可看到新增记录 
ADOPENSTATIC(=3) 只读,当前数据记录可自由移动 
B: ADLOCKREADONLY(=1) 缺省锁定类型,记录集是只读的,不能修改记录 
ADLOCKPESSIMISTIC(=2) 悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。 
ADLOCKOPTIMISTIC(=3) 乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。 
ADLOCKBATCHOPTIMISTIC(=4) 批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。 当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间, 数据在这段时间被更新。这减少了资源的使用。

http://blog.sina.com.cn/s/blog_5140c6740100gnci.html

CodeIgniter命名规则

1、类文件的命名必须以大写字母开头,其他文件(配置文件,视图,一般的脚本文件等)的命名是全小写。类文件的名称必须和类的名称保持一致,例如,如果你有一个类名为 Myclass , 那么文件名应该是 Myclass.php 。

2、类名(core、libraries、helpers)必须以大写字母开头,多个单词之间使用下划线分割,不要使用驼峰命名法。

3、扩展类需要加前缀MY_(可以在application/config/config.php中自定义$config['subclass_prefix']),类名首字母大写,如扩展核心类CI_Controller:
class MY_Controller extends CI_Controller{}

4、类的方法应该使用全小写,并且应该明确指出该方法的功能,最好包含一个动词。 避免使用冗长的名称,多个单词之间使用下划线分割。

5、辅助函数的文件名全小写,但扩展CI自带的辅助函数需要加config中自定义的前缀MY_。如扩展array_helper.php的文件名应该为 MY_array_helper.php

6、变量的命名规则和类方法的命名规则非常接近,使用全小写,使用下划线分割, 并且应该明确指出该变量的用途。非常短的无意义的变量只应该在 for 循环中作为迭代器使用。

7、控制器放在子目录中,如 application/controllers/Product/Tv.php 中方法 detail() ,访问地址为: index.php/Product/tv/detail 子目录名大小写必须与实际一致(windows系统可不区分)

http://codeigniter.org.cn/user_guide/general/styleguide.html

ASP错误 -2147467259 所有记录中均未找到搜索关键字

如果access的备注字段存在索引,当字段的内容超过1908个字节后,该记录将不可编辑、不可删除,此时编辑或删除将出现如题错误。

ASP错误 80040e14 内存溢出

Microsoft JET Database Engine 错误 '80040e14'
内存溢出

主要原因:

1、字段或表名使用了保留字,如:select、insert、date等,不要使用保留字,或在sql中相应字段加方括号,如 [select]

2、要查询的字段包含特殊字符,常见的有bom标记等不可见字符,可以在数据保存时使用正则过滤掉,我的做法:regReplace(str, "[\ufeff\u2028\u2029\xa0]+", "")

3、包含日文字符,并不是所有的日文字符都有问题,而是只有26个有问题,这个是access的bug,只能在保存数据时进行转换成自定义的字符,查询和显示时再转换回去。如果不需要日文查询,可以在保存时,把相应日文转义。如你转义为&#20320;
我的做法:

Function jpEncode(ByVal s)
	Dim jpArr, i
	'26个日文字符的unicode代码
	jpArr=array(12468, 12460, 12462, 12464, 12466, 12470, 12472, 12474,_
			12485, 12487, 12489, 12509, 12505, 12503, 12499, 12497,_
			12532, 12508, 12506, 12502, 12500, 12496, 12482, 12480,_
			12478, 12476)
	For i=0 To Ubound(jpArr)
		s=Replace(s, ChrW(jpArr(i)), "&#"&jpArr(i)&";")
	Next
	jpEncode=s
End Function

通过预加载在图片加载前读取图片尺寸

/***************************************************************************************
 * 图片头数据加载就绪获取图片尺寸
 * @version	2011.05.27
 * @author	TangBin
 * @see		http://www.planeart.cn/?p=1121
 * @param	{String}	图片路径
 * @param	{Function}	尺寸就绪
 * @param	{Function}	加载完毕 (可选)
 * @param	{Function}	加载错误 (可选)
yundanran_imageSize('http://b.zol-img.com.cn/desk/bizhi/image/5/2560x1600/1409624254331.jpg', function ()
{
	alert('size ready: width=' + this.width + '; height=' + this.height);
});
*******************************************************************************************/
var yundanran_imageSize = (function () 
{
	var list = [], intervalId = null,

	// 用来执行队列
	tick = function () {
		var i = 0;
		for (; i < list.length; i++) {
			list[i].end ? list.splice(i--, 1) : list[i]();
		};
		!list.length && stop();
	},

	// 停止所有定时器队列
	stop = function () {
		clearInterval(intervalId);
		intervalId = null;
	};

	return function (url, ready, load, error) {
		var onready, width, height, newWidth, newHeight,
			img = new Image();
		
		img.src = url;

		// 如果图片被缓存,则直接返回缓存数据
		if (img.complete) {
			ready.call(img);
			load && load.call(img);
			return;
		};
		
		width = img.width;
		height = img.height;
		
		// 加载错误后的事件
		img.onerror = function () {
			error && error.call(img);
			onready.end = true;
			img = img.onload = img.onerror = null;
		};
		
		// 图片尺寸就绪
		onready = function () {
			newWidth = img.width;
			newHeight = img.height;
			if (newWidth !== width || newHeight !== height ||
				// 如果图片已经在其他地方加载可使用面积检测
				newWidth * newHeight > 1024
			) {
				ready.call(img);
				onready.end = true;
			};
		};
		onready();
		
		// 完全加载完毕的事件
		img.onload = function () {
			// onload在定时器时间差范围内可能比onready快
			// 这里进行检查并保证onready优先执行
			!onready.end && onready();
		
			load && load.call(img);
			
			// IE gif动画会循环执行onload,置空onload即可
			img = img.onload = img.onerror = null;
		};

		// 加入队列中定期执行
		if (!onready.end) {
			list.push(onready);
			// 无论何时只允许出现一个定时器,减少浏览器性能损耗
			if (intervalId === null) intervalId = setInterval(tick, 40);
		};
	};
})();

http://qianduanblog.com/post/js-learning-10-image-reload-size.html

很好的个人博客

http://qianduanblog.com/

http://code.ciaoca.com/

2024-05-17 星期五 农历四月初十