Archive for the ‘程序设计’ Category

对于UTF-8、gb2321、GBK一些区别的认识

首先如果是中文网站不太推荐UTF-8,理由是UTF-8对中文支持不好,举个例子就是你在记事本里只输入私募两个字,保存后重新打开,你会看到什么?没错,乱码!

当然UTF-8也有UTF-8的好处,比如使用AJAX的时候默认都是UTF-8,这样就不需要转码了。

再者,gb2321和GBK,GBK对汉字的支持比gb2321要好很多,gb2321对于很多偏僻的汉字都不支持。比如琩、晿等,但是GBK全部都是支持的。

此外进行str_replace函数进行替换的时候使用GBK编码的话会,有时替换后会出现乱码,必须要先转换为UTF-8进行替换后在转换为GBK。当然如果一个字符串里面的汉子有简体又有繁体,那替换起来更麻烦。、

从上所述,如果你不介意某些汉字以乱码出现,那用UTF-8,你不怕麻烦那就用GBK。

将多选题的选项记录在数据库的一个字段中

如果一个多选题,选项数量不确定,如何记录用户的选项到1个字段内呢?

方法1

A|B|D  用|作为分割符,把用户所有记录都存在一个字段里。但是如果要统计多少用户先了A,如何是好?

方法2

选项N=2^N A=1 B=2 C=4 D=8

如果选了 A B C 字段的值为11

方法3

使用二进制(类似方法2)

1 代表A

11 代表了AB

101 代表了A C

如果统计多少人选了B 那与10进行与操作

 

以上内容为随便瞎想想到的,目测MYSQL效率不高,大数据量还是一个个字段存吧。

WordPress禁止全英文评论(反垃圾)

WordPress禁止全英文评论主要是为了反垃圾评论,因为一般垃圾评论都有是全英文带有链接。具体修改:打开当前使用的主题目录下的functions.php,增加函数:

 

1
2
3
4
5
6
7
8
9
    $pattern = '/[一-龥]/u';

    // 禁止全英文评论
    if(!preg_match($pattern, $incoming_comment['comment_content'])) {
        wp_die( "You should type some Chinese word (like \"你好\") in your comment to pass the spam-check, thanks for your patience! 您的评论中必须包含汉字!" );
    }
    return( $incoming_comment );
}
add_filter('preprocess_comment', 'scp_comment_post');

最终效果如图:

wordpress禁止全英文评论(反垃圾)

更多wordpress反垃圾方法:http://www.ludou.org/wordpress-simple-way-to-anti-spam.html

PHP使用pathinfo获取文件扩展名

通常使用explode获取文件扩展名。

其实pathinfo函数就能搞定:

$extension = pathinfo($path, PATHINFO_EXTENSION);

MYSQL重启异常:MySQL manager or server PID file could not be found!

service mysqld stop 或者service mysqld restart的时候,很可能导致异常,提示一下信息。

MySQL manager or server PID file could not be found!       [FAILED]

主要原因是进程没有彻底关闭,导致冲突。

使用ps aux |grep mysq* 查看当前进程

root      2643  0.0  0.2   4536  1224........

mysql     2757  0.0  1.2  36976  6608 ?..........

其中2643 2757分别是进程号

如果看到上面的内容,那说明,Mysql的进程卡死了,这时用就要把这些卡死的进程都关闭

kill 进程号

然后启动Mysql 就ok了

service mysqld start

LINUX下查看网站日志&清除日志

查看日志可以使用tail命令

tail -100 /var/log/geexun-error_log

意思是查看最后100条的日志。

tail   -100   /var/log/geexun-error_log>/var/log/geexun-error_log>/var/log/geexun-error_log

意思是不完全清空保留最后100行的方法:(保留最后n行到新文件, 再清空老log文件)

PHP关闭Notice错误

服务器上线2周,日志报错多达1G。主要都是Notice错误,诸如:Notice: Use of undefined。可以选择关闭.

关闭 PHP 提示的方法

搜索php.ini:

error_reporting = E_ALL

改为:

error_reporting = E_ALL & ~E_NOTICE

还有个不是办法的办法就是

