php中json编码和解码的一些提示

对于php下的web service应用,json因其快速,轻量在小数据量传输的时候非常有优势,但用的时候有些小细节需要注意。我就是把数组存进去,再取出来的时候发现变成对象了,才发现原来是这样。
在运行环境上,json在php5.2以上才是内置的。
常用的方法是json_encode和json_decode。
json_encode的参数只有一个,就是要被转换的数据,而json_decode就不一样,他可以把json格式转换成对象(object)和数组两种
下面是个例子
$arr = array(”1″,”2″,”3″);
print_r($arr);
echo json_encode($arr);
print_r(json_decode(json_encode($arr)));
print_r(json_decode(json_encode($arr), true));
如果数组转成json,想解码回来的,别忘了加个参数true


linux centos 5 lamp(apache mysql php) yum自动安装shell脚本

手头有N台linux centos 5的服务器,每次配置都要打很多命令,不想这么烦下去了。
自己写了一个自动安装脚本,包括了apache mysql php的自动Yum安装。最后还设置了防火墙。
记录一下,想要源文件的可以跟我要。
别忘了,给这个文件这是一个执行权限,简单的来就是chmod 7777
#! /bin/bash
yum -y install httpd php mysql mysql-server php-mysql
echo ‘install httpd,php,mysql,php success’
# define auto run
/sbin/chkconfig httpd on
/sbin/chkconfig –add mysqld
/sbin/chkconfig mysqld on
echo ‘define httpd mysqld autorun success’
# start service
/sbin/service httpd restart
/sbin/service mysqld restart
echo ’start httpd mysqld success’
#define mysql password
mysqladmin -u root password ‘ismurray’
echo ‘define mysql password success’
# install apache ext
yum -y [...]


如何解决PHP XML RPC中文乱码问题

为了一个项目在做XMLRPC的应用。发现项目服务器上没有XMLRPC组件,又要重新编译PHP,头大…
找了很多资料发现,国外的一个叫PHPXMLRPC的开源代码很好用。直接代替XMLRPC组件。他在GOOGLE有托管。国内用的还不多,很多东西都要自己摸索着搞。
这个PHPXMLRPC写的很好,我们只要把它用到的时候加载进来,然后NEW一下就好。以下是我这里总结的相对好用的用法
//载入相关文件
require ‘xmlrpc.inc’;
$forxmlrpc = array(); //初始化数组,传输必要参数
$forxmlrpc['title'] = $content['title'];
$forxmlrpc['contentid'] = $contentid;
$f=new xmlrpcmsg(’popcms.new’,array(new xmlrpcval(1, “int”),new xmlrpcval(’murray’, “string”),new xmlrpcval(’123′, “string”),php_xmlrpc_encode($forxmlrpc))); //新建一个XML格式
$c=new xmlrpc_client(”xmlrpc.php”, “www.popcms.net”, 80); //新建一个客户端
$c->request_charset_encoding = ‘utf-8′; //初始化时的编码格式,如果有中文,这一点是必须的,不然有乱码
$c->setDebug(1); //开启出错选项
$r=&$c->send($f); //发送请求
//以下是调试返回数据的代码
if(!$r->faultCode())
{$v=$r->value();
print “</pre><br/>State number ” . $stateno . ” is “. htmlspecialchars($v->scalarval()) . “<br/>”;
}else{
print “An error occurred: “;
print “Code: ” . htmlspecialchars($r->faultCode()). ” Reason: ‘” . htmlspecialchars($r->faultString()) . “‘</pre><br/>”;
}
虽然现在可以正常发送接收数据,但是还是会出现传递过程中的中文乱码。
原来PHPXMLRPC会自动转换编码,但提交后是乱码,是因为默认指定的是ISO-8859-1编码,而这个参数就是xmlrpc_internalencodeing,具体的操作步骤是:

打开?xmlrpc.inc 第222行, 将
$GLOBALS['xmlrpc_internalencoding']=’ISO-8859-1′;
改成
$GLOBALS['xmlrpc_internalencoding']=’UTF-8′;
至此XMLRPC的中文乱码问题解决了。


如何解决PHP Error: Permission denied in Unknown on line 0

今天在UCHOME的时候,自己新建了个文件,并上传到新的服务器,可是却莫名其妙的出现这样的出错:
PHP Warning: Unknown(/*****/***.php): failed to open stream: Permission denied in Unknown on line 0
开始以为是自己uchome的程序有问题。经过检查,确认没有程序错误。这个错误提示也太模糊啦,初的一看,真让人一头雾水,不知道从何下手。只好在网上找资料。原来根据错误的提示“Permission denied”,这个可能是文件权限的问题,于是修改权限为777,问题解决。


ecshop下can’t parse to JSON出错的一种解决思路

ecshop是一个php下非常常用的开源商城系统,他的ajax的功能非常强大,几乎所有的操作都涉及到了异步操作。
正因为如此,他的模版制作门槛就有点高,你会时不时地发现,这个不显示了,那个不能操作了。除非你用默认模版,不然有你搞得。
根据我的经验,很多情况,如果我们发现功能不能用,该有反应的地方突然没有反应了,我们应该先检查你的模板文件里是不是包含了以下这段代码

var process_request = “正在处理您的请求…”;

