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();

官方网站:http://justinvincent.com/ezsql

源码下载:https://github.com/jv2222/ezSQL

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 = "&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.'&nbsp;');
				$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.'&nbsp;');
				$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'=>'&nbsp;','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>";  
    }  
?>