在每个文件头上加

error_reporting(0);

或者

error_reporting(E_ALL ^ E_NOTICE);

不过关闭掉PHP错误输出并不会关闭php内核对错误的处理,代码中如果有大量的Notice级别的错误,还是会降低php程序的性能。还是应该谨慎的处理掉每处不合理的代码,这样既可以提高了代码的严谨性,也提高了代码的运行性能。

参考资料:PHP NOTICE级错误提示对程序性能影响的研究

Apache、PHP、MySQL默认安装目录

Apache
(1)如果采用RPM包安装,安装路径应在 /etc/httpd目录下
         Apache配置文件:    /etc/httpd/conf/httpd.conf
         Apache模块路径:  /usr/sbin/apachectl
         Web目录:             /var/www/HTML
(2)如果采用源代码安装,一般默认安装在/usr/local/apache2目录下

PHP
(1)如果采用RPM包安装,安装路径应在 /etc/目录下
         php的配置文件:     /etc/php.ini
(2)如果采用源代码安装,一般默认安装在/usr/local/lib目录下
         php配置文件:       /usr/local/lib/php.ini
                              或 /usr/local/php/etc/php.ini 

MySQL
(1)如果采用RPM包安装,安装路径应在/usr/share/mysql目录下
         MySQL dump文件位置: /usr/bin/mysqldump
         MySQL配置文件:            /etc/my.cnf

                                   或     /usr/share/mysql/my.cnf
         MySQL数据目录:          /var/lib/mysql
(2)如果采用源代码安装,一般默认安装在/usr/local/mysql目录下

写个每天自动提示女朋友去睡觉的应用

昨天在《5月23日》提到准备写三个程序,今天花了点时间把第一个写完了——每天能够自动提示女朋友去睡觉的程序。

简单的思路是每当0点到5点之间,发现她又有新的微博出现的时候,程序自动去留一条言,提示她去睡觉。

程序主要分三大部分,第一步微博应用的认证,第二部设置相关参数,第三部定时检查是否有新微薄出现。

第一步,略。

第二部,主要保存用户自己的id,Ta的id,Ta最后条微博的id、时间,检查的开始时间、结束时间,你要留给Ta的话,以及微博账号认证的oauth_token、oauth_token_secret。


weibolist.php

<?php

header("Content-type: text/HTML; charset=utf-8");

session_start();

include_once( 'config.php' );

include_once( 'weibooauth.php' );

$url=$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"];

if (!isset($_POST['u_id']) && !isset($_POST['comments']) && !isset($_POST['begin_time']) && !isset($_POST['end_time']))

{

echo <<< EOT

<form action="http://{$url}"  method="post">  

Ta微博的昵称

<input type="text" name="u_id"   size="15" maxlength="20"  title="Ta微博的昵称" /><br>

想要给TA留的言

<input type="text" name="comments"   size="15" maxlength="200"  title="想要给TA留的言" /><br>

起始时间(24小时制)

<input type="text" name="begin_time"   size="15" maxlength="6"  title="起始时间" /><br>

终止时间(24小时制)

<input type="text" name="end_time"   size="15" maxlength="6"  title="终止时间" /><br>

<input type="submit" value="提交" name="name">

</form>

EOT;

}

else 