这几乎是最常见的AJAX错误,也是发生最多的。
不过这次我做要提到的解决思路要复杂很多。这个错误不常发生,却很难找到解决办法。
当我们点击购买按钮时候,这个商品应该是自动进入购物车,但动作没有响应。如果你在ie下,会出现JS报错。
Exception thrown and not caught (抛出的异常没有被接住)
如果我们用工具调试,会发现类似这样的报错
Fatal error: Bad string at offset 2: {\”spec\”:[],\”goods_id\”:4154,\”number\”:1,\”parent\”:0}
联动文章:http://bbs.ecshop.com/thread-109570-1-1.html (他遇到的问题很我类似)
我先说解决办法:从报错,我们可以看到错误出在了第二反斜杠上。默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。而ECSHOP没有对POST的数据进行过滤。
简单的解决办法: 在FLOW.php文件的57行,像我这样加上过滤
$_POST['goods'] = stripslashes(json_str_iconv($_POST['goods']));
我中间我一度认为是ecshop的transport和jquery冲突,因为我把ECSHOP做为一个插件插到了PHPCMS2008中。唉,走了很多弯路,做了很多调试才发现这个小Bug的,希望大家不要走我的老路。
联动讨论:http://bbs.ecshop.com/thread-76312-1-1.html


无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装的错误解决办法

在设置phpmyadmin时,经常会遇到“”的错误,网上查了很多资料发现,这个办法比较靠谱
1.确保您的php安装正确。phpinfo可以正常预览
2.打开您的php.ini配置文件session.save_path = “某个路径”检查该项是否配置正确,尤其确定这个目录是否存在,我们经常会遇到我们只拷过来了配置文件,没有看环境路径的问题
3.如果是WINDOWS的服务器检查temp目录的权限,请确保有internet来宾账户权限
4.使用phpinfo函数查看您的php安装情况,并检查Loaded Configuration 该项配置是否正确,如果该项显示为none
经过以上的步骤,我们就基本可以搞定了


解决PHP Warning: Cannot modify header information - headers already sent by的终极方案

原因分析:在PHP里Cookie的使用是有一些限制的。
1、使用setcookie必须在标签之前
2、使用setcookie之前,不可以使用echo输入内容
3、直到网页被加载完后,cookie才会出现
4、setcookie必须放到任何资料输出浏览器前,才送出
解决方案:
1,文件开头写上ob_start();
ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
2,php.ini 把 output_buffering 设为 on 重起apache
3,部分情况是多出现在UTF编码的文件。因为在一般的文本编辑器(记事本),尤其是微软的各种产品,在编辑完保存完后,总是会自动在最前面缀上一个BOM,在windows 托管的服务器上没问题,而在UNIX服务器上就会产生问题。比如在代码中用到session或header时,因前有看不见的BOM
你可以用写字板打开,光标移到最前面,先退行,在按delete键去掉刚才加的那一空行。在保存的时候,写字板总是回保存为UTF-8编码的格式;同样你可以在dreamweaver的专业编辑器中已定为UTF-8格式进行编辑。


基于PHP如何向一个txt文件追加内容

首先我们要先介绍下文件打开的一些参数

‘r’ 只读方式打开,将文件指针指向文件头。
‘r+’ 读写方式打开,将文件指针指向文件头。
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。

现在LINUX有一个文本文件log,里面已有内容,现在再追加一段内容进去,该如何写?
$k=fopen(”/tmp/log”,”a”);
$str=”追加的内容”;
@fwrite($k,$str);
fclose($k);


给大家一个打包下载php_memcache.dll的地方

下载php_memcache.dll的那个网站关了, 网站上到处下不了,我千辛万苦找到了一个
这里打个包供大家下载
下载地址:php_memcache


基于Php实现自动获取关键词的分析

现在的CMS都自带了采集功能,内容和标题相对来说很好处理,但大部分情况关键词很难能提取到。于是自动获取关键字成为当前PHP类CMS的“传统问题”。
那如何才能自动获取关键词呢,其主要步骤主要可以分为如下三个步骤:
1,通过分词算法将标题和内容分别进行分割,提取出关键词和频度
在内容的分词阶段,当前主要的两个算法是中科院的ICTCLAS和隐马尔可夫模型。但这两个都太高端,有一定的门槛,且都是只支持C++/JAVA。基于PHP的当前有两个是值得推荐的PSCWS和HTTPCWS。
SCWS于2008-03-08发布1.0.0 正式版,到现在最新版本已经到了1.0.4。PSCWS是它的PHP版。
而HTTPCWS是张宴开发的,之前叫PHPCWS。PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。目前仅支持Linux/Unix系统。
2,将提取结果与现有词库进行比较,得到最符合规则的关键词
这里主要就是要看词库了,我们可以自己定义词库,也可以使用现有的成熟词库。
3,然后将这两套关键词进行比较,得到最符合当前内容的关键词
在这个阶段就是具体情况具体分析了。当前PHP类CMS都自有自己的提取关键词系统。其中在网络上流传最广的是DEDECMS的分词源码,我也在我的POPCMS上作过测试,效果很不错,不过类似“我们”等无意义的词提取并被列为关键词的频率太高,甚至有时候还会把空格的HTML提出来做为关键词,亟待改进。不过如果作为辅助功能,它已经很好了。
另外PHPCMS和DISCUZ的自动提取关键词功能也很强大。