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>";
}
?>