{

include_once( 'conn.php' );//连接数据库

$c = new WeiboClient( WB_AKEY , 

                      WB_SKEY , 

                      $_SESSION['last_key']['oauth_token'] , 

                      $_SESSION['last_key']['oauth_token_secret']  );

$u_id=$_POST['u_id'];

$comments=$_POST['comments'];

$begin_time=$_POST['begin_time'];

$end_time=$_POST['end_time'];

$msg = $c->show_user($u_id);

if ($msg === false || $msg === null){

echo "Error occured";

return false;

}

if (isset($msg['error_code']) && isset($msg['error'])){

echo ('Error_code: '.$msg['error_code'].';  Error: '.$msg['error'] );

return false;

}

$last_weibo_id=$msg['status']['id'];

$oauth_token=$_SESSION['last_key']['oauth_token'];

$oauth_token_secret=$_SESSION['last_key']['oauth_token_secret'];

$me = $c->verify_credentials();

$u_my_id=$me['id'];

$mysql = "SELECT * FROM goodnight WHERE u_my_id = '".$u_my_id."' ";   

$result = mysql_query($mysql) or die(mysql_error());

$num = mysql_num_rows($result);    

if($num==0)

{

mysql_query("INSERT INTO goodnight (u_my_id,oauth_token,oauth_token_secret,u_id,last_weibo_id,begin_time,end_time,comments) VALUES ('".$u_my_id."','".$oauth_token."','".$oauth_token_secret."','".$u_id."','".$last_weibo_id."','".$begin_time."','".$end_time."','".$comments."')")or die(mysql_error());

echo "保存成功<br>";

}

else

{

$mysql = "UPDATE goodnight SET u_id = '".$u_id."',last_weibo_id = '".$last_weibo_id."',begin_time = '".$begin_time."',end_time = '".$end_time."',comments = '".$comments."' WHERE u_my_id = '".$u_my_id."'";   


$result = mysql_query($mysql) or die(mysql_error());

echo "修改成功<br>";

}

echo <<< EOT

{$u_id}每天在{$begin_time}和{$end_time}之间还在发微博的话,系统将自动留言:{$comments}到微博{$last_weibo_id}

EOT;

}

?>

<?php

header("Content-type: text/HTML; charset=utf-8");

session_start();

include_once( 'config.php' );

include_once( 'weibooauth.php' );

$url=$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"];

if (!isset($_POST['u_id']) && !isset($_POST['comments']) && !isset($_POST['begin_time']) && !isset($_POST['end_time']))

{

echo <<< EOT

<form action="http://{$url}"  method="post">  

Ta微博的昵称

<input type="text" name="u_id"   size="15" maxlength="20"  title="Ta微博的昵称" /><br>

想要给TA留的言

<input type="text" name="comments"   size="15" maxlength="200"  title="想要给TA留的言" /><br>

起始时间(24小时制)

<input type="text" name="begin_time"   size="15" maxlength="6"  title="起始时间" /><br>

终止时间(24小时制)

<input type="text" name="end_time"   size="15" maxlength="6"  title="终止时间" /><br>

<input type="submit" value="提交" name="name">

</form>

EOT;


}

else 

{

include_once( 'conn.php' );//连接数据库


$c = new WeiboClient( WB_AKEY , 

                      WB_SKEY , 

                      $_SESSION['last_key']['oauth_token'] , 

                      $_SESSION['last_key']['oauth_token_secret']  );

$u_id=$_POST['u_id'];

$comments=$_POST['comments'];

$begin_time=$_POST['begin_time'];

$end_time=$_POST['end_time'];


$msg = $c->show_user($u_id);

if ($msg === false || $msg === null){

echo "Error occured";

return false;

}

if (isset($msg['error_code']) && isset($msg['error'])){

echo ('Error_code: '.$msg['error_code'].';  Error: '.$msg['error'] );

return false;

}

$last_weibo_id=$msg['status']['id'];

$oauth_token=$_SESSION['last_key']['oauth_token'];

$oauth_token_secret=$_SESSION['last_key']['oauth_token_secret'];


$me = $c->verify_credentials();

$u_my_id=$me['id'];

$mysql = "SELECT * FROM goodnight WHERE u_my_id = '".$u_my_id."' ";   

$result = mysql_query($mysql) or die(mysql_error());

$num = mysql_num_rows($result);    

if($num==0)

{

mysql_query("INSERT INTO goodnight (u_my_id,oauth_token,oauth_token_secret,u_id,last_weibo_id,begin_time,end_time,comments) VALUES ('".$u_my_id."','".$oauth_token."','".$oauth_token_secret."','".$u_id."','".$last_weibo_id."','".$begin_time."','".$end_time."','".$comments."')")or die(mysql_error());

echo "保存成功<br>";

}

else

{

$mysql = "UPDATE goodnight SET u_id = '".$u_id."',last_weibo_id = '".$last_weibo_id."',begin_time = '".$begin_time."',end_time = '".$end_time."',comments = '".$comments."' WHERE u_my_id = '".$u_my_id."'";   

$result = mysql_query($mysql) or die(mysql_error());

echo "修改成功<br>";

}

echo <<< EOT

{$u_id}每天在{$begin_time}和{$end_time}之间还在发微博的话,系统将自动留言:{$comments}到微博{$last_weibo_id}

EOT;

 }

?>

第三部,读取数据库存的最后条微博的ID和目前最后条微博ID是否相同,如果不同,并且在时间内,则触法评论功能。其中每次评论需要不同,否则会出现BUG。

goodnight.php


<?php

header("Content-type: text/html; charset=utf-8");

echo <<< EOT

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>goodnight</title>

<meta http-equiv=refresh content="60">

</head>


EOT;

ignore_user_abort(1);

set_time_limit(0);

date_default_timezone_set('Asia/Shanghai');

include_once( 'conn.php' );//连接数据库

include_once( 'config.php' );

include_once( 'weibooauth.php' );


$result = mysql_query("SELECT * FROM goodnight ");


while($row = mysql_fetch_array($result))

  {

  $u_my_id=$row['u_my_id'];

  $oauth_token=$row['oauth_token'];

  $oauth_token_secret=$row['oauth_token_secret'];

  $u_id=$row['u_id'];

  $last_weibo_id=$row['last_weibo_id'];

  $begin_time=$row['begin_time'];

  $end_time=$row['end_time'];

  $comments=$row['comments'];


  $c = new WeiboClient( WB_AKEY , 

                      WB_SKEY , 

                      $oauth_token, 

                      $oauth_token_secret );

  $msg = $c->show_user($u_id);

  if ($msg === false || $msg === null){

echo "Error occured";

return false;

}

if (isset($msg['error_code']) && isset($msg['error'])){

echo ('Error_code: '.$msg['error_code'].';  Error: '.$msg['error'] );

return false;

}

$sid=$msg['status']['id'];//获取最近评论ID

if($sid!=$last_weibo_id)

{

$weibo_time=$msg['status']['created_at'];//获取最近一条微博时间


$weibo_time=date('H:i:s', strtotime($weibo_time));

$comments="都".$weibo_time."了,".$comments;//避免每次回复内容相同,否则会报错

if(($weibo_time<$end_time&&$weibo_time>$begin_time&&$begin_time<$end_time)||($begin_time>$end_time&&$weibo_time>$begin_time)||($begin_time>$end_time&&$weibo_time<$end_time))

{

$msg = $c->send_comment($sid,$comments,null);

if ($msg === false || $msg === null){

echo "Error occured";

return false;

}

if (isset($msg['error_code']) && isset($msg['error'])){

echo ('Error_code: '.$msg['error_code'].';  Error: '.$msg['error'] );

return false;

}


echo "发送成功";

$mysql = "UPDATE goodnight SET  last_weibo_id = '".$sid."' WHERE u_my_id = '".$u_my_id."'";   

$result = mysql_query($mysql) or die(mysql_error());

}

else

{

echo "未在时间范围内不修改";

}

}

else

{echo "这条微博是以前的";}

}

$now=date('Y-m-d H:i:s');

echo "<br>".$now;

?>

PHP简易实现中文搜索功能

核心思路:使用mysql全文索引,但是mysql全文索引不支持中文,所以需要进行一些处理。

创建一张专门用于搜索的索引表


CREATE TABLE search (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
question_id INT(6),//相对应的题目ID 根据实际自行修改
body TEXT,  //存放分词结果
FULLTEXT (body)//全文索引
);



数据录入

1、将内容进行分词(可以使用开源的scws 或者dedesplit

2、分词结果base64转码存入数据库


数据库查询

1、限制查询输入长度(不超过64个字符 //自动截取前64个字符)

2、将查询内容进行分词

3、去除标点符号和无用关键词(例如 的 地 得)

4、将分词结果base64转码,在数据库全文索引

5、数据库按照相关性返回结果

6、根据对应题目ID找到该题地址

参考资料:

http://edu.codepub.com/2010/0606/23306.php

http://info.codepub.com/2008/07/info-20442.html