Ross Wan's World!

Python, Ajax, PHP and Linux.

Archive for the ‘PHP’ Category

CodeIgniter: is_ajax,判断 AJAX 请求

Posted by Ross Wan 于 2009/02/27

CakePHP 的 RequestHandler 组件,有一个方便的方法 isAjax ,可以判断当前的请求是否为 AJAX 请求。貌似 CodeIgniter(以下简称 CI) 没有)。不过不要紧, 可以自行对 CI 的类库进行扩展,添加上 is_ajax 方法(之所以用下划线分隔的方式命名而不是骆驼峰方式,是因为要迎合 CI 的开发规范)。

我们决定扩充 CI 的CI_Input 类,不赞成直接对核心代码的修改,既然 CI 提供了良好的扩充机制,为什么不用呢? :)

创建一个名为 MY_Input.php 的文件,放在自己的 App(默认是 aplication )/libraries 文件夹下。内容如下:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Input extends CI_Input {
	function MY_Input() {
		parent::CI_Input();
	}

	function isAjax() {
        return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=="XMLHttpRequest");
    } 
}
// END Input class

/* End of file Input.php */
/* Location: ./system/application/MY_Input.php */

注意:具体的文件名,要根据你在 config.php 中对 $config[‘subclass_prefix’] 的设置。默认是 $config[‘subclass_prefix’]  = ‘MY_’;

下面,就可以在 Controller 里对 Input 类自行加载使用:

......

    function foo() {
        $this->load->library('input');
        if ($this->input->is_ajax()) {
            do_something();
            ....
        }
    }
......
Advertisements

Posted in Ajax, CodeIgniter, PHP | Tagged: , , | Leave a Comment »

cakePHP: 中文乱码问题

Posted by Ross Wan 于 2009/02/20

在默认的配置下,cakePHP 存取的中文字符可以在网页上正常显示,但是在 phpMyadmin 下中文会显示为乱码,已经将数据库、所有的表都设置为 UTF-8,一样无效。

想起平时在 PHP 里处理 MySQL 中文存取的方法,就是在数据库操作前执行一句:

mysql_->query('SET NAME "UTF8");
于是在自己的 controller 里添加上这一句,果然中文在 phpMyAdmin 里显示正常。但取出数据时显示乱码。看来得“修改” AppModel。在自己的 App 目录下添加 app_model.php 文件,内容如下:
class AppModel extends Model {
    function __contruct() {
        parent::__construct();
        $this->query('SET NAMES "utf8"');
    }
}

这样,中文乱码消失了。但究竟 cakePHP 有没有更简洁的解决方法呢?于是查看 App 的数据库配置文件(config/database.php),发现有一个 encoding 选项,设置其为 ‘UTF8’,记住!不能是’UTF-8’,否则无效,问题果然解决。

That’s all, have fun :)

Posted in cakePHP, PHP | Leave a Comment »

Windows 下 Apache + PHP + MySQL 配置笔记

Posted by Ross Wan 于 2008/11/20

众所周知,LAMP 是最佳组合(貌似近年来 Apache 有被轻量级的 Web 服务器取代之势,如 Lighttpd 等),今天因需要,在 Windows 下配置,结果遇到不少困难。虽然网上有众多的配置,但很多雷同。下面对自己的配置作笔记。

Apache

假设安装目录为 D:\apache

成功安装后,执行以下代码添加 Apache 服务:

cd d:\apache\bin
httpd.exe -k install -n apache

修改文档根目录,默认是在 D:\apache\htdocs,现修改为 E:\www。编辑 D:\apache\conf\httpd.conf文件,查找下面的内容:

DocumentRoot "D:\apache\htdocs"

<Directory "D:\apache\htdocs">

修改为:

DocumentRoot "E:\www"

<Directory "E:\www">

启动 Apache

net start apache

PHP

解压安装到 D:\php

将 D:\php;D:\php\ext 加到系统的环境变量。

进入 php 安装目录,将 php.ini-dist 或 php.ini-recommended 复制一份,命名为 php.ini。

对 D:\apache\conf\httpd.conf 文件作以下增改:

PHPINIDir D:\php

LoadModule php5_module D:\php\php5apache2_2.dll

<IfModule dir_module>
    DirectoryIndex index.php index.html index.htm
</IfModule>

AddType application/x-httpd-php .html
AddType application/x-httpd-php .php

测试:

在 E:\www 目录下新建一个 index.php 文件,内容为:

<?php
    phpinfo();
?>

重启 Apache 服务器,在浏览器打开 http://127.0.0.1:8080

MySQL

解压安装到 D:\mysql

进入 mysql 安装目录,复制其中一份 my-*.ini 文件,命名为 my.ini。对 my.ini 文件作以下的增改:

[WinMySQLAdmin]
Server=D:\mysql\bin\mysqld-nt.exe

[mysqld]
basedir=D:\mysql
datadir=E:\mysqldata

上面的 datadir=E:\mysqldata 是设置数据库的保存目录,默认是在 D:\mysql\data。之后,务必复制 D:\mysql\data\mysql 目录到 E:\mysqldata。

执行下面代码添加一个 mysql 服务:

cd d:\mysql\bin

mysqld-nt.exe -install mysql

修改 D:\php\php.ini 文件,将 “;extension=php_mysql.dll” 一行前面的”;”去掉,以启用 mysql 扩展:

extension=php_mysql.dll

同时修改 php.ini 里面的 extension_dir:

extension_dir = "D:\php\ext"

接着需要修改 D:\apache\conf\httpd.conf,让 Apache 可以正确加载 Mysql 模块:

LoadFile D:\php\php5ts.dll
LoadFile D:\php\libmysql.dll

测试:

解压 phpMyAdmin 到 E:\www\phpmyadmin

里面的 config.sample.inc.php 文件复制一份,命名为 config.inc.php。修改 config.inc.php 文件,设置 $cfg[‘blowfish_secret’],可以设为任意值:

$cfg['blowfish_secret'] = 'phpmyadmin';

修改 D:\php\php.ini 文件,去掉下面几行前面的”;”,因为 phpmyadmin 需要用到这些模块:

extension=php_mbstring.dll
extension=php_mcrypt.dll

修改 D:\apache\conf\httpd.conf 文件,以正确加载上面的模块:

LoadFile D:\php\libmcrypt.dll

启动 MySQL 服务:

net start mysql

重启 Apache 服务器,在浏览器里打开 http://127.0.0.1:8080/phpmyadmin

Posted in PHP | Tagged: , , , , , | Leave a Comment »

Drupal:关于数据库设置问题

Posted by Ross Wan 于 2008/11/08

在网上经常有看到,在配置 Drupal 时无法通过数据库这个步骤,而且 Drupal 没有显示出错,但一直在循环要求用户配置数据库。

之所以出现这个问题,很可能是因为丢失 default.settings.php 文件。很多用户在根据 Drupal 安装教程进行配置,但没有执行教程里面所说的:

cp sites/default/default.settings.php sites/default/settings.php

而是简单的作重命名就算:

mv sites/default/default.settings.php sites/default/settings.php

解决方法就是复制回一份 default.settings.php 文件就行。如:

cp sites/default/settings.php sites/default/default.settings.php

又或者直接编辑 settings.php 文件,手动加入数据库的配置:

$db_url = 'mysql://username:password@localhost/databasename';

Posted in Drupal, PHP | Tagged: , , , , , , | Leave a Comment »

Archlinux: 以 non-root 运行 Lighttpd

Posted by Ross Wan 于 2008/11/07

假设 arch 为系统已经存在的非管理员账户(non-root)和组。

$ groups

可以查看用户 arch 是否已经加入 arch 组。

所用软件版本: PHP 5.2.6,Lighttpd 1.4.20。

安装 Lighttpd、PHP、Fastcgi

# pacman -S lighttpd php fcgi

配置 PHP

修改 /etc/php/php.ini,去掉以下行前面的注释:

cgi.fix_pathinfo=1
open_basedir = /home/:/tmp/:/usr/share/pear/

配置 Lighttpd

修改 /etc/lighttpd/lighttpd.conf 文件,注释或者添加以下行:

server.document-root    = "/home/arch/http/www/"

server.modules    = (
                    "mod_access",
                    "mod_fastcgi",
                    "mod_accesslog"
                    )

fastcgi.server    = ( ".php" =>
                           ( "localhost" =>
                             (
                               "socket" => "/tmp/php-fastcgi.socket",
                               "bin-path" => "/usr/bin/php-cgi"
                             )
                           )
                    )

server.username   = "arch"
server.groupname    = "arch"

注: server.document-root 是设置文档根目录,方便 arch 用户来管理。

更改相关日志的权限

# chown arch arch /var/log/lighttpd/*.log

修改 /etc/logrotate.d/lighttpd,在第二行添加 create 644 arch arch,示例:

/var/log/lighttpd/*log {
     create 644 arch arch
    postrotate
       /bin/kill -HUP `cat /var/run/lighttpd/lighttpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
 }

运行 Lighttpd

在 /home/arch/http/www/ 下创建 index.php 文件:

<?php
phpinfo();
?>

启动 Lighttpd daemon:

# /etc/rc.d/lighttpd start

在浏览器里打开 http://localhost/。如果配置成功的话,会显示正确的 PHP 信息。

Posted in Archlinux, lighttpd, PHP | Tagged: , , , | Leave a Comment »