中英文字符串截取,不乱码

从网上找的一段字符串截取代码,我简单测试了一下,应该是不会乱码的。
如果是中英混合那么,它会把中英文都算作一个字。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
/* 
Utf-8、gb2312都支持的汉字截取函数 
cut_str(字符串, 截取长度, 开始长度, 编码); 
编码默认为 utf-8 
开始长度默认为 0 
*/ 
 
function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') 
{ 
    if($code == 'UTF-8') 
    { 
        $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"; 
        preg_match_all($pa, $string, $t_string); 
 
        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; 
        return join('', array_slice($t_string[0], $start, $sublen)); 
    } 
    else 
    { 
        $start = $start*2; 
        $sublen = $sublen*2; 
        $strlen = strlen($string); 
        $tmpstr = ''; 
 
        for($i=0; $i< $strlen; $i++) 
        { 
            if($i>=$start && $i< ($start+$sublen)) 
            { 
                if(ord(substr($string, $i, 1))>129) 
                { 
                    $tmpstr.= substr($string, $i, 2); 
                } 
                else 
                { 
                    $tmpstr.= substr($string, $i, 1); 
                } 
            } 
            if(ord(substr($string, $i, 1))>129) $i++; 
        } 
        if(strlen($tmpstr)< $strlen ) $tmpstr.= "..."; 
        return $tmpstr; 
    } 
} 
 
$str = "abcd需要截取的字符串"; 
echo cut_str($str, 6); 
/** 
 * @package     BugFree 
 * @version     $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $ 
 * 
 * 
 * Return part of a string(Enhance the function substr()) 
 * 
 * @author                  Chunsheng Wang <wwccss@263.net> 
 * @param string  $String  the string to cut. 
 * @param int     $Length  the length of returned string. 
 * @param booble  $Append  whether append "...": false|true 
 * @return string           the cutted string. 
 */ 
function sysSubStr($String,$Length,$Append = false) 
{ 
    if (strlen($String) <= $Length ) 
    { 
        return $String; 
    } 
    else 
    { 
        $I = 0; 
        while ($I < $Length) 
        { 
            $StringTMP = substr($String,$I,1); 
            if ( ord($StringTMP) >=224 ) 
            { 
                $StringTMP = substr($String,$I,3); 
                $I = $I + 3; 
            } 
            elseif( ord($StringTMP) >=192 ) 
            { 
                $StringTMP = substr($String,$I,2); 
                $I = $I + 2; 
            } 
            else 
            { 
                $I = $I + 1; 
            } 
            $StringLast[] = $StringTMP; 
        } 
        $StringLast = implode("",$StringLast); 
        if($Append) 
        { 
            $StringLast .= "..."; 
        } 
        return $StringLast; 
    } 
} 
 
$String = "Code简单、精彩、通用"; 
$Length = "6"; 
$Append = false; 
echo sysSubStr($String,$Length,$Append); 
?>

常用MYSQL中的SQL语句记录

数据库中的范式说明,以前在文豆培训的时候,宋老师说了什么第一第二第三范式,当时也不是太懂,现在又回头看了一下,看了网上几个简单的例子,觉得不是太难,贴上来,现在在公司经常会涉及到设计数据库,兵家打仗,粮草先行,做网站,数据库必须先设计好。
第一范式:(1NF)无重复的列
表:编号 学生姓名 学生身高 班级名称 班级大小
第二范式:(2NF)属性完全依赖于主键
表:编号 学生姓名 学生身高 班级名称 班级大小
改为
表1: 编号 学生姓名 学生身高
表2: 编号 班级名称 班级大小
第三范式:(3NF)属性不依赖于其它非主属性
表1: 编号 学生姓名 学生身高 班级编号(此时这里不应该再有 班级名称、班级大小这些字段信息)
表2: 编号 班级名称 班级大小

<?php
// ========================================================
// 下面这段代码展示了如何创建主数据库,并创建主从用户名、密码,并赋予主数据库所有权限,从数据库只读权限
$dbName		=	'test_db';
$userName	=	'test_db_user';
$userPass	=	'test_db_pass';
 
$readDbName		=	'readtest_db';
$readUserName	=	'readtest_db_user';
$readUserPass	=	'readtest_db_pass';
 
$sql[0]=	"CREATE DATABASE  `$dbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
$sql[1]=	"CREATE USER '$userName'@'%' IDENTIFIED BY  '$userPass';";
$sql[2]=	"GRANT USAGE ON * . * TO  '$userName'@'%' IDENTIFIED BY  '$userPass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
$sql[3]=	"GRANT ALL PRIVILEGES ON  `$dbName` . * TO  '$userName'@'%' WITH GRANT OPTION ;";
$sql[4]=	"CREATE USER '$userName'@'localhost' IDENTIFIED BY  '$userPass';";
$sql[5]=	"GRANT USAGE ON * . * TO  '$userName'@'localhost' IDENTIFIED BY  '$userPass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
$sql[6]=	"GRANT ALL PRIVILEGES ON  `$dbName` . * TO  '$userName'@'localhost' WITH GRANT OPTION ;";
 
$sql[7]=	"CREATE USER '$readUserName'@'%' IDENTIFIED BY  '$readUserPass';";
$sql[8]=	"GRANT USAGE ON * . * TO  '$readUserName'@'%' IDENTIFIED BY  '$readUserPass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
$sql[9]=	"GRANT SELECT ON  `$readDbName` . * TO  '$readUserName'@'%';";
$sql[10]=	"CREATE USER '$readUserName'@'localhost' IDENTIFIED BY  '$readUserPass';";
$sql[11]=	"GRANT USAGE ON * . * TO  '$readUserName'@'localhost' IDENTIFIED BY  '$readUserPass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
$sql[12]=	"GRANT SELECT ON  `$readDbName` . * TO  '$readUserName'@'%';";
 
mysql_connect('localhost','root','') or die('die db');
 
foreach ($sql as $v)
{
	$re	=	mysql_query($v)==true ? 'true' : 'false'; 	
	echo $re.'<br />';
}
 
// ========================================================
// 下面这些SQL片段是摘自w3school的学习笔记,大家可以参考
 
//显示数据库	
$sql	=	"SHOW DATABASES;";
//创建数据库	
$sql	=	"CREATE DATABASE  `testaa` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
//删除数据库	
$sql	=	"DROP DATABASE  `testaa`;";
//创建表	
$sql	=	"CREATE TABLE  `testaa`.`test` (`id` INT UNSIGNED NULL AUTO_INCREMENT PRIMARY KEY) ENGINE = MYISAM ;";
//删除表	
$sql	=	"DROP TABLE `test`;";
//显示表	
$sql	=	"SHOW TABLES;";
//描述表	
$sql	=	"DESCRIBE `test`;";
//插入表	
$sql	=	"INSERT INTO `testaa`.`test` (`id`) VALUES ('2'), ('3');";
 
// ========================================================
// SQL用法
 
//ORDER BY用法
$sql	=	"SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber;";
$sql	=	"SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC;";
 
//TOP用法
$sql	=	"SELECT TOP 2 * FROM Persons;";
$sql	=	"SELECT TOP 50 PERCENT * FROM Persons;";
 
//LIKE和NOT LIKE用法 
$sql	=	"SELECT * FROM Persons WHERE City LIKE '%g';";
$sql	=	"SELECT * FROM Persons WHERE City NOT LIKE '%lon%';";
 
//_通配符,匹配单个字符,(可以匹配Carter)
$sql	=	"SELECT * FROM Persons WHERE LastName LIKE 'C_r_er';";  
 
//[]通配符
//现在,我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:
$sql	=	"SELECT * FROM Persons WHERE City LIKE '[ALN]%';";
//现在,我们希望从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人:
$sql	=	"SELECT * FROM Persons WHERE City LIKE '[!ALN]%';";
 
// IN用法
$sql	=	"SELECT * FROM Persons WHERE LastName IN ('Adams','Carter');";
 
//BETWEEN  AND和NOT BETWEEN  AND用法
$sql	=	"SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter';";
 
//AS用法
$sql	=	"SELECT LastName AS Family, FirstName AS Name FROM Persons;";
 
// 多表查询
$sql	=	"SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P;";
 
// JOIN用法
$sql	=	"SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName;";
 
/*
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
*/
 
//UNION和UNION ALL用法,UNION会去掉重复的值,UNION ALL不会去除重复
$sql	=	"SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA;";
$sql	=	"SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA;";
 
//SELECT INTO用法(可以用来制作备份文件)
$sql	=	"SELECT * INTO Persons_backup FROM Persons;";
$sql	=	"SELECT Persons.LastName,Orders.OrderNo INTO Persons_Order_Backup FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P;";
 
// SQL UNIQUE约束,CONSTRAINT是用来重命名的
$sql	=	"CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
);";
 
// 添加UNQIUE约束
$sql	=	"ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);";
// 删除UNQIUE约束
$sql	=	"ALTER TABLE Persons DROP INDEX uc_PersonID;";
 
//SQL PRIMARY KEY 约束 (类似UNIQUE)
 
//SQL FOREIGN KEY 外键约束
$sql	=	"CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
);";
 
// 添加FOREIGN KEY 外键约束
$sql	=	"ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P);";
// 删除FOREIGN KEY 外键约束
$sql	=	"ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;";
 
// SQL CHECK 约束
// CHECK 约束用于限制列中的值的范围。
$sql	=	"CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
);";
 
// 添加SQL CHECK 约束
$sql	=	"ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes');";
// 删除SQL CHECK 约束
$sql	=	"ALTER TABLE Persons DROP CONSTRAINT chk_Person;";
 
//Default默认值
$sql	=	"CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
);";
 
// 索引
 
// 创建索引
$sql	=	"CREATE INDEX index_name ON table_name (column_name);";  
// 创建唯一索引
$sql	=	"CREATE UNIQUE INDEX index_name ON table_name (column_name);"; 
// 创建索引(这个有点看不懂)
$sql	=	"CREATE INDEX PersonIndex ON Person (LastName, FirstName);"; 
// 删除索引
$sql	=	"ALTER TABLE table_name DROP INDEX index_name;"; 
 
//清空表中的数据
//表名称
$sql	=	"TRUNCATE TABLE;";  
 
// ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
// 添加字段:
$sql	=	"ALTER TABLE Persons ADD Birthday date;";
// 修改字段:
$sql	=	"ALTER TABLE Persons ALTER COLUMN Birthday year;";
// 删除字段:
$sql	=	"ALTER TABLE Persons DROP COLUMN Birthday;";
 
//AUTO_INCREMENT用法
$sql	=	"CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);";
 
 
//判断字段值是否是NULL,使用IS NULL或者IS NOT NULL
$sql	=	"SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL;";
 
// mysql中的IFNULL和COALESCE用法
$sql	=	"SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products;";
 
/*
SQL数据类型
TEXT类型中的BLOB\ENUM\SET类型比较少用到,简单介绍
BLOB:用于存储二进制大对象
ENUM:类似于单选下拉框值
SET:类似于多选选下拉框值,多个值用逗号分割
*/
 
// SQL 函数 以下内容参考W3SCHOOL.COM.CN
// SELECT function(列) FROM 表
 
//平均值
$sql	=	"SELECT AVG(OrderPrice) AS OrderAverage FROM Orders;";
 
//高于平均值
$sql	=	"SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)";
 
// COUNT统计
$sql	=	"SELECT COUNT(DISTINCT column_name) FROM table_name;";
 
// FIRST
$sql	=	"SELECT FIRST(column_name) FROM table_name;";
 
// LAST
$sql	=	"SELECT LAST(column_name) FROM table_name;";
 
//MAX
$sql	=	"SELECT MAX(column_name) FROM table_name;";
 
//MIN
$sql	=	"SELECT MIN(column_name) FROM table_name;";
 
//SUM
$sql	=	"SELECT SUM(column_name) FROM table_name;";
 
/*
 * GROUP BY 语句
 * GROUP BY 多个列可能会在统计中常用到,可以参考示例
 */
$sql	=	"SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer;";
 
//HAVING 子句
$sql	=	"SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000;";
 
// UCASE 函数把字段的值转换为大写
$sql	=	"SELECT UCASE(column_name) FROM table_name;";
 
// LCASE 函数把字段的值转换为小写
$sql	=	"SELECT LCASE(column_name) FROM table_name;";
 
// MID 函数用于从文本字段中提取字符,会取出City字段的三位字符
$sql	=	"SELECT MID(City,1,3) as SmallCity FROM Persons;";
 
// LEN 函数返回文本字段中值的长度
$sql	=	"SELECT LEN(City) as LengthOfCity FROM Persons;";
 
// ROUND 函数用于把数值字段舍入为指定的小数位数
$sql	=	"SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products;";
 
// NOW 函数返回当前的日期和时间
$sql	=	"SELECT ProductName, UnitPrice, Now() as PerDate FROM Products;";
 
// FORMAT 函数用于对字段的显示进行格式化
$sql	=	"SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate FROM Products;";
 
//LENGTH 用法,查找字段长度为9的所有字段值
$sql	=	"SELECT * FROM  `abc` WHERE LENGTH(  `abcd` ) =9";

php常用验证

这个也是从网上找的,没有验证过是否正确,使用时需要小心。

<?php
class class_post {
	//验证是否为指定长度的字母/数字组合 
	function fun_text1($num1, $num2, $str) {
		Return (preg_match ( "/^[a-zA-Z0-9]{" . $num1 . "," . $num2 . "}$/", $str )) ? true : false;
	}
	//验证是否为指定长度数字 
	function fun_text2($num1, $num2, $str) {
		return (preg_match ( "/^[0-9]{" . $num1 . "," . $num2 . "}$/i", $str )) ? true : false;
	}
	//验证是否为指定长度汉字 
	function fun_font($num1, $num2, $str) {
		// preg_match("/^[\xa0-\xff]{1,4}$/", $string); 
		return (preg_match ( "/^([\x81-\xfe][\x40-\xfe]){" . $num1 . "," . $num2 . "}$/", $str )) ? true : false;
	}
	//验证身份证号码 
	function fun_status($str) {
		return (preg_match ( '/(^([\d]{15}|[\d]{18}|[\d]{17}x)$)/', $str )) ? true : false;
	}
	//验证邮件地址 
	function fun_email($str) {
		return (preg_match ( '/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$/', $str )) ? true : false;
	}
	//验证电话号码 
	function fun_phone($str) {
		return (preg_match ( "/^(((d{3}))|(d{3}-))?((0d{2,3})|0d{2,3}-)?[1-9]d{6,7}$/", $str )) ? true : false;
	}
	//验证邮编 
	function fun_zip($str) {
		return (preg_match ( "/^[1-9]d{5}$/", $str )) ? true : false;
	}
	// 数据入库 转义 特殊字符 传入值可为字符串 或 一维数组 
	function data_join(&$data) {
		if (get_magic_quotes_gpc () == false) {
			if (is_array ( $data )) {
				foreach ( $data as $k => $v ) {
					$data [$k] = addslashes ( $v );
				}
			} else {
				$data = addslashes ( $data );
			}
		}
		Return $data;
	}
	//验证邮编 
	function fun_zip($str) {
		return (preg_match ( "/^[1-9]d{5}$/", $str )) ? true : false;
	}
}
?>

硬着头皮开始学codeigniter

官方推荐了一个stblog,慢慢开始看把

update time 2011-12-18 08:24:42

开始写这个标题的时间是2011年12月11日,现在是2011年12月18日,整整过了7天,我根本就没有心思静下心来去看别人写的代码,这让我自己太失望了。

公司的那些个项目想要整一个ci框架去开发不太现实,因为大家都不用,所以最好的方案就是自己写一个基于MVC模式的公司框架。

之前写了好几个网站,说实话,代码的东西,我感觉扩展性能实在是太差。代码的实现过程完全是我自己想怎么写就怎么写,没能够有一个规范性的东西去约束。

用现成的php框架去开发东西的公司很少,如果要用,那么必定是自己改装过的或者完全就是自己写的,为公司定制的。

再说回stblog,我昨晚看了它的源代码,很多地方的代码量确实不少,但结构算是很清晰了,非常想弄懂。

完全看不懂,非常郁闷,但又不相信自己很差,希望自己能够愈战愈勇。

使用curl模拟post多数据到远程服务器

由于使用get方式传输的数据量太少,故而使用post,注意设置超时时间
更多POST方式可以参考http://www.oschina.net/code/snippet_127872_6370

function request_by_curl($remote_server,$post_string,$second=60){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$remote_server);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$post_string);
    curl_setopt($ch,CURLOPT_TIMEOUT,$second); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2');
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

现在系统代码中经常会使用到file_get_contents这个函数同样也可以post,注意设置超时时间
参考:http://www.cnblogs.com/samson/archive/2011/08/12/2135834.html

<?php
function Post($url, $post = null,$type='POST')
{
     $context = array();
     if (is_array($post))
     {
         $opts = array(
            'http' => array(
              'timeout'=>60,
                'method'=>$type,
              'content' => http_build_query($post),
                'header' => 'Content-Type:application/x-www-form-urlencoded;',
            ),
        );
  if($type!='POST')
  {
   $url .= '?'.$opts['http']['content'];
  }
     }
     return file_get_contents($url, false, stream_context_create($opts));
}
$data = array
(
     'name' => 'test',
     'email' => 'test@gmail.com',
     'submit' => 'submit',
);
$cnt=0;
while($cnt < 3 && ($str=Post('http://localhost/test5.php', $data,'POST'))===FALSE)
{
 $cnt++;
}
var_dump($str);
?>