Joomla首页用PHP代码判断普通用户和搜索蜘蛛

偶看有个Joomla需要判断用户浏览器语言来执行跳转,而判断浏览器语言的前提是需要判断浏览网站的是普通用户,还是搜索引擎的蜘蛛。

joomla-spider

偶看在刚开始使用的是PHP的$_SERVER[‘HTTP_REFERER’]函数,经过两天时间查看网站的百度快照发现,网站首页在百度的快照出现错误,跳转到另外一个网站上了。偶看赶紧修改判断函数,经过分析需要使用$_SERVER[‘HTTP_USER_AGENT’。

在Joomla模板下的index.php页面顶部添加

$app = JFactory::getApplication();
$menu = $app->getMenu();
if ($menu->getActive() == $menu->getDefault()) { 
 $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
    $botchar = "/(bot|crawl|spider|slurp|yahoo|sohu-search|lycos|robozilla)/i";
    if(!preg_match($botchar, $ua)  && $_SERVER['HTTP_REFERER') {//判断为非搜索引擎,而且是直接访问的用户
  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4); //只取前4位,这样只判断最优先的语言。如果取前5位,可能出现en,zh的情况,影响判断。 
  if (preg_match("/zh/i", $lang)){
   header('location:'.'http://www.oukan.net');
  }
 }
}

这样即可在Joomla网站的首页,通过PHP代码判断访问网站的是普通用户,还是搜索蜘蛛。如果是普通用户,而且浏览器的默认语言是中文,及跳转到中文网站;如果是搜索引擎,不进行任何判断。

用PHP求1234567以内所有质数的和

求质数需要先了解什么是质数

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。因为合数是由若干个质数相乘而得来的,所以,没有质数就没有合数,由此可见素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一。基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等。算术基本定理每一个比1大的数(即每个比1大的正整数)要么本身是一个素数,要么可以写成一系列素数的乘积,如果不考虑这些素数的在乘积中的顺序,那么写出来的形式是唯一的。这个定理的重要一点是,将1排斥在素数集合以外。如果1被认为是素数,那么这些严格的阐述就不得不加上一些限制条件。

用PHP先算出那些是质数,然后求和,具体代码为:

<?php
$sum = 0;
$isPrime=true;
$n=1234567;
echo $n."以内的素数和:";
for($i=2;$i<$n;$i++){              //第一层循环,循环1-$n直接的所有数
   for($j=2;$j<=intval(sqrt($i));$j++){   //第二层循环,$i开平方,这里的intval是10进制取整数的意思
     if($i%$j==0){                              //取模运算,如果余数为0,输出$isPrime=false,并跳出第二层循环
       $isPrime=false;
       break;
     }
     $isPrime=true;
   }
   if($isPrime){                               //如果$isPrime=true,将$i输出
     $sum+=$i;
   }
}
echo $sum;
?>

Drupal官网升级到Drupal7后部分页面出现错误

在11月1日,Drupal官网将网站内核由Drupal6升级到Drupal7,升级后得网站外观并没有多大的变化,因为模板并没变。

在访问 https://drupal.org/project/project_theme 页面时会出现错误

drupal-error

Additional uncaught exception thrown while handling exception.

Original

Additional uncaught exception thrown while handling exception.

Original

PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT base.tid AS tid, base.vid AS vid, base.name AS name, base.description AS description, base.format AS format, base.weight AS weight, v.machine_name AS vocabulary_machine_name FROM {taxonomy_term_data} base INNER JOIN {taxonomy_vocabulary} v ON base.vid = v.vid WHERE (base.tid IN (:db_condition_placeholder_0)) ; Array ( [:db_condition_placeholder_0] => 19370 ) in DrupalDefaultEntityController->load() (line 191 of /var/www/drupal.org/htdocs/includes/entity.inc).

Additional

PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: INSERT INTO {watchdog} (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9); Array ( [:db_insert_placeholder_0] => 0 [:db_insert_placeholder_1] => php [:db_insert_placeholder_2] => %type: !message in %function (line %line of %file). [:db_insert_placeholder_3] => a:6:{s:5:”%type”;s:12:”PDOException”;s:8:”!message”;s:443:”SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT base.tid AS tid, base.vid AS vid, base.name AS name, base.description AS description, base.format AS format, base.weight AS weight, v.machine_name AS vocabulary_machine_name FROM {taxonomy_term_data} base INNER JOIN {taxonomy_vocabulary} v ON base.vid = v.vid WHERE (base.tid IN (:db_condition_placeholder_0)) ; Array ( [:db_condition_placeholder_0] =&gt; 19370 ) “;s:9:”%function”;s:37:”DrupalDefaultEntityController->load()”;s:5:”%file”;s:46:”/var/www/drupal.org/htdocs/includes/entity.inc”;s:5:”%line”;i:191;s:14:”severity_level”;i:3;} [:db_insert_placeholder_4] => 3 [:db_insert_placeholder_5] => [:db_insert_placeholder_6] => https://drupal.org/project/project_theme [:db_insert_placeholder_7] => https://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDgQjBAwAQ&url=https%3A%2F%2Fdrupal.org%2Fproject%2Fthemes&ei=FAZ4UptS8OXIAdn_gNgF&usg=AFQjCNH5TtOjkTnU9MuyeYQIAU5egA3VuA&sig2=W843SrP69npyr8PhS6yq3Q [:db_insert_placeholder_8] => 206.47.188.26 [:db_insert_placeholder_9] => 1383660482 ) in dblog_watchdog() (line 160 of /var/www/drupal.org/htdocs/modules/dblog/dblog.module).

这个错误信息还挺详细的。

PHP错误之AUTO_INCREMENT

偶看在学习使用PHP创建一个微型博客系统,在编写add.php的时候,所发表的内容一直无法插入数据库。

add.php的完整代码是:

<?php
	include("conn.php");  //引入连接数据库
	
	if(!empty($_POST['sub'])){
		$title=$_POST['title'];
		$con=$_POST['con'];
		$sql="insert into `blog` (`id`,`title`,`dates`,`contents`) values (null,'$title',now(),'$con')";
		mysql_query($sql);
		echo "发表成功!";
	}
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<form action="add.php" method="post">
标题<input type="text" name="title"><br/>
内容<textarea rows="8" cols="50" name="con"></textarea><br/>
<input type="submit" name="sub" value="发表">
</form>

无奈之下,偶看直接在mysql数据库直接执行SQL语句

insert into `blog` (`id`,`title`,`dates`,`contents`) values (null,'$title',now(),'$con')

数据库返回结果报错

#1048 - Column 'id' cannot be null

通过对比视频发现,数据库中id字段在“额外”显示“AUTO_INCREMENT”,而偶看没有设置这个属性,导致出错。

修改id字段勾选“A_I”,在前台执行add.php,数据终于写入数据库。

PHP代码之数字计数器和图片计数器

偶看在学习一段时间的PHP基础知识后,今天正式进入编程阶段。感谢网易云课堂(http://study.163.com/)让网络学习不再困难,这次学习的PHP教程是PHP100推出的2012版教程,基于PHP5.4版本。PHP5.4版本对于国内貌似过于新潮,很多国内主机的PHP版本还在5.2阶段,Joomla3.X版本对PHP的最低要求是5.3.1,这已经难住了国内的大部分主机,如果要求PHP5.4版本估计都网站都没地方找虚拟主机了(VPS和服务器等除外)。不过还好,PHP5.4的变化不是很大,向下的兼容性还是不错的。

数字计数器

<?php
	//文字计数器
	if(!@$f=fopen("num.txt","r")){
		echo "文件不存在!";
		$num=0;
	}else{
		$num=fgets($f,10);	//获得9位
		fclose($f);
	}
	$num++;
	$ff = fopen("num.txt","w");
	fwrite($ff,$num);
	fclose($ff);
	
	echo $num;
?>

图片计数器

<?php
//制作图片计数器
	if(!@$f=fopen("num.txt","r")){
		echo "文件不存在!";
		$num=0;
	}else{
		$num=fgets($f,10);	//获得9位
		fclose($f);
	}
	$num++;
	$ff = fopen("num.txt","w");
	fwrite($ff,$num);
	fclose($ff);
	
	$numarr=str_split($num);  //数字拆分为数组
	foreach($numarr as $v){
	echo "<img src='img/".$v.".jpg'>";
	}
?>

图片计数器的数字图片放置于img文件夹,并以数字名字相应的图片。

图片计数器比文字计数器代码增加:数字拆分为数组、遍历数组并使用HTML语言连接图片。