PHP解决json_encode中文UNICODE转码问题(汇总)
什么是json_encode中文UNICODE转码问题?
先看下边的小列子
<?php echo json_encode("中文"); //输出: "\u4e2d\u6587"
在使用 json_encode() 函数将变量转义成json字符串的时候,由于json_encode()仅支持中文。
json_encode()函数会将中文转成utf-8的UNICODE编码。也就是大家看到的“\uxxxx”代表一个中文汉字的形式。
如何能让PHP更好的支持中文呢?
PHP5.4开始,给 json_encode() 增加了第二个参数 JSON_UNESCAPED_UNICODE 这样就可以很好的支持中文了,中文不会在被转义成 “\uxxxx” 的形式。
<?php echo json_encode("中文", JSON_UNESCAPED_UNICODE); //输出: "中文"
JSON_UNESCAPED_UNICODE 常量对应的 JSON_UNESCAPED_UNICODE => 256
以上代码还可以写成
<?php echo json_encode("中文", 256 ); //输出: "中文"
PHP5.4 为json_encode() 函数增加了 JSON_UNESCAPED_UNICODE 参数,很好的解决了中文显示的问题。他还增加了:
JSON_BIGINT_AS_STRING,
JSON_PRETTY_PRINT,
JSON_UNESCAPED_SLASHES
等选项, 如果有兴趣, 大家可以参看: json_encode
———–华丽的分割线—–PHP老版本兼容问题——–
PHP5.4 增加了 JSON_UNESCAPED_UNICODE 参数 为 变量转json字符串的中文支持提供了更好的支持。
那么老版本的PHP如何更好的支持中文呢?
总体上有2个思路
思路一:
1.在json_encode() 之前,先把中文用urlencode()函数转url编码( 中文变成%XXX的形式了)。
2.在json_encode() 之后,把url编码的中文利用urldecode()函数转成中文。
示例代码:
$array = array( 'test'=>urlencode("中文") ); $array = json_encode($array); echo urldecode($array); //输出:{"test":"中文"}
思路二: 先json_encode()在解决中文UNICODE转码问题。你需要一个UNICODE转码转中文函数:
function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function( '$matches', 'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");' ), $str); }
有了这个函数后,你就可以这样做了 :
$arr = array('name1':"中文",'name2':'abc12'); $jsonstr = decodeUnicode(json_encode($arr));//先转json ,再处理中文UNICODE转码问题
当然,你可以将上边两步封装成一步,直接封装一个 json_encode_ex();函数。
/** * 对变量进行 JSON 编码 * @param mixed value 待编码的 value ,除了resource 类型之外,可以为任何数据类型,该函数只能接受 UTF-8 编码的数据 * @return string 返回 value 值的 JSON 形式 */ function json_encode_ex($value) { if (version_compare(PHP_VERSION, '5.4.0', '<')) { $str = json_encode($value); $str = preg_replace_callback("#\\\u([0-9a-f]{4})#i", function($matchs) { return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1])); }, $str); return $str; } else { return json_encode($value, JSON_UNESCAPED_UNICODE); } }
PHP官方简体中文手册 CHM 2016最新版本
PHP官方简体中文手册 CHM 2016最新版本,改手册编译于2016年5月6日 官方终于提供了中文版手册,是国内学习PHP的新手老手的福音!这个最新的中文手册希望能给您带来帮助。
下载地址:http://pan.baidu.com/s/1dE0L7gt
备用地址:http://pan.baidu.com/s/1gf7dvov
php生成条码函数,PHP生成一维码函数
<?php /** *条码生成函数(一维码) *注意 条码为 11位数字 */ UPCAbarcode(12345678901); function UPCAbarcode($code) { $lw = 2; $hi = 100; $Lencode = array('0001101','0011001','0010011','0111101','0100011', '0110001','0101111','0111011','0110111','0001011'); $Rencode = array('1110010','1100110','1101100','1000010','1011100', '1001110','1010000','1000100','1001000','1110100'); $ends = '101'; $center = '01010'; /* UPC-A Must be 11 digits, we compute the checksum. */ if ( strlen($code) != 11 ) { die("UPC-A Must be 11 digits."); } /* Compute the EAN-13 Checksum digit */ $ncode = '0'.$code; $even = 0; $odd = 0; for ($x=0;$x<12;$x++) { if ($x % 2) { $odd += $ncode[$x]; } else { $even += $ncode[$x]; } } $code.=(10 - (($odd * 3 + $even) % 10)) % 10; /* Create the bar encoding using a binary string */ $bars=$ends; $bars.=$Lencode[$code[0]]; for($x=1;$x<6;$x++) { $bars.=$Lencode[$code[$x]]; } $bars.=$center; for($x=6;$x<12;$x++) { $bars.=$Rencode[$code[$x]]; } $bars.=$ends; /* Generate the Barcode Image */ $img = ImageCreate($lw*95+30,$hi+30); $fg = ImageColorAllocate($img, 0, 0, 0); $bg = ImageColorAllocate($img, 255, 255, 255); ImageFilledRectangle($img, 0, 0, $lw*95+30, $hi+30, $bg); $shift=10; for ($x=0;$x<strlen($bars);$x++) { if (($x<10) || ($x>=45 && $x<50) || ($x >=85)) { $sh=10; } else { $sh=0; } if ($bars[$x] == '1') { $color = $fg; } else { $color = $bg; } ImageFilledRectangle($img, ($x*$lw)+15,5,($x+1)*$lw+14,$hi+5+$sh,$color); } /* Add the Human Readable Label */ ImageString($img,4,5,$hi-5,$code[0],$fg); for ($x=0;$x<5;$x++) { ImageString($img,5,$lw*(13+$x*6)+15,$hi+5,$code[$x+1],$fg); ImageString($img,5,$lw*(53+$x*6)+15,$hi+5,$code[$x+6],$fg); } ImageString($img,4,$lw*95+17,$hi-5,$code[11],$fg); /* Output the Header and Content. */ header("Content-Type: image/png"); ImagePNG($img); } ?>
WordPress的数据库操作类ezSQL
WordPress的数据库操作类ezSQL。
ezSQL是一个非常好用的PHP数据库操作类。著名的开源博客WordPress的数据库操作就使用了ezSQL的MySQL部分。该数据库操作类支持几乎所有主流的数据库,如:PHP-PDO, mySQL, Oracle, InterBase/FireBird, PostgreSQL, SQLite以及MS-SQL等。ezSQL具有很强的调试功能,可以快速地查看SQL代码的执行情况。使用ezSQL,可以为我们节省开发时间、简化代码并提高运行效率。
ezSQL的优点就不用多说了,它小巧、快速、简单、易用、并且开源。还有就是安全,你没想到的细节它都为你考虑了。你只需要在你的脚本开头包含相关的PHP文件,然后你就可以使用更好用的一套ezSQL函数来代替标准的PHP数据库操作函数。
下面是ezSQL中一些主要的函数:
$db->get_results — 从数据库中读取数据集。
$db->get_row — 从数据库中读取一行数据。
$db->get_col — 从数据库中读取一列指定的数据集。
$db->get_var — 从数据库的数据集中读取一个值。
$db->query — 执行一条SQL语句。
$db->debug — 打印最后执行的SQL语句及其返回的结果。
$db->vardump — 打印变量的结构及其内容。
$db->select — 选择一个新数据库。
$db->get_col_info — 获取列的信息。
$db->hide_errors — 隐藏错误。
$db->show_errors — 显示错误。
ezSQL的使用方法很简单,首先下载ezSQL源代码,然后将ez_sql_core.php文件和ez_sql_mysql.php文件(这里以mySQL为例)放到与你的脚本文件相同的目录下,然后将下面的代码添加到你的脚本文件的最前面,这样就可以正常使用ezSQL了。
<?php // 包含ezSQL的核心文件 include_once "ez_sql_core.php"; // 包含ezSQL具体的数据库文件,这里以mySQL为例 include_once "ez_sql_mysql.php"; // 初始化数据库对象并建立数据库连接 $db = new ezSQL_mysql('db_user','db_password','db_name','db_host'); ?>
下面是ezSQL中一些主要函数的应用实例,这些代码均来自于ezSQL的官方帮助文档。
实例一:
// Select multiple records from the database and print them out.. $users = $db->get_results("SELECT name, email FROM users"); foreach ( $users as $user ) { // Access data using object syntax echo $user->name; echo $user->email; }
实例二:
// Get one row from the database and print it out.. $user = $db->get_row("SELECT name,email FROM users WHERE id = 2"); echo $user->name; echo $user->email;
实例三:
$var = $db->get_var(“SELECT count(*) FROM users”);echo $var;
// Get one variable from the database and print it out.. $var = $db->get_var("SELECT count(*) FROM users"); echo $var;
实例四:
// Insert into the database $db->query("INSERT INTO users (id, name, email) VALUES (NULL,'justin','jv@foo.com')");
实例五:
// Update the database $db->query("UPDATE users SET name = 'Justin' WHERE id = 2)");
实例六:
// Display last query and all associated results $db->debug();
实例七:
// Display the structure and contents of any result(s) .. or any variable $results = $db->get_results("SELECT name, email FROM users"); $db->vardump($results);
实例八:
// Get 'one column' (based on column index) and print it out.. $names = $db->get_col("SELECT name,email FROM users",0) foreach ( $names as $name ) { echo $name; }
实例九:
// Same as above ‘but quicker’ foreach ( $db->get_col("SELECT name,email FROM users",0) as $name ) { echo $name; }
实例十:
// Map out the full schema of any given database and print it out.. $db->select("my_database"); foreach ( $db->get_col("SHOW TABLES",0) as $table_name ) { $db->debug(); $db->get_results("DESC $table_name"); } $db->debug();
PHP Ctype函数
Ctype函数是PHP内置的字符串体测函数。主要有以下几种
ctype_alnum — Check for alphanumeric character(s)
检测是否是只包含[A-Za-z0-9]
ctype_alpha — Check for alphabetic character(s)
检测是否是只包含[A-Za-z]
ctype_cntrl — Check for control character(s)
检查是否是只包含类是“\n\r\t”之类的字 符控制字符
ctype_digit — Check for numeric character(s)
检查时候是只包含数字字符的字符串(0-9)
ctype_graph — Check for any printable character(s) except space
检查是否是只包含有可以打印出来的字符(除了空格)的字符串
ctype_lower — Check for lowercase character(s)
检查是否所有的字符都是英文字母,并且都是小写的
ctype_print — Check for printable character(s)
检查是否是只包含有可以打印出来的字符的字符串
ctype_punct– Check for any printable character which is not whitespace or an alphanumeric character
检查是否是只包含非数字/字符/空格的可打印出来的字符
ctype_space– Check for whitespace character(s)
检查是否是只包含类是“ ”之类的字符和空格
ctype_upper– Check for uppercase character(s)
检查是否所有的字符都是英文字母,并且都是大写的
ctype_xdigit — Check for character(s) representing a hexadecimal digit
检查是否是16进制的字符串,只能包括 “0123456789abcdef”
用php隐藏图片的真实地址
用php隐藏图片的真实地址
<? $image_path="images/" $image_file=$image_path.$_GET['name']; $sTmpVar = fread(fopen($image_file, 'r'), filesize($image_path)); header("Content-type: image/* "); echo $sTmpVar; ?>
这段代码不光可以隐藏图片,代码后三行不用改,连FLASH真实地址也可以隐藏.
用这个结合其它技术可以防止盗链.
PHP编码规范
一、文件格式
1. 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 “?>” 。这是为了防止多余的空格或者其它字符影响到代码。
例如:
<?php
$foo = ‘foo’;
2. 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。
例如:
if (1 == $x) {
$indented_code = 1;
if (1 == $new_line) {
$more_indented_code = 1;
}
}
3. 变量赋值必须保持相等间距和排列。
例如:
$variable = ‘demo’;
$var = ‘demo2’;
4. 每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
5. 每行结尾不允许有多余的空格。
二、命名约定
1. 类文件都是以“.class.php“为后缀,且类文件名只允许字母,使用驼峰法命名,并且首字母大写,例如:DbMysql.class.php 。
2. 配置和函数等其他类库文件之外的文件一般是分别以“.inc.php“和”.php“为后缀,且文件名命名使用小写字母和下划线的方式,多个单词之间以下 划线分隔,例如config.inc.php , common.php,install_function.php 。
3. 确保文件的命名和调用大小写一致,是由于在类Unix系统上面,对大小写是敏感的。
4. 类名和文件名一致(包括上面说的大小写一致),且类名只允许字母,例如 UserAction类的文件命名是UserAction.class.php, InfoModel类的文件名是InfoModel.class.php 。
5. 控制器类以Action为后缀,例如 UserAction、InfoAction ,模型类以Model为后缀,例如UserModel、InfoModel ,其他类也分别以相应分类为后缀,例如Service 、Widget。
6. 方法名只允许由字母组成,下划线是不允许的,首字母要小写,其后每个单词首字母要大写,即所谓的 “驼峰法命名” 规则,且越详细越好,应该能够描述清楚该方法的功能,例如switchModel、findPage。
7. 属性的命名只允许由字母组成,下划线是不允许的,首字母要小写,其后每个单词首字母要大写,即所谓的 “驼峰法命名” 规则,例如tablePrefix、tableName 。
8. 对于对象成员的访问,我们必须始终使用 “get” 和 “set” 方法。例如:
class Foo
{
protected $_testObj;
public function getTestObj()
{
return $this->_testObj;
}
public function setTestObj($testObj)
{
$this->testObj = $_testObj;
}
}
9. 当类成员方法被声明为 private 时,必须分别以双下划线 “__”为开头;被声明为 protected 时,必须分别以单下划线 “_” 为开头;一般情况下的方法不含下划线。例如 :
class Foo
{
private function __example()
{
// …
}
protected function _example()
{
// …
}
public function example()
{
// …
}
}
10. 如果我们需要把一些经常使用的方法定义为全局函数,那么应该把它们以静态 (static) 的形式定义在类中。例如:
class Think
{
// …
static public function autoload($classname)
{
// …
}
}
11. 被声明为 private的类成员属性必须由双下划线 “__” 作为开头;被声明为 protected 的类成员属性必须由下划线 “_” 作为开头;而声明为 public 的成员属性则在任何时候都不允许含有下划线。
12. 函数的命名使用小写字母和下划线的方式,且越详细越好,应该能够描述清楚该函数的功能,例如 get_client_ip 。
13. 当方法或函数参数不一定需要被赋值的时候,用 “null” 来代替 “false” 作为函数参数的默认值,除非该参数是 boolean 值。
14. 变量只允许由小写字母和下划线组成,且建议用描述性的变量的命名,越详细越好,以至于像 $i 或 $n 等等都是不鼓励使用的。
15. 类中的常量 constant 和全局范围内常量define,只能由大写字母和下划线组成,各个单词之间以下划线分割。
16. boolean 值和 null 值都采用小写。
三、编码风格
1. php 代码必须以完整的形式来定界(<?php … ?>),即不要使用php 短标签(<? … ?>),且保证在关闭标签后不要有任何空格。
2. 当一个字符串是纯文本组成的时候(即不含有变量),则必须总是以单引号(’)作为定界符。例如:
$a = ‘Example String’;
3. 变量替换中的变量只允许用 $+变量名 的形式。例如:
$greeting = “Hello $name, welcome back!”; // 允许
$greeting = “Hello {$name}, welcome back!”; // 允许
$greeting = “Hello ${name}, welcome back!”; // 不允许
当用点号 “.” 连接各字符串的时候,字符串与点号间必须用一个空格隔开,且允许把它分割成多行以增强可读性。在这种情况下,点号 “.” 必须与等于号 “=” 对齐。例如:
$sql = “SELECT `id`, `name` ” . ” FROM `people` “
. “WHERE `name` = ‘Susan’ “
. “ORDER BY `name` ASC “;
当用 array 类型符号来构造数组的时候,必须在每个逗号之后加上一个空格来增强可读性。例如:$sampleArray = array(1, 2, 3, ‘Think’, ‘SNS’);
4. 当使用 array 类型符声明关联数组的时候,我们鼓励把它分成多个行,只是我们必须同时保证每行的键与值的对齐,以保持美观。例如:
$sampleArray = array(
‘firstKey’ => ‘firstValue’,
‘secondKey’ => ‘secondValue’
);
5. 大括号的开始必须在类名的下一行顶格。例如:
class Think
{
// …
}
6. 类中的所有代码都必须用四个空格来进行缩进。
7. 每个 php 文件只允许声明一个类。在类文件里面写其它代码是允许的,但并不鼓励这样做。假如真要附加代码的话,必须用空行来分隔。
8. 任何类变量的声明都必须放在类顶部,先于任何函数的声明。
9. 不允许用 var 符号来声明变量,类成员变量必须以 private,protected 和 public 来声明。其次,把类成员声明为 public 而直接引用虽然是允许的,但通常更好的方法是使用 get 和 set 方法来访问类成员。
10. 方法必须总是用 private,protected 或者 public 来声明其作用域。
11. 静态 static 方法应该声明其作用域,且不应该再被声明为 private 私有,而应该为 protected 或者public ,如果只是不想被子类继承,则应该用 final 声明它们。
12. 函数或方法的初始大括号应该在函数声明的下一行顶格。例如:
function get_client_ip()
{
// …
}
13. 在函数或方法名与参数括号之间不允许出现多余的空格。例如:
function get_client_ip()
{
// …
}
14. 引用只允许定义在函数参数中,实时传递引用是禁止的。例如:
// 引用定义在函数参数-允许的
function defineRefInMethod(&$a)
{
$a = ‘a’;
}
defineRefInMethod($b);
echo $b; // ‘a’
// 实时传递引用-禁止的
function callTimePassRef($a)
{
$a = ‘a’;
}
callTimePassRef(&$c);
echo $c; // ‘a’
15. 函数或方法返回值不可以用括号包住,不然会降低可读性,而且假如以后函数修改为返回引用的话,这将会抛出一个异常。
16. 鼓励尽量使用类型提示,特别是在模块设计中。例如:
class Foo
{
public function foo(SomeInterface $object)
{
}
public function bar(array $options)
{
}
}
17. 函数和方法参数必须用逗号+空格来分隔。
18. 对于参数为数组的函数,参数中的数组应该分成多行以增强可读性。例如:
threeArguments(array(1, 2, 3), 2, 3);
threeArguments(array(1, 2, 3, ‘Think’,
‘SNS’, $a, $b, $c,
56.44, $d, 500), 2, 3);
19. 基于”if”, “else”和”else if”的条件控制里,我们必须用空格间隔开语句和括号,大括号的开始 “{” 必须与条件控制语句位于同一行,结束 “}” 必须总是独占一行且顶格,控制流程内容必须用四个空格进行缩进,且不使用”elseif”。
if ($condition) {
// …
} else if ($_condition) {
// …
} else {
// …
}
20. 在条件控制语句的条件括号内,必须用空格将操作符与其它元素隔开。如果遇到很长的逻辑判断,则鼓励用内嵌括号来分割各个逻辑。例如:
if (($a != 2) and ($b == 1)) {
$a = $b;
}
21. “switch” 条件控制语句中,必须用空格将待测参数与其它元素分隔开。例如:
switch ($num) {
// …
}
22. “switch” 语句的内容必须以四个空格缩进,”case” 条件控制的内容必须再加四个空格进行缩进。例如:
switch ($indentedSpaces) {
case 2:
echo “错误”;
break;
case 4:
echo “正确”;
break;
default:
break;
}
23. 在 “switch” 语句中应该总是包括 “default” 控制。
24. 有时候我们需要在 “case” 语境中省略掉 “break” 或 “return” ,这个时候我们必须为这些 “case” 语句加上 “// 此处无break” 注释。例如:
switch ($numPeople) {
case 1: // 此处无break
case 2:
break;
default:
break;
}
在旧的项目中会在php 5.3以后碰到的问题
写正则的时候可能会碰到用ereg()时出现错误,如:Deprecated: Function eregi() is deprecated ××××××××,原因就是php5.3已经不支持ereg(),可以用preg_match() i 参数替代,比如:ereg(“^[[:alnum:]]+$”, $pass); ——> preg_match(“/^[[:alnum:]]+$/i”, $pass);
以下是详细说明:
php 5.3 从一方面来讲,可以说在07年计划PHP6的中的一个pre版本,增加了很多功能,统一了很多语法,使PHP变得更加强大与简洁。
说到统计架构规划,PHP当然会对一些别名,重复功能function进行归类整理,并把一些不用的正式在php 5.3以后删除掉.故不建议在新项目继续使用.
PHP 5.3 有两个deprecated,
E_DEPRECATED and E_USER_DEPRECATED
以下是在旧的项目中会在php 5.3以后碰到的问题
* define_syslog_variables
* register_globals
* register_long_arrays
* safe_mode
* magic_quotes_gpc
* magic_quotes_runtime
* magic_quotes_sybase
* 在PHP.ini 注释用#已经不再建议使用.
Deprecated functions:
* call_user_method() 可以用 call_user_func() 替代
* call_user_method_array() 可以用 call_user_func_array() 替代define_syslog_variables()
* dl() 反对在使用DL加载扩展,php5.3 以后应用php.ini配制
* ereg() 可以用 preg_match() 替代
* ereg_replace() 可以用 preg_replace() 替代
* eregi() 用 preg_match() i 参数替代
* eregi_replace() 用 preg_replace() i 参数替代
* set_magic_quotes_runtime() 用 magic_quotes_runtime() 替代
* session_register() session_unregister() session_is_registered()
* 以上三个统一用 $_SESSION 替代
* set_socket_blocking() 用 stream_set_blocking() 替代
* split() 用 preg_split() 替代
* spliti() 用 preg_split() 模式 ‘i’ 替代
* sql_regcase()
* mysql_db_query() 用 mysql_select_db() mysql_query() 替代mysql_escape_string() 用 use mysql_real_escape_string() 替代
* 关于时区处理,统一用Timezone对像
Deprecated features:
* 直接返加new 实例不再建议使用. PHP 6 将不再支持
* Call-time pass-by-reference 参数现在不再建议使用 PHP 6 将不再支持
* 用 {} 访问字符串顺序不再建议使用. 统一用 [] 代替. PHP 6 将不再支持
当然如果项目紧急,又要在php 5.3 使用以上方法,可以用下面的方法去做
在php.ini 增加
vim /etc/php.ini
php_flag allow_call_time_pass_reference On
php_value error_reporting “E_ALL & ~E_NOTICE & ~E_DEPRECATED”
完整的PHP MYSQL数据库类
完整的PHP MYSQL数据库类 很多代码 值得参考
<?php class mysql { private $db_host; //数据库主机 private $db_user; //数据库用户名 private $db_pwd; //数据库用户名密码 private $db_database; //数据库名 private $conn; //数据库连接标识; private $result; //执行query命令的结果资源标识 private $sql; //sql执行语句 private $row; //返回的条目数 private $coding; //数据库编码,GBK,UTF8,gb2312 private $bulletin = true; //是否开启错误记录 private $show_error = false; //测试阶段,显示所有错误,具有安全隐患,默认关闭 private $is_error = false; //发现错误是否立即终止,默认true,建议不启用,因为当有问题时用户什么也看不到是很苦恼的 /*构造函数*/ public function __construct($db_host, $db_user, $db_pwd, $db_database, $conn, $coding) { $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pwd = $db_pwd; $this->db_database = $db_database; $this->conn = $conn; $this->coding = $coding; $this->connect(); } /*数据库连接*/ public function connect() { if ($this->conn == "pconn") { //永久链接 $this->conn = mysql_pconnect($this->db_host, $this->db_user, $this->db_pwd); } else { //即使链接 $this->conn = mysql_connect($this->db_host, $this->db_user, $this->db_pwd); } if (!mysql_select_db($this->db_database, $this->conn)) { if ($this->show_error) { $this->show_error("数据库不可用:", $this->db_database); } } mysql_query("SET NAMES $this->coding"); } /*数据库执行语句,可执行查询添加修改删除等任何sql语句*/ public function query($sql) { if ($sql == "") { $this->show_error("SQL语句错误:", "SQL查询语句为空"); } $this->sql = $sql; $result = mysql_query($this->sql, $this->conn); if (!$result) { //调试中使用,sql语句出错时会自动打印出来 if ($this->show_error) { $this->show_error("错误SQL语句:", $this->sql); } } else { $this->result = $result; } return $this->result; } /*创建添加新的数据库*/ public function create_database($database_name) { $database = $database_name; $sqlDatabase = 'create database ' . $database; $this->query($sqlDatabase); } /*查询服务器所有数据库*/ //将系统数据库与用户数据库分开,更直观的显示? public function show_databases() { $this->query("show databases"); echo "现有数据库:" . $amount = $this->db_num_rows($rs); echo "<br />"; $i = 1; while ($row = $this->fetch_array($rs)) { echo "$i $row[Database]"; echo "<br />"; $i++; } } //以数组形式返回主机中所有数据库名 public function databases() { $rsPtr = mysql_list_dbs($this->conn); $i = 0; $cnt = mysql_num_rows($rsPtr); while ($i < $cnt) { $rs[] = mysql_db_name($rsPtr, $i); $i++; } return $rs; } /*查询数据库下所有的表*/ public function show_tables($database_name) { $this->query("show tables"); echo "现有数据库:" . $amount = $this->db_num_rows($rs); echo "<br />"; $i = 1; while ($row = $this->fetch_array($rs)) { $columnName = "Tables_in_" . $database_name; echo "$i $row[$columnName]"; echo "<br />"; $i++; } } /* mysql_fetch_row() array $row[0],$row[1],$row[2] mysql_fetch_array() array $row[0] 或 $row[id] mysql_fetch_assoc() array 用$row->content 字段大小写敏感 mysql_fetch_object() object 用$row[id],$row[content] 字段大小写敏感 */ /*取得结果数据*/ public function mysql_result_li() { return mysql_result($str); } /*取得记录集,获取数组-索引和关联,使用$row['content'] */ public function fetch_array($resultt="") { if($resultt<>""){ return mysql_fetch_array($resultt); }else{ return mysql_fetch_array($this->result); } } //获取关联数组,使用$row['字段名'] public function fetch_assoc() { return mysql_fetch_assoc($this->result); } //获取数字索引数组,使用$row[0],$row[1],$row[2] public function fetch_row() { return mysql_fetch_row($this->result); } //获取对象数组,使用$row->content public function fetch_Object() { return mysql_fetch_object($this->result); } //简化查询select public function findall($table) { $this->query("SELECT * FROM $table"); } //简化查询select public function select($table, $columnName = "*", $condition = '', $debug = '') { $condition = $condition ? ' Where ' . $condition : NULL; if ($debug) { echo "SELECT $columnName FROM $table $condition"; } else { $this->query("SELECT $columnName FROM $table $condition"); } } //简化删除del public function delete($table, $condition, $url = '') { if ($this->query("DELETE FROM $table WHERE $condition")) { if (!empty ($url)) $this->Get_admin_msg($url, '删除成功!'); } } //简化插入insert public function insert($table, $columnName, $value, $url = '') { if ($this->query("INSERT INTO $table ($columnName) VALUES ($value)")) { if (!empty ($url)) $this->Get_admin_msg($url, '添加成功!'); } } //简化修改update public function update($table, $mod_content, $condition, $url = '') { //echo "UPDATE $table SET $mod_content WHERE $condition"; exit(); if ($this->query("UPDATE $table SET $mod_content WHERE $condition")) { if (!empty ($url)) $this->Get_admin_msg($url); } } /*取得上一步 INSERT 操作产生的 ID*/ public function insert_id() { return mysql_insert_id(); } //指向确定的一条数据记录 public function db_data_seek($id) { if ($id > 0) { $id = $id -1; } if (!@ mysql_data_seek($this->result, $id)) { $this->show_error("SQL语句有误:", "指定的数据为空"); } return $this->result; } // 根据select查询结果计算结果集条数 public function db_num_rows() { if ($this->result == null) { if ($this->show_error) { $this->show_error("SQL语句错误", "暂时为空,没有任何内容!"); } } else { return mysql_num_rows($this->result); } } // 根据insert,update,delete执行结果取得影响行数 public function db_affected_rows() { return mysql_affected_rows(); } //输出显示sql语句 public function show_error($message = "", $sql = "") { if (!$sql) { echo "<font color='red'>" . $message . "</font>"; echo "<br />"; } else { echo "<fieldset>"; echo "<legend>错误信息提示:</legend><br />"; echo "<div style='font-size:14px; clear:both; font-family:Verdana, Arial, Helvetica, sans-serif;'>"; echo "<div style='height:20px; background:#000000; border:1px #000000 solid'>"; echo "<font color='white'>错误号:12142</font>"; echo "</div><br />"; echo "错误原因:" . mysql_error() . "<br /><br />"; echo "<div style='height:20px; background:#FF0000; border:1px #FF0000 solid'>"; echo "<font color='white'>" . $message . "</font>"; echo "</div>"; echo "<font color='red'><pre>" . $sql . "</pre></font>"; $ip = $this->getip(); if ($this->bulletin) { $time = date("Y-m-d H:i:s"); $message = $message . "\r\n$this->sql" . "\r\n客户IP:$ip" . "\r\n时间 :$time" . "\r\n\r\n"; $server_date = date("Y-m-d"); $filename = $server_date . ".txt"; $file_path = "error/" . $filename; $error_content = $message; //$error_content="错误的数据库,不可以链接"; $file = "error"; //设置文件保存目录 //建立文件夹 if (!file_exists($file)) { if (!mkdir($file, 0777)) { //默认的 mode 是 0777,意味着最大可能的访问权 die("upload files directory does not exist and creation failed"); } } //建立txt日期文件 if (!file_exists($file_path)) { //echo "建立日期文件"; fopen($file_path, "w+"); //首先要确定文件存在并且可写 if (is_writable($file_path)) { //使用添加模式打开$filename,文件指针将会在文件的开头 if (!$handle = fopen($file_path, 'a')) { echo "不能打开文件 $filename"; exit; } //将$somecontent写入到我们打开的文件中。 if (!fwrite($handle, $error_content)) { echo "不能写入到文件 $filename"; exit; } //echo "文件 $filename 写入成功"; echo "——错误记录被保存!"; //关闭文件 fclose($handle); } else { echo "文件 $filename 不可写"; } } else { //首先要确定文件存在并且可写 if (is_writable($file_path)) { //使用添加模式打开$filename,文件指针将会在文件的开头 if (!$handle = fopen($file_path, 'a')) { echo "不能打开文件 $filename"; exit; } //将$somecontent写入到我们打开的文件中。 if (!fwrite($handle, $error_content)) { echo "不能写入到文件 $filename"; exit; } //echo "文件 $filename 写入成功"; echo "——错误记录被保存!"; //关闭文件 fclose($handle); } else { echo "文件 $filename 不可写"; } } } echo "<br />"; if ($this->is_error) { exit; } } echo "</div>"; echo "</fieldset>"; echo "<br />"; } //释放结果集 public function free() { @ mysql_free_result($this->result); } //数据库选择 public function select_db($db_database) { return mysql_select_db($db_database); } //查询字段数量 public function num_fields($table_name) { //return mysql_num_fields($this->result); $this->query("select * from $table_name"); echo "<br />"; echo "字段数:" . $total = mysql_num_fields($this->result); echo "<pre>"; for ($i = 0; $i < $total; $i++) { print_r(mysql_fetch_field($this->result, $i)); } echo "</pre>"; echo "<br />"; } //取得 MySQL 服务器信息 public function mysql_server($num = '') { switch ($num) { case 1 : return mysql_get_server_info(); //MySQL 服务器信息 break; case 2 : return mysql_get_host_info(); //取得 MySQL 主机信息 break; case 3 : return mysql_get_client_info(); //取得 MySQL 客户端信息 break; case 4 : return mysql_get_proto_info(); //取得 MySQL 协议信息 break; default : return mysql_get_client_info(); //默认取得mysql版本信息 } } //析构函数,自动关闭数据库,垃圾回收机制 public function __destruct() { if (!empty ($this->result)) { $this->free(); } mysql_close($this->conn); } //function __destruct(); /*获得客户端真实的IP地址*/ function getip() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) { $ip = getenv("HTTP_CLIENT_IP"); } else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) { $ip = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) { $ip = getenv("REMOTE_ADDR"); } else if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) { $ip = $_SERVER['REMOTE_ADDR']; } else { $ip = "unknown"; } return ($ip); } function inject_check($sql_str) { //防止注入 $check = eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); if ($check) { echo "输入非法注入内容!"; exit (); } else { return $sql_str; } } function checkurl() { //检查来路 if (preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) !== preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])) { header("Location: http://www.dareng.com"); exit(); } } } ?>
比较好用的PHP防注入漏洞过滤函数代码
比较好用的PHP防注入漏洞过滤函数代码
PHP整站防注入程序,需要在公共文件中require_once本文件,因为现在网站被注入攻击现象很严重,所以推荐大家使用。
<?php //PHP整站防注入程序,需要在公共文件中require_once本文件 //判断magic_quotes_gpc状态 if (@get_magic_quotes_gpc()) { $_GET = sec($_GET); $_POST = sec($_POST); $_COOKIE = sec($_COOKIE); $_FILES = sec($_FILES); } $_SERVER = sec($_SERVER); function sec(&$array) { //如果是数组,遍历数组,递归调用 if (is_array($array)) { foreach ($array as $k => $v) { $array[$k] = sec($v); } } else { if (is_string($array)) { //使用addslashes函数来处理 $array = addslashes($array); } else { if (is_numeric($array)) { $array = intval($array); } } } return $array; } //整型过滤函数 function num_check($id) { if (!$id) { die('参数不能为空!'); } else { if (inject_check($id)) { die('非法参数'); } else { if (!is_numetic($id)) { die('非法参数'); } } } //数字判断 $id = intval($id); //整型化 return $id; } //字符过滤函数 function str_check($str) { if (inject_check($str)) { die('非法参数'); } //注入判断 $str = htmlspecialchars($str); //转换html return $str; } function search_check($str) { $str = str_replace('_', '\\_', $str); //把"_"过滤掉 $str = str_replace('%', '\\%', $str); //把"%"过滤掉 $str = htmlspecialchars($str); //转换html return $str; } //表单过滤函数 function post_check($str, $min, $max) { if (isset($min) && strlen($str) < $min) { die('最少$min字节'); } else { if (isset($max) && strlen($str) > $max) { die('最多$max字节'); } } return stripslashes_array($str); } //防注入函数 function inject_check($sql_str) { return eregi('select|inert|update|delete|\'|\\/\\*|\\*|\\.\\.\\/|\\.\\/|UNION|into|load_file|outfile', $sql_str); } function stripslashes_array(&$array) { if (is_array($array)) { foreach ($array as $k => $v) { $array[$k] = stripslashes_array($v); } } else { if (is_string($array)) { $array = stripslashes($array); } } return $array; } ?>
防止sql注入的三种方法
(1)mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
‘
“
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
使用方法如下:
$username = 'john'; $pw = "' OR ''='"; $sql = "select count(*) as dd from admin where username ='".mysql_real_escape_string($username)."' and password='". mysql_real_escape_string($pw)."' limit 1";
使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。
(2) 打开magic_quotes_gpc来防止SQL注入
php.ini中有一个设置:magic_quotes_gpc = Off
这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,
比如把 ‘ 转为 \’等,对于防止sql注射有重大作用。
如果magic_quotes_gpc=Off,则使用addslashes()函数
(3)自定义函数
//检测 SQL 语法特殊字符 function inject_check($sql_str) { return eregi('select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); } //检测 id 合法性 function verify_id($id=null) { if(!$id) { exit('没有提交参数!'); } elseif(inject_check($id)) { exit('提交的参数非法!'); } elseif(!is_numeric($id)) { exit('提交的参数非法!'); } $id = intval($id); return $id; } //字符串 过滤 function str_check( $str ) { if(!get_magic_quotes_gpc()) { $str = addslashes($str); // 进行过滤 } $str = str_replace("_", "\_", $str); $str = str_replace("%", "\%", $str); return $str; } //post数据 过滤 function post_check($post) { if(!get_magic_quotes_gpc()) { $post = addslashes($post); } $post = str_replace("_", "\_", $post); //SQL中 _ 代表一个通配符 一个字符 $post = str_replace("%", "\%", $post); //SQL中 % 代表通配符 任意个字符 $post = nl2br($post); //在字符串中的新行(\n)之前插入换行符: $post = htmlspecialchars($post); //把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体: return $post; }
php发邮件类smtp
php发邮件类smtp代码:
<?php class smtp { /* Public Variables */ var $smtp_port; var $time_out; var $host_name; var $log_file; var $relay_host; var $debug; var $auth; var $user; var $pass; /* Private Variables */ var $sock; /* Constractor */ function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) { $this->debug = FALSE; $this->smtp_port = $smtp_port; $this->relay_host = $relay_host; $this->time_out = 30; //is used in fsockopen() // $this->auth = $auth; //auth $this->user = $user; $this->pass = $pass; // $this->host_name = "localhost"; //is used in HELO command $this->log_file = ""; $this->sock = FALSE; } /* Main Function */ function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") { $mail_from = $this->get_address($this->strip_comment($from)); $body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body); $header = "MIME-Version:1.0\r\n"; if ($mailtype == "HTML") { $header.= "Content-Type:text/html\r\n"; } $header.= "To: " . $to . "\r\n"; if ($cc != "") { $header.= "Cc: " . $cc . "\r\n"; } $header.= "From: $from<" . $from . ">\r\n"; $header.= "Subject: " . $subject . "\r\n"; $header.= $additional_headers; $header.= "Date: " . date("r") . "\r\n"; $header.= "X-Mailer:By Redhat (PHP/" . phpversion() . ")\r\n"; list($msec, $sec) = explode(" ", microtime()); $header.= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">\r\n"; $TO = explode(",", $this->strip_comment($to)); if ($cc != "") { $TO = array_merge($TO, explode(",", $this->strip_comment($cc))); } if ($bcc != "") { $TO = array_merge($TO, explode(",", $this->strip_comment($bcc))); } $sent = TRUE; foreach ($TO as $rcpt_to) { $rcpt_to = $this->get_address($rcpt_to); if (!$this->smtp_sockopen($rcpt_to)) { $this->log_write("Error: Cannot send email to " . $rcpt_to . "\n"); $sent = FALSE; continue; } if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) { $this->log_write("E-mail has been sent to <" . $rcpt_to . ">\n"); } else { $this->log_write("Error: Cannot send email to <" . $rcpt_to . ">\n"); $sent = FALSE; } fclose($this->sock); $this->log_write("Disconnected from remote host\n"); } return $sent; } /* Private Functions */ function smtp_send($helo, $from, $to, $header, $body = "") { if (!$this->smtp_putcmd("HELO", $helo)) { return $this->smtp_error("sending HELO command"); } //auth if ($this->auth) { if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) { return $this->smtp_error("sending HELO command"); } if (!$this->smtp_putcmd("", base64_encode($this->pass))) { return $this->smtp_error("sending HELO command"); } } // if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) { return $this->smtp_error("sending MAIL FROM command"); } if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) { return $this->smtp_error("sending RCPT TO command"); } if (!$this->smtp_putcmd("DATA")) { return $this->smtp_error("sending DATA command"); } if (!$this->smtp_message($header, $body)) { return $this->smtp_error("sending message"); } if (!$this->smtp_eom()) { return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]"); } if (!$this->smtp_putcmd("QUIT")) { return $this->smtp_error("sending QUIT command"); } return TRUE; } function smtp_sockopen($address) { if ($this->relay_host == "") { return $this->smtp_sockopen_mx($address); } else { return $this->smtp_sockopen_relay(); } } function smtp_sockopen_relay() { $this->log_write("Trying to " . $this->relay_host . ":" . $this->smtp_port . "\n"); $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out); if (!($this->sock && $this->smtp_ok())) { $this->log_write("Error: Cannot connenct to relay host " . $this->relay_host . "\n"); $this->log_write("Error: " . $errstr . " (" . $errno . ")\n"); return FALSE; } $this->log_write("Connected to relay host " . $this->relay_host . "\n"); return TRUE;; } function smtp_sockopen_mx($address) { $domain = preg_replace("/^.+@([^@]+)$/", "\1", $address); if (!@getmxrr($domain, $MXHOSTS)) { $this->log_write("Error: Cannot resolve MX \"" . $domain . "\"\n"); return FALSE; } //专注与php学习 http://www.daixiaorui.com 欢迎您的访问 foreach ($MXHOSTS as $host) { $this->log_write("Trying to " . $host . ":" . $this->smtp_port . "\n"); $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out); if (!($this->sock && $this->smtp_ok())) { $this->log_write("Warning: Cannot connect to mx host " . $host . "\n"); $this->log_write("Error: " . $errstr . " (" . $errno . ")\n"); continue; } $this->log_write("Connected to mx host " . $host . "\n"); return TRUE; } $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")\n"); return FALSE; } function smtp_message($header, $body) { fputs($this->sock, $header . "\r\n" . $body); $this->smtp_debug("> " . str_replace("\r\n", "\n" . "> ", $header . "\n> " . $body . "\n> ")); return TRUE; } function smtp_eom() { fputs($this->sock, "\r\n.\r\n"); $this->smtp_debug(". [EOM]\n"); return $this->smtp_ok(); } function smtp_ok() { $response = str_replace("\r\n", "", fgets($this->sock, 512)); $this->smtp_debug($response . "\n"); if (!preg_match("/^[23]/", $response)) { fputs($this->sock, "QUIT\r\n"); fgets($this->sock, 512); $this->log_write("Error: Remote host returned \"" . $response . "\"\n"); return FALSE; } return TRUE; } function smtp_putcmd($cmd, $arg = "") { if ($arg != "") { if ($cmd == "") $cmd = $arg; else $cmd = $cmd . " " . $arg; } fputs($this->sock, $cmd . "\r\n"); $this->smtp_debug("> " . $cmd . "\n"); return $this->smtp_ok(); } function smtp_error($string) { $this->log_write("Error: Error occurred while " . $string . ".\n"); return FALSE; } function log_write($message) { $this->smtp_debug($message); if ($this->log_file == "") { return TRUE; } $message = date("M d H:i:s ") . get_current_user() . "[" . getmypid() . "]: " . $message; if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) { $this->smtp_debug("Warning: Cannot open log file \"" . $this->log_file . "\"\n"); return FALSE;; } flock($fp, LOCK_EX); fputs($fp, $message); fclose($fp); return TRUE; } function strip_comment($address) { $comment = "/\([^()]*\)/"; while (preg_match($comment, $address)) { $address = preg_replace($comment, "", $address); } return $address; } function get_address($address) { $address = preg_replace("/([ \t\r\n])+/", "", $address); $address = preg_replace("/^.*<(.+)>.*$/", "\1", $address); return $address; } function smtp_debug($message) { if ($this->debug) { echo $message; } } } /*----end---*/
调用:
include_once "Inc/smtp.class.php"; //******************** 配置信息 ******************************** $smtpserver = "smtp.qq.com";//SMTP服务器 $smtpserverport =25;//SMTP服务器端口 $smtpusermail = "718222265@qq.com";//SMTP服务器的用户邮箱 $smtpuser = "718222265";//SMTP服务器的用户帐号 $smtppass = "****";//SMTP服务器的用户密码 $smtpemailto = '378398666@qq.com';//发送给谁 $mailtitle = "邮件主题";//邮件主题 $mailcontent = "邮件内容";//邮件内容 $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件 //************************ 配置信息 **************************** $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证. $smtp->debug = false;//是否显示发送的调试信息 $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
php利用smtp类 发送电子邮件
PHP发送邮件通常有两个方法。
1.用php内置函数mail()发送邮件,不过通常都不好用。
2.用smtp类来发送邮件,非常好用。支持163,126,qq常用邮箱。博主亲自测试通过。
本文主要介绍一下 用 smtp类发送邮件的方法。
smtp类发送邮件的方法其实很简单,也很稳定,类是别人已经写好的了,你只需要调用就行了。几行简单的配置就能发邮件。
以下就是核心代码:
<?php
require_once "smtp.class.php";//引用smtp类
//******************** 配置信息 ********************************
$smtpserver = "smtp.163.com";//SMTP服务器
$smtpserverport =25;//SMTP服务器端口
$smtpusermail = "XXXX@163.com";//SMTP服务器的用户邮箱
$smtpemailto = $_POST['toemail'];//发送给谁
$smtpuser = "XXXX";//SMTP服务器的用户帐号
$smtppass = "您的邮箱密码";//SMTP服务器的用户密码
$mailtitle = $_POST['title'];//邮件主题
$mailcontent = "<h1>".$_POST['content']."<a href="http://www.lrxin.com/archives-886.html">php利用smtp类 发送电子邮件</a></h1>";//邮件内容
$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件
//************************ 配置信息 ****************************
$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp->debug = false;//是否显示发送的调试信息
$state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);
echo "<div style='width:300px; margin:36px auto;'>";
if($state==""){
echo "对不起,邮件发送失败!请检查邮箱填写是否有误。";
echo "<a href='index.html'>点此返回</a>";
exit();
}
echo "恭喜!邮件发送成功!!";
echo "<a href='index.html'>点此返回</a>";
echo "</div>";
?>
完整范例下载:phpmail_smtp.zip
百度网盘:http://pan.baidu.com/s/1ntnfySp
jquery 倒计时
倒计时在WEB上应用非常广泛,如考试系统倒计时,团购网站中的优惠活动倒计时等等。今天,我们来使用jQuery实现一个简单的倒计时功能。
html代码:
<div class="box3 " data-endtime="<?php echo strtotime('2015-12-1');?>" ></div> <div class="box3 " data-endtime="1448928000"></div>
js代码
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript"> var serverTime = <?php echo time();?> * 1000; $(function(){ var dateTime = new Date(); var difference = dateTime.getTime() - serverTime; setInterval(function(){ $("[data-endtime]").each(function(){ var obj = $(this); var endTime = new Date(parseInt(obj.data('endtime')) * 1000); var nowTime = new Date(); var nMS=endTime.getTime() - nowTime.getTime() + difference; var myD=Math.floor(nMS/(1000 * 60 * 60 * 24)); var myH=Math.floor(nMS/(1000*60*60)) % 24; var myM=Math.floor(nMS/(1000*60)) % 60; var myS=Math.floor(nMS/1000) % 60; var myMS=Math.floor(nMS/100) % 10; if(myD>= 0){ var str = "开班倒计时:"+myD+"天"+myH+"小时"+myM+"分"+myS+"."+myMS+"秒"; }else{ var str = "已结束!"; } obj.html(str); }); }, 100); }); </script>
isajax() php判断是否是ajax请求
isajax() php判断是否是ajax请求
function isAjax () { if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == "XMLHttpRequest") return true; return false; }
php处理时间格式:几秒前,几分钟前,几小时前,几天前,几个月前,几年后 ,或者 几秒后,几分钟后,几小时后,几天后,几个月后,几年后
在网页应用中,经常会遇到时间显示为:几秒前,几分钟前,几小时前,几天前,几个月前,几年后 ,或者 几秒后,几分钟后,几小时后,几天后,几个月后,几年后。像这样的应用,除了在我们自己的博客会遇到外,更多的类似于QQ空间社交类的站点应用就更广了。。
在QQ空间中,经常看到某某好友几分钟或几秒钟发表了某篇说说,或上传了某个图片之类的,还有在新流微博中,对于时间的计算也非常的精细,类如某个明星几秒钟之前发表了一篇微博,总之,时间的计算在SNS的社交网络中显得非常重要,毕竟SNS社交网络重视的是新闻的即时性,快速性。
那么使用PHP怎样来计算时间呢,其实原理也是很简单的,通俗的来讲就是将“现在的时间”减去“发表新闻的时间”就等于“距离的时间”,这个说得不是哪么准确,但为了能够理解吧,也就是时间的加减法,这里写了一个PHP的时间计算函数,看如下函数代码:
<?php header("Content-type:text/html;charset=utf-8"); function format_date($time){ $t=time()-strtotime($time); if($t>0){$ba = '前';}else{$ba = '后';} /* echo date("Y-m-d H:i:s",time()); echo '<hr/>'; echo date("Y-m-d H:i:s",strtotime($time)); echo '<hr/>'; echo date("Y-m-d H:i:s",$t); echo '<hr/>'; echo $t; echo '<hr/>'; */ $f=array( '31536000'=>'年', '2592000'=>'个月', '604800'=>'星期', '86400'=>'天', '3600'=>'小时', '60'=>'分钟', '1'=>'秒' ); foreach ($f as $k=>$v) { if (0 !=$c=floor(abs($t)/(int)$k)) { return $c.$v.$ba; } } } echo format_date(date("Y-m-d H:i:s",time()-50)); ?>
程序的算法:
1. 把时间格式文本,转化为秒数 减去 当前时间,得到时间差 $t(秒数);
2. 判断时间差 是正数 还是 负数,如果是正数就是xxx前(1秒前),如果是负数 就是xxx后(1秒后);
3.是时间差$t 的绝对值 去分别除以 年,月,星期,天,时,分,秒 的秒数,去正数部分。直到不等于0 结束。就得到了 对应的 时间 和 时间单位。
4.在 拼接之前得到的(前/后)返回值 就可以了。
PHP采集类(Snoopy.class.php)让你事半功倍(附Snoopy.class.php下载及使用教程)
首先来介绍Snoopy.class.php类的功能,它是用来模拟浏览器的功能,可以获取网页内容,网页链接,发送表单,可以用来快速开发一些采集程序和小偷程序。
案例一:获取网页内容,纯文本内容,网页链接,网页表单
<?php include("snoopy.class.php"); $url = "http://pr.phpddt.com"; $snoopy = new Snoopy; //获取网页所有内容 $snoopy->fetch($url); //获取网页纯文本内容 $snoopy->fetchtext($url); //获取网页所有链接 $snoopy->fetchlinks ($url); //获取网页表单 $snoopy->fetchform($url); //打印查看 print_r($snoopy->results);
案例二:模拟登录,简单的令人咋舌啊。。。
<?php /** * 这里模拟登录我的博客 * * @link http://www.phpddt.com */ include("snoopy.class.php"); $snoopy = new Snoopy; $submit_url = "http://blog.phpddt.com/admin/login"; $submit_vars['name'] = "密码"; $submit_vars['password'] = "你不不会知道的"; $snoopy->submit($submit_url, $submit_vars); //登录后的结果 print $snoopy->results;
提供Snoopy.class.php最新版下载:Snoopy-1.2.4.zip
官方下载地址:http://sourceforge.net/projects/snoopy/
php栏目类,php分类类,php树类,tree.class.php
php栏目类,php分类类,php树类,tree.class.php
支持:1
* 得到父级数组
* 得到子级数组
* 得到当前位置数组
* 得到树型结构 4 种形式
文件:tree.class.php
<?php /** * 通用的树型类,可以生成任何树型结构 */ class tree { /** * 生成树型结构所需要的2维数组 * @var array */ public $arr = array(); /** * 生成树型结构所需修饰符号,可以换成图片 * @var array */ public $icon = array('│','├','└'); public $nbsp = " "; public $id = 'tid';//分类id public $pid = 'pid';//父id /** * @access private */ public $ret = ''; /** * 构造函数,初始化类 * @param array 2维数组,例如: * array( * 1 => array('tid'=>'1','pid'=>0,'name'=>'一级栏目一'), * 2 => array('tid'=>'2','pid'=>0,'name'=>'一级栏目二'), * 3 => array('tid'=>'3','pid'=>1,'name'=>'二级栏目一'), * 4 => array('tid'=>'4','pid'=>1,'name'=>'二级栏目二'), * 5 => array('tid'=>'5','pid'=>2,'name'=>'二级栏目三'), * 6 => array('tid'=>'6','pid'=>3,'name'=>'三级栏目一'), * 7 => array('tid'=>'7','pid'=>3,'name'=>'三级栏目二') * ) */ public function init($arr=array()){ $this->arr = $arr; $this->ret = ''; return is_array($arr); } public function setid($id){ $this->id = $id; } public function setpid($id){ $this->pid = $pid; } /** * 得到父级数组 * @param int * @return array */ public function get_parent($myid){ $newarr = array(); if(!isset($this->arr[$myid])) return false; $pid = $this->arr[$myid][$this->pid]; $pid = $this->arr[$pid][$this->pid]; if(is_array($this->arr)){ foreach($this->arr as $id => $a){ if($a[$this->pid] == $pid) $newarr[$id] = $a; } } return $newarr; } /** * 得到子级数组 * @param int * @return array */ public function get_child($myid){ $a = $newarr = array(); if(is_array($this->arr)){ foreach($this->arr as $id => $a){ if($a[$this->pid] == $myid) $newarr[$id] = $a; } } return $newarr ? $newarr : false; } /** * 得到当前位置数组 * @param int * @return array */ public function get_pos($myid,&$newarr = array()){ $a = array(); if(!isset($this->arr[$myid])) return false; $newarr[] = $this->arr[$myid]; $pid = $this->arr[$myid][$this->pid]; if(isset($this->arr[$pid])){ $this->get_pos($pid,$newarr); } if(is_array($newarr)){ krsort($newarr); foreach($newarr as $v){ $a[$v[$this->id]] = $v; } } return $a; } /** * 得到树型结构 * @param int ID,表示获得这个ID下的所有子级 * @param string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>" * @param int 被选中的ID,比如在做树型下拉框的时候需要用到 * @return string */ public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = ''){ $number=1; $child = $this->get_child($myid); if(is_array($child)){ $total = count($child); foreach($child as $id=>$value){ $j=$k=''; if($number==$total){ $j .= $this->icon[2]; }else{ $j .= $this->icon[1]; $k = $adds ? $this->icon[0] : ''; } $spacer = $adds ? $adds.$j : ''; $selected = $id==$sid ? 'selected' : ''; #print_r($value);echo '<hr/>'; @extract($value); $value[$this->pid] == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";"); $this->ret .= $nstr; $nbsp = $this->nbsp; $this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group); $number++; } } return $this->ret; } /** * 同上一方法类似,但允许多选 * $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式 * $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 * $options = $tree->get_tree_multi(0,$str, $select_id = '1,2,3'); */ public function get_tree_multi($myid, $str, $sid = 0, $adds = ''){ $number=1; $child = $this->get_child($myid); if(is_array($child)){ $total = count($child); foreach($child as $id=>$a){ $j=$k=''; if($number==$total){ $j .= $this->icon[2]; }else{ $j .= $this->icon[1]; $k = $adds ? $this->icon[0] : ''; } $spacer = $adds ? $adds.$j : ''; $selected = $this->have($sid,$id) ? 'selected' : ''; @extract($a); eval("\$nstr = \"$str\";"); $this->ret .= $nstr; $this->get_tree_multi($id, $str, $sid, $adds.$k.' '); $number++; } } return $this->ret; } /** * @param integer $myid 要查询的ID * @param string $str 第一种HTML代码方式 * @param string $str2 第二种HTML代码方式 * @param integer $sid 默认选中 * @param integer $adds 前缀 */ public function get_tree_category($myid=0 , $str="<div class=''>\$name</div>", $str2="<div class='selected'>\$name</div>", $sid = 0, $adds = ''){ $number=1; $child = $this->get_child($myid); if(is_array($child)){ $total = count($child); foreach($child as $id=>$a){ $j=$k=''; if($number==$total){ $j .= $this->icon[2]; }else{ $j .= $this->icon[1]; $k = $adds ? $this->icon[0] : ''; } $spacer = $adds ? $adds.$j : ''; $selected = $this->have($sid,$id) ? 'selected' : ''; @extract($a); if (empty($selected)) { eval("\$nstr = \"$str\";"); } else { eval("\$nstr = \"$str2\";"); } $this->ret .= $nstr; $this->get_tree_category($id, $str, $str2, $sid, $adds.$k.' '); $number++; } } return $this->ret; } /** * 同上一类方法,jquery treeview 风格,可伸缩样式(需要treeview插件支持) * @param $myid 表示获得这个ID下的所有子级 * @param $effected_id 需要生成treeview目录数的id * @param $str 末级样式 * @param $str2 目录级别样式 * @param $showlevel 直接显示层级数,其余为异步显示,0为全部限制 * @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam' * @param $currentlevel 计算当前层级,递归使用 适用改函数时不需要用该参数 * @param $recursion 递归使用 外部调用时为FALSE */ function get_treeview($myid=0,$effected_id='example',$str="<span class='file'>\$name</span>", $str2="<span class='folder'>\$name</span>" ,$showlevel = 0 ,$style='filetree ' , $currentlevel = 1,$recursion=FALSE) { $child = $this->get_child($myid); if(!defined('EFFECTED_INIT')){ $effected = ' id="'.$effected_id.'"'; define('EFFECTED_INIT', 1); } else { $effected = ''; } $placeholder = '<ul><li><span class="placeholder"></span></li></ul>'; if(!$recursion) $this->str .='<ul'.$effected.' class="'.$style.'">'; foreach($child as $id=>$a) { @extract($a); if($showlevel > 0 && $showlevel == $currentlevel && $this->get_child($id)) $folder = 'hasChildren'; //如设置显示层级模式@2011.07.01 $floder_status = isset($folder) ? ' class="'.$folder.'"' : ''; $this->str .= $recursion ? '<ul><li'.$floder_status.' id=\''.$id.'\'>' : '<li'.$floder_status.' id=\''.$id.'\'>'; $recursion = FALSE; if($this->get_child($id)){ eval("\$nstr = \"$str2\";"); $this->str .= $nstr; if($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) { $this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE); } elseif($showlevel > 0 && $showlevel == $currentlevel) { $this->str .= $placeholder; } } else { eval("\$nstr = \"$str\";"); $this->str .= $nstr; } $this->str .=$recursion ? '</li></ul>': '</li>'; } if(!$recursion) $this->str .='</ul>'; return $this->str; } /** * 获取子栏目json * Enter description here ... * @param unknown_type $myid */ public function creat_sub_json($myid=0, $str='') { $sub_cats = $this->get_child($myid); $n = 0; if(is_array($sub_cats)) foreach($sub_cats as $c) { #print_r($c); # $data[$n][$this->id] = @iconv(CHARSET,'utf-8',$c[$this->id]); $data[$n][$this->id] = $c[$this->id]; #var_dump( $this->get_child($c[$this->id]) ); if($this->get_child($c[$this->id])) { $data[$n]['liclass'] = 'hasChildren'; $data[$n]['children'] = array(array('text'=>' ','classes'=>'placeholder')); $data[$n]['classes'] = 'folder'; # $data[$n]['text'] = @iconv(CHARSET,'utf-8',$c['catname']); $data[$n]['text'] = $c['name']; } else { if($str) { @extract(array_iconv($c,CHARSET,'utf-8')); eval("\$data[$n]['text'] = \"$str\";"); } else { # $data[$n]['text'] = @iconv(CHARSET,'utf-8',$c['catname']); $data[$n]['text'] = $c['name']; } } $n++; #echo '<hr/>'; } return json_encode($data); } private function have($list,$item){ return(strpos(',,'.$list.',' , ','.$item.',')); } } ?>
测试文件:test.php
<?php header("Content-type:text/html;charset=utf-8"); include('tree.class.php'); $arr = array( 1 => array('tid'=>'1','pid'=>0,'name'=>'1'), 2 => array('tid'=>'2','pid'=>0,'name'=>'2'), 3 => array('tid'=>'3','pid'=>1,'name'=>'1-1'), 4 => array('tid'=>'4','pid'=>1,'name'=>'1-2'), 5 => array('tid'=>'5','pid'=>2,'name'=>'2-1'), 6 => array('tid'=>'6','pid'=>3,'name'=>'1-1-1'), 7 => array('tid'=>'7','pid'=>3,'name'=>'1-1-2') ); /*把类 实力为 对象 */ $tree = new Tree(); # 初始化 类 $tree ->init($arr); echo "get_tree() 生成树 <br/>".PHP_EOL; $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式 $options = $tree->get_tree(0,$str, $select_id = 5); echo '<select>'; echo($options); echo '</select>'; echo '<hr/>';################################################################## echo 'get_parent( 6 )得到父级 数组 (6 de 父亲的兄弟姐妹)<br/>'.PHP_EOL; print_r( $tree -> get_parent( 6 ) ); echo '<hr/>';################################################################## echo 'get_child( 1 )得到子级数组 数组 (1 de 儿子的兄弟姐妹)<br/>'.PHP_EOL; print_r( $tree -> get_child( 1 ) ); echo '<hr/>';################################################################## echo 'get_pos( 6 )得到当前位置数组 <br/>'.PHP_EOL; print_r( $tree -> get_pos( 6 ) ); $str = ''; foreach($tree -> get_pos( 6 ) as $k => $v){ $str .= "<a href=\"?tid={$v['tid']}\" >{$v['name']}</a> > "; } echo $str; echo '<hr/>';################################################################## echo "get_tree_multi() 生成树 多选 <br/>".PHP_EOL; $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式 $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 $options = $tree->get_tree_multi(0,$str, $select_id = '1,2,3'); echo '<select size="10" multiple="multiple">'; echo($options); echo '</select>'; echo '<hr/>';################################################################## echo "get_tree_category() <br/>".PHP_EOL; $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式 $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 $options = $tree->get_tree_category(0 , "<div class='' data-tid={\$id} > {\$spacer} {\$name} </div>", "<div class='selected' data-tid={\$id} > {\$spacer} {\$name} </div>", $sid = 5, $adds = '') ; echo($options); echo '<hr/>';################################################################## echo "get_treeview() <br/>".PHP_EOL; $str = "<option value=\$id \$selected>\$spacer \$name</option>".PHP_EOL; //生成的形式 $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 $options = $tree->get_treeview() ; echo($options); echo '<hr/>';################################################################## echo "creat_sub_json() 这个能干什么没看懂???<br/>".PHP_EOL; $tree->ret='';# ret 是 递归调用时 用到的变量 上边 tree 之后,ret有值 $options = $tree->creat_sub_json() ; echo($options);
下载地址:http://pan.baidu.com/s/1i3xg6fb
Discuz!无法安装的解决方案(数据库原因MySQL5.5)
Discuz 在数据库MySQL5.5环境下,无法安装。
问题是 Discuz 使用的是老版本的MySQL。
由于新版的MySQL中使用ENGINE并放弃了TYPE函数,因此您需要按照以下步骤来安装Discuz!
1、 将程序解压并上传至服务器;
2、 用文本编辑器或其他编辑软件打开/install/data/install.sql文件;
3、 将其中所有的TYPE=替换为ENGINE=;
4、 在浏览器运行安装文件。
这样您就能顺利安装Discuz了。
php页面判断是 iphone还是andriod的浏览器
<?php $agent = strtolower($_SERVER['HTTP_USER_AGENT']); $iphone = (strpos($agent, 'iphone')) ? true : false; $ipad = (strpos($agent, 'ipad')) ? true : false; $android = (strpos($agent, 'android')) ? true : false; if($iphone || $ipad) { echo <<<END <script>alert('iphone or ipad')</script> END; } if($android){ echo "<script>alert('android')</script>"; } ?>