Category - PHP

PHP 全部入り

# yum -y install --enablerepo=epel,remi,remi-php73 php php-cli php-common php-gd php-imap php-mbstring php-mysql php-odbc php-pdo php-pear php-pgsql php-process php-snmp php-xml php-xmlrpc php-fpm php-mcrypt

read more

CentOS 6.x PHP7インストール

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum --enablerepo=remi-php70,epel install php php-cli php-devel php-common php-mbstring php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-fpm php-gd php-gmp php-mcrypt php-opcache php-pdo php-xml

# php -v
PHP 7.0.33 (cli) (built: Jan 9 2019 15:08:15) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.33, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans

read more

Laravel composer でライブラリ追加

プロジェクト直下で
$ composer require abraham/twitteroauth

composer.jsonが自動的に編集されて
vendor以下にインストールされる。

read more

Linux メールが使えない場合

メールサーバーでこういうエラーが出てPHPからメールが使えない場合

postfix/sendmail[29587]: fatal: open /etc/postfix/main.cf: Permission denied

コマンドでメールの使用可否状態を確認
# getsebool httpd_can_sendmail
httpd_can_sendmail --> off

このコマンドで状態を変更する
# setsebool -P httpd_can_sendmail on

確認
# getsebool httpd_can_sendmailon
httpd_can_sendmail --> on

read more

FuelPHP1.7をロリポップ上で動作させる

FuelPHP1.7で新規に作成したプロジェクトを、ロリポップにアップロードしたら 500 Internal Server Error 。

プロジェクトインストール時に生成された .htaccess の 「Options +FollowSymLinks -Indexes」をコメントにすれば動作可能。

read more

fuelPHPインストール

一度コマンドラインでインストールして最新版を一括で取得

# curl -sS https://getcomposer.org/installer | php
# ./composer.phar create-project fuel/fuel:dev-1.7/master project_name

project_nameディレクトリ内に一式が入る
project_name/public/index.php にアクセスして確認

read more

mailparse インストール時のエラー

# pecl install mailparse
pecl/mailparse requires PHP extension "mbstring"
No valid packages found

こんなエラーがでたときはこっちでインストールする

# yum install php-pecl-mailparse


read more

Windows Vista にPHP 5.5.8をインストールした後のエラー

windows Vista にPHP 5.5.8をインストールした後のエラー


コンピュータに MSVCR110.dll がないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみてください。

これを解決するには「Visual Studio 2012 Visual C++」をインストールしてみてください。

Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ
vhttp://www.microsoft.com/ja-jp/download/details.aspx?id=30679

read more

Windows Vista にPHP 5.5.8をインストールした後のエラー

windows Vista にPHP 5.5.8をインストールした後のエラー


コンピュータに MSVCR110.dll がないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみてください。

これを解決するには「Visual Studio 2012 Visual C++」をインストールしてみてください。

Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ
vhttp://www.microsoft.com/ja-jp/download/details.aspx?id=30679

read more

PHP magic_quotes_gpc

magic_quotes_gpc はシステムレベルでの設定であるため、php.iniか.htaccessでのみ設定可能。

もしこの2つのファイルが触れない場合

if (get_magic_quotes_gpc()) {
 function stripslashes_gpc(&$value)
 {
   $value = stripslashes($value);
 }
 array_walk_recursive($_GET, 'stripslashes_gpc');
 array_walk_recursive($_POST, 'stripslashes_gpc');
 array_walk_recursive($_COOKIE, 'stripslashes_gpc');
 array_walk_recursive($_REQUEST, 'stripslashes_gpc');
}

read more

全角、半角での分割

$keyword = mb_convert_kana($keyword, 's')
$ary_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY);
foreach( $ary_keyword as $val ){
// 検索条件を設定するコードをここに書く
}


・preg_splitの前に「mb_convert_kana($keyword, 's')」を行い、全角スペースを半角スペースに変換。
・preg_splitの正規表現を「/[\s]+/」にして、1つ以上の連続した半角スペースで分割させる。
・preg_splitで「PREG_SPLIT_NO_EMPTY」を指定して、空文字列以外だけを返すようにする。

read more

phpでmemory_limitを上限なしにする方法

php.ini

memory_limit = -1;

read more

Atom Pub API 画像投稿

function livedoor_img_api($img_url)
{
require_once('HTTP/Request2.php');

$id = ""; /* livedoorID */
$key = ""; /* API Key */
$url = "http://livedoor.blogcms.jp/atom/blog/".$id.'/image';

//$img_dir = dirname(dirname(dirname(dirname(__FILE__)))).DS.'files'.DS;
$imgfile = $img_url;
$created = date('Y-m-d\TH:i:s\Z');
$nonce = pack('H*', sha1(md5(time())));
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$key)));
$wsse =
'UsernameToken Username="'.$id.'", '.
'PasswordDigest="'.$pass_digest.'", '.
'Nonce="'.base64_encode($nonce).'", '.
'Created="'.$created.'"';
$imgdata = file_get_contents($imgfile);
$content_type = image_type_to_mime_type(exif_imagetype($imgfile));
$headers = array(
'X-WSSE: ' . $wsse,
'Content-Type: ' . $content_type,
'Expect:'
);

try{
$req = new HTTP_Request2();
$req->setUrl($url);
$req->setMethod(HTTP_Request2::METHOD_POST);
$req->setHeader($headers);
$req->setBody($imgdata);
$response = $req->send();
$xml = simplexml_load_string($response->getBody());
$src = $xml->content['src'];
$thumbnail = $xml->content['thumbnail'];
} catch (HTTP_Request2_Exception $e) {
die($e->getMessage());
} catch (Exception $e) {
die($e->getMessage());
}

return $src;
}

read more

CentOS6 PHP 5.3.9 openssl エラー解決

こんなエラーがでてコンパイルできない場合
make: *** [ext/openssl/openssl.lo] Error 1

古いバージョンのopenssl 0.98 を入れなおす

wget ftp://ftp.openssl.org/snapshot/openssl-0.9.8-stable-SNAP-20121213.tar.gz
tar xvzf openssl-0.9.8-stable-SNAP-20121213.tar.gz
cd openssl-0.9.8-stable-SNAP-20121213
./config --prefix=/usr/local shared -fPIC
make
make install

./configure --with-libdir=lib64 --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-zlib --with-gd --with-gettext --with-jpeg-dir --with-png-dir --with-iconv-dir=/usr/lib --disable-pdo --with-curl --with-openssl=/usr/local/include
./configure --with-libdir=lib64 --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-zlib --with-gd --with-gettext --with-jpeg-dir --with-png-dir --with-iconv-dir=/usr/lib --disable-pdo --with-curl --with-openssl
make
make install

read more

URL分岐のための正規表現

メモ
if(!preg_match("/^\/s\/(.*?)/", $_SERVER['REQUEST_URI'])){

read more

Zend_DB でPDO接続

/* Configures PDO to execute the 'SET NAMES UTF8;' SQL query just before
any other query. If no query is executed on your page, this will not be
executed. */
$pdoParams = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');

$params = array(
'host' => 'localhost',
'username' => 'username',
'password' => 'password',
'dbname' => 'dbname',
'driver_options' => $pdoParams
);

try {
$db = Zend_Db::factory('PDO_MYSQL', $params);
Zend_Db_Table_Abstract::setDefaultAdapter($db);
} catch (Exception $e) {
exit($e->getMessage());
}

Zend_Registry::set('dbAdapter', $db);

read more

Windows PHP 5.4 PEARインストール

go-pear.phar をダウンロードして実行

http://pear.php.net/go-pear.phar

php go-pear.phar

read more

PHP 日付 差 取得の例

DateTime形式から現在日時までの差(日)


  /**
   * 日の差分を返す
   *
   * @param datetime
   * @return day
   */
  function getDiffDay($time){
    
    list($y, $m, $d, $hour, $min, $sec) = $this->getSepTimePart($time);
    $regist1 = mktime($hour, $min, $sec ,$m, $d, $y);
    
    // 現在
    $regist2 = mktime(date('H'),date('i'), date('s'), date('m'),date('d'),date('Y'));
    
    // 日の差分
    $time_difference = $regist2-$regist1;
    return floor($time_difference/(3600*24));
  }

  /**
   * 日付をばらす
   *
   * @param datetime
   * @return y, m, d, h, i, s
   */
  function getSepTimePart($time){
    
    // 日時を前半と後半に分割
    $t = explode(" ", $time);
    // 前半を分割
    $d1 = explode("-", $t[0]);
    // 後半を分割
    $d2 = explode(":", $t[1]);
    
    return array(
      sprintf("%04d", $d1[0]),
      sprintf("%01d", $d1[1]),
      sprintf("%01d", $d1[2]),
      sprintf("%01d", $d2[0]),
      sprintf("%01d", $d2[1]),
      sprintf("%01d", $d2[2])
      );
  }

read more

WordPress WPtouch 画面からはみ出る場合

wptouch/themes/default/style.css

内でページ内のdivの幅を制限することである程度は回避可能

例)
.post div{
max-width:240px;
}

read more

WordPress WPtouch

固定ページ、記事の背景が白くならず タイトルの部分で城が終わる場合は

<div style="clear: both;"></div>をいちばん下に入れる

read more

WordPress PEARライブラリが利用できるプラグイン

WP-Pears-1.0

http://www.belive.jp/archives/wp-pears-1_0/

read more

PHP 画像をぼかす

ImagickのblurImageメソッドを利用する

<?php
header('Content-type: image/jpeg');
$image = new Imagick('test.jpg');
$image->blurImage(10,5);
echo $image;
?>

適応前
im.jpg

適応後
b.jpg

read more

WordPress php include


$dir = dirname(dirname(dirname(dirname(__FILE__))));
include($dir ."/xxx.php");

wp_content

read more

WordPress 自動改行を無効にする

PS Disable Auto Formatting プラグインを利用する

http://www.web-strategy.jp/wp_plugin/ps_disable_auto_formatting/

read more

WordPress バナー管理

WP Bannerize
http://wordpress.org/extend/plugins/wp-bannerize/

コード埋め込みでバナー表示
<?php if(function_exists( 'wp_bannerize' )) wp_bannerize(); ?>

read more

Ethna用Smarty

こんな関数が必要
ないとforce compileする羽目に

/**
* Extracts the filter name from the given callback
*
* @param callback $function
* @return string
*/
function _get_filter_name($function)
{
if (is_array($function)) {
$_class_name = (is_object($function[0]) ?
get_class($function[0]) : $function[0]);
return $_class_name . '_' . $function[1];
}
else {
return $function;
}
}

read more

WordPress Ktai Style 外部リンク

外部サイトへのリンクの際に 直接リンクを張るようにする

テーマ/functions.php に追加

function ks_direct_external_link($link_html, $href, $label) {
return '<a href="' . attribute_escape($href) . '">' . $label . '</a>';
}
add_filter('ktai_external_link', 'ks_direct_external_link', 90, 3);

read more

PHP ライブラリパスを追加

libディレクトリを作ってその中のライブラリをrequireで利用したい場合

こんな風にすると楽

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . PATH_SEPARATOR . dirname(__FILE__) .'/lib');

require_once('Net/UserAgent/Mobile.php');

read more

WordPress 自動改行を防ぐプラグイン

http://www.web-strategy.jp/wp_plugin/ps_disable_auto_formatting/#lang_jp

編集の途中でbrやpが入るのを防ぐプラグイン

read more

Qmail PHP起動時のエラー

こんなエラーが出た場合

May 10 02:21:45 sv qmail: 1336584105.449605 status: local 1/120 remote 0/120
May 10 02:21:45 sv qmail: 1336584105.450309 delivery 48316: deferral: Uh-oh:_.qmail_has_prog_delivery_but_has_x_bit_set._(#4.7.0)/

qmailアカウントで起動しているシェルの権限に+wがあるのが原因。
644にパーミッションを変更する。

read more

WordPress Ktai Style ログイン

WordpressのKetai Styleで会員制サイトを作成する場合
WP-Membersとかと組み合わせる
Ktai Styleでは独自のセッションで実装されており、セッションの引き継ぎが難しい場合もあり。

携帯のIDを利用したカスタマイズの例

index.php に追加
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . PATH_SEPARATOR . dirname(__FILE__) .'/lib');
libフォルダを作って Net_UseAgent_Mobileをインストール

ktai-style/ktai_style.php の画面出力前に追加
 output_add_rewrite_var('guid', 'ON');

ktai-style/admin/class.php に追加
-------
public function setHash($dir, $id, $val){
// ファイルを書き出すディレクトリ
$_dir = $dir;
// 既にファイルが存在すれば削除する
@unlink("{$_dir}/{$id}");
// 書き出し
$fp = fopen("{$_dir}/{$id}", "a+");
if (!(empty($fp))) {
flock($fp, LOCK_EX);
fputs($fp, $val);
flock($fp, LOCK_UN);
fclose($fp);
}
}


/**
* SESpreIDをファイル名として hashの値を取得するメソッド
*/
public function getHash($dir, $id){
return file_get_contents("{$dir}/{$id}");
}
-------

セッション開始メソッドの最後に端末IDをファイル名としてsidを書き出すように
public function set_session($user_id, $sid = NULL, $data = NULL, $remember = false) {
# 略
   // 端末IDを取得してhashの値を取得
   $agent = Net_UserAgent_Mobile::singleton();

   $this->setHash(dirname(dirname(__FILE__)) . '/tmp' , $agent->getUID(), $sid);
}

-------
セッション取得メソッドの最後に追加
public function get_sid() {
# 略
   if (! is_string($sid) && ! is_numeric($sid)) {
      // 端末IDを取得してhashの値を取得
      $agent = Net_UserAgent_Mobile::singleton();
      $sid = $this->getHash(dirname(dirname(__FILE__)) . '/tmp' , $agent->getUID());
   }
}

sidを引き継げます。
携帯端末IDをそのまま利用するのではなく、内部で文字列を足す等の処理を行ったほうがいいです。

read more

WordPress KtaiStyle 携帯でのログインエラー

Fatal error: Call to private method KtaiStyle_Admin::set_auth_cookie() from context '' in /wp-content/plugins/ktai-style/admin/pluggable-override.php on line 53

こんなエラーが出た場合

kati-style/admin/class.php 内の set_auth_cookieメソッドをpublicにする

変更前) private function set_auth_cookie($user_id, $remember = false, $secure = false) {

変更後) public function set_auth_cookie($user_id, $remember = false, $secure = false) {

read more

WordPress  the_excerpt

the_excerpt()

投稿の「抜粋」の内容を出力。
抜粋は管理画面で設定。

read more

WordPress カテゴリ以下の投稿を取得

カテゴリ以下の投稿取得時に実行されるSQL

cat=7 の場合


SELECT term_taxonomy_id
FROM wp_term_taxonomy
WHERE taxonomy = 'category'
AND term_id IN (7)

SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = 'category' AND t.term_id = 7 LIMIT 1

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (7) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

read more

Apacheのエラー

こんなエラーが出た場合

Syntax error on line 238 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: symbol gzdopen, version libmysqlclient_15 not defined in file libmysqlclient.so.15 with link time reference

PHPを再インストール

read more

WordPress お問い合わせフォーム

フォーム入力→メール送信を実装するプラグイン

Contact Form 7
http://contactform7.com/

使い方説明
http://www.seotemplate.biz/blog/wordpress-plug/883/

read more

WordPress Ktai-style リンクのエラー

KtaiStyleでモバイル用に変換しているサイトで、メニューなどサイト内リンクにも関わらず
ページ遷移後に「サイトが移動しました(303エラー)」と表示されるケースがある場合


末尾の「/」があるかないか

WPの設定で末尾に「/」 が入っている場合はaタグに入力するURLにも「/」を加えていないとリダイレクト扱いになってしまう

フルパスでリンクを記述して解決

read more

Zend Optimizer インストール

Zend Optimizerとは、Zend社によって開発されたPHPアプリケーションの実行速度を高速化させるソフトウェアのことで、Zend.comより無償でダウンロードすることができます。

http://www.zend.co.jp/product/zendoptimizer.html
http://www.zend.com/en/downloads/

eAcceleratorと同時に利用できます。

Linuxの場合はアーカイブダウンロード後に、PHPのバージョンに該当するZendOptimizer.soをphp.iniに指定するだけ。

・記述のフォーマット
 zend_extension=

・記述の例
 [Zend]
 zend_optimizer.optimization_level=15
 zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/ZendOptimizer.so"

確認
# php -v
PHP 5.2.9 (cli) (built: Jan 7 2012 02:36:11)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies

read more

WordPress 会員制サイト ログインしているか判定


//インクルードされたphpファイルでは必要な場合もあり。
global $user_identity;

if( is_user_logged_in()) ){
    // ログイン時の処理
}

read more

Wordpress 記事投稿

PHP内で記事を投稿させる場合

$wpdb->postsだけでなく、カテゴリ指定の$wpdb->term_relationshipsにもデータが必要。

テーブルへのデータ登録は

global $wpdb;

$wpdb->insert( テーブル名,  カラムと値の配列 ); で行う。

read more

WordPress Exec-php

デフォルトでは管理者権限でのみ実行可能。
すべてのユーザーで実行する場合は

plugin/exec-php/include/runtime.php のfilter_user_contentメソッド内の権限チェックをコメントに


function filter_user_content($content)
{
global $post;
/*
// check whether the article author is allowed to execute PHP code
if (!isset($post) || !isset($post->post_author))
return $content;
$poster = new WP_User($post->post_author);
if (!$poster->has_cap(ExecPhp_CAPABILITY_EXECUTE_ARTICLES))
return $content;
*/
return $this->eval_php($content);
}

read more

Google Ajax Search API]画像 をPHPから利用する

// 検索文字列の設定
$url_string = "熊田曜子";
// urlエンコード
$url_string = urlencode($url_string);
$url = "http://ajax.googleapis.com/ajax/services/search/images";
$url = $url."?v=1.0";
$url = $url."&q=".$url_string;

// 結果取得
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($ch);
curl_close($ch);

echo $body;

curlでなくともfile_get_contentsメソッドでもOK。

APIで利用できる引数は
https://developers.google.com/web-search/docs/reference?hl=ja#_intro_fonje

read more

WordPress 会員制サイト

プラグイン WP-Membersを使用。
http://hijiriworld.com/web/wordpress-wp-members/

日本語化
http://hijiriworld.com/web/wordpress-wp-members-ja/

登録フォームを任意のものに変更する場合は
form内に name="a" value="register" を持たせること。

wp-members/wp-members-core.php 参照

read more

ミリ秒から緯度経度60進数変換

DMS形式
・度/分/秒.秒表記(度/分/ミリ秒表記) 秒の表現は10進
35/39/15.152(35/39/15152) 139/45/27.932(139/45/27932)
・ミリ秒換算
128355152 503127932
ミリ秒単位→度単位  3600000で割る

read more

WordPress 会員制サイト

プラグイン WP-Membersを使用。

登録後のメッセージ等はWP-Membersのプラグイン管理で。

http://hijiriworld.com/web/wordpress-wp-members/

read more

Wordpressの投稿、固定ページ内でPHPを実行する

Exec-PHPというプラグインをインストールすると

が利用できる。

read more

PHP 5.2.17 インストール

デフォルトで PHP 5.1.6の場合

キーのインストール

# wget http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
# rpm --import RPM-GPG-KEY-jlitka


レポジトリファイルの作成
# vi /etc/yum.repos.d/utterramblings.repo

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
#使用するときだけ1に設定する
#enabled=1
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

インストール
# yum --enablerepo=utterramblings install php

確認
# php -v
PHP 5.2.17 (cli) (built: Sep 1 2011 17:22:41)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies

read more

phpでCronを書き換える

ユーザー単位のcronは/var/spool/cron/ にユーザー名で保存されてるから
ここを書き換えればいい。

しかし、パーミッションが600とか644じゃないと動かない。
cron BAD FILE MODE

権限あたりが面倒なので
どこか一時的な場所に書き出して /var/spool/cron/以下にコピーするのがいいみたい。
コピー先にあらかじめファイルを作っておき、パーミッションを600にしておく。
上書きしてもパーミッションは引き継がれるため。

read more

デバッグ用メソッド

 // デバッグ用メソッド
 function trace($str){
  $_dir = "/home/~/log/";
  //$log_file = $_dir . date('Y-m-d') .'.log';
  
  $_date = date('Y-m-d');
  $_d = explode('-', $_date);
  
  if(!opendir("{$_dir}/{$_d[0]}")) mkdir("{$_dir}/{$_d[0]}", 0777);
  //if(!opendir("{$_dir}/{$_d[0]}/{$_d[1]}")) mkdir("{$_dir}/{$_d[0]}/{$_d[1]}", 0777);
  //$log_file = $_dir."{$_d[0]}" .'/'."{$_d[1]}".'/'.$_date .'.log';
  $log_file = $_dir."{$_d[0]}" .'/'.$_date .'.log';
  
  $fp = fopen($log_file, "a+");
  if (!(empty($fp))) {
   flock($fp, LOCK_EX);
   fputs($fp, date('H:i:s').' : ');
   fputs($fp, $str);
   fputs($fp, "\n\n");
   flock($fp, LOCK_UN);
   fclose($fp);
  }
 }

read more

yum install php-eaccelerator

レポジトリのインストール
wget http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm
rpm -Uvh epel-release-6-5.noarch.rpm

wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5.rpm

php-eacceleratorを確認後、インストール
yum list "php-eaccelerator*"
yum install php-eaccelerator
php -v
ls /etc/php.d/

eaccelerator.ini内の値を書き換え
eaccelerator.shm_size = "32"

read more

PHP内で処理時間を設ける場合

// 開始時間
$start_time=microtime(true);

//メイン処理

// 終了時間
$end_time=microtime(true);

// 処理時間
$syori_zikan=$end_time - $start_time;

// 60秒たってたら終わりにする
if(intval($syori_zikan)>60) exit;

read more

PHP アクセスした端末を判別する

  function getDevice()
  {
    $carrier = "";
    if(array_key_exists('HTTP_USER_AGENT',$_SERVER)){
      $ua = $_SERVER['HTTP_USER_AGENT'];
      if(strstr($ua,'DoCoMo')){
        $carrier = 'DOCOMO';
      }elseif(strstr($ua,'J-PHONE') || strstr($ua,'Vodafone') || strstr($ua, 'SoftBank') || strstr($ua, 'MOT')){
        $carrier = 'SOFTBANK';
      }elseif(strstr($ua,'UP.Browser') || strstr($ua,'KDDI')){
        $carrier = 'AU';
      }elseif(strstr($ua,'iPad')){
        $carrier = 'IPAD';
      }elseif(strstr($ua,'iPhone')){
        $carrier = 'IPHONE';
      }elseif(strstr($ua,'Android')){
        $carrier = 'ANDROID';
      }else{
        $carrier = 'PC';
      }
    }else{
      $carrier = 'PC';
    }
    return $carrier;
  }

read more

PHP 時刻の比較

YYYY-MM-DD hh:mm:ss の書式の2つの日時を比較して差を分で返却するメソッド

function compareTime($date1, $date2) {
  
  // 日時を前半と後半に分割
  $t1 = explode(" ", $date1);
  // 前半を分割
  $d1 = explode("-", $t1[0]);
  // 後半を分割
  $d2 = explode(":", $t1[1]);
    
  // 日時を前半と後半に分割
  $t2 = explode(" ", $date2);
  // 前半を分割
  $d3 = explode("-", $t2[0]);
  // 後半を分割
  $d4 = explode(":", $t2[1]);
  
        // hour  minute  sec    month  day    year
  $dt1 = mktime($d2[0], $d2[1], $d2[2], $d1[1], $d1[2], $d1[0]);
  $dt2 = mktime($d4[0], $d4[1], $d4[2], $d3[1], $d3[2], $d3[0]);
  $diff = $dt1 - $dt2;
  
  return ceil($diff/60); // 60で割って分で返却
}

read more

Services_Amazonのエラー

Amazon returned invalid HTTP response code 400

こんなエラーコードが帰ってくる場合

サーバーの時計がずれていることが原因かもしれません

read more

PHPデバッグ用メソッド

function trace($str){

$log_file = PATH_TO_LOG_DIR . date('Y-m-d') . '.log';
$fp = fopen($log_file , "a+");

if (!(empty($fp))) {
flock($fp, LOCK_EX);
fputs($fp, date("Y-m-d H:i:s")."\n");
fputs($fp, $str."\n");
flock($fp, LOCK_UN);
fclose($fp);
}
}

trace(文字列);  でログを出力。
ちょっとしたデバッグ用に

read more

phpMyAdminでレコードの更新、削除、DUMPができない場合

# chmod 777 -R /var/lib/php/session/

セッション書き込みディレクトリに書き込めない場合に動作不良が起こるようです。

read more

PHP jsonインストール

# yum install php-devel php-pear
# yum install -y glibc glibc.i386 gcc
# yum install -y automake autoconf
# yum install -y libtool
# yum install -y gcc-c++
# pecl install json
# cd /etc/php.d/
# ls
# touch json.ini
# vi json.ini

extension=json.so を記述

# apachectl restart
# exit

json_encode が利用できる

read more

VPSでのimagickインストール

環境整備
# yum install -y glibc glibc.i386 gcc
# yum install -y automake autoconf
# yum install -y libtool
# yum install -y gcc-c++

Imagemagickのインストール
# yum install ImageMagick
# yum -y install ImageMagick-devel

imagickのインストール
# pecl install imagick


You should add "extension=imagick.so" to php.ini
メッセージ確認後、php.iniに"extension=imagick.so"を追加

read more

VPSでのhttpd.conf設定

php_admin_flag safe_mode Off
php_admin_value open_basedir none

include や require を 制限なくni利用するため

read more

Ethna formで入力チェックを行う場合

'type' => VAR_TYPE_STRING,
'custom' => 'checkMailaddress',

typeを必ず指定しておくこと

read more

MySQL FULLTEXT + Ngram

MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について

http://www.tatamilab.jp/rnd/archives/000390.html

Perl , PHP のN-gram変換用モジュール配布中

read more

Smarty explode

{assign var="new_array" value=","|explode:$moto_array}

{assign var="new_array" value="<>"|explode:$item}

read more

Ethna validate で個別にメッセージを取得したい場合

フォームの各項目を取得
$controller =& $this->backend->getController();
$array = $controller->getActionForm();

エラーメッセージのリスト:$this->ae->getErrorList()


foreach ($this->ae->getErrorList() as $error) {
// 項目名
echo $array->form[$error['name']]['name'];
// エラーメッセージ
echo $error['object'];
}

cf.Ethna_ActionError.php

read more

phpでの画像情報取得

$tmpPath : ローカル内の画像ファイルへのパス

$file_info = getimagesize($tmpPath);
print_r($file_info);

こんな風に出力される
Array ( [0] => 120 [1] => 90 [2] => 2 [3] => width="120" height="90" [bits] => 8 [channels] => 3 [mime] => image/jpeg )

read more

Ethna Smarty関数内での設定ファイル内容の取得

Ethna外でのfunctionからEthnaの設定ファイルを取得する場合

$ctl = $GLOBALS['_Ethna_controller'];
$config = $ctl->getConfig();
$config->get('xxx');

これでconfig内容が取得できます

read more

sh: /sendmail: No such file or directory

PHP でPEAR Mail を使ってこんなエラーが出た場合。

sh: /sendmail: No such file or directory


「sendmail」を使わないようにする
$mail_object =& Mail::factory('sendmail', $params);
$mail_object->send($recipients, $headers, $body);


こんな風に
$mail_object =& Mail::factory('mail');
$mail_object->send($recipients, $headers, $body);

read more

PHP XML解析

// xmlファイルへのパス
$top_xml_file = PATH TO XML FILE;
// ファイル内容を取得
$contents = file_get_contents($top_xml_file);

// やりかた1
$xml = simplexml_load_string($contents);
print_r($xml);

// やりかた2
$xml_parser=xml_parser_create();
xml_parse_into_struct($xml_parser,$contents,$vals);
xml_parser_free($xml_parser);
print_r($vals);

// やりかた3
$options = array('complexType' => 'array');
$Unserializer =& new XML_Unserializer($options);
$Unserializer->setOption('parseAttributes', true);
$status = $Unserializer->unserialize($contents);
$data = $Unserializer->getUnserializedData();
print_r($data);

read more

mb_send_mail 使用例

//言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("EUC-JP");

//日本語メール送信
$to = "to@xxxx.com";
$subject = "タイトル";
$body = "本文";
$from = "from@yyy.com";

mb_send_mail($to,$subject,$body,"From:".$from);

read more

Zend/Http/Response.phpのエラー

こんなエラーが出てZend_Http_Clientでデータが取得できない場合

Warning: gzuncompress(): data error in Zend/Http/Response.php on line 601

Zend/Http/Response.php の 601行あたりをこんな風に修正する

/**
* Decode a zlib deflated message (when Content-encoding = deflate)
*
* Currently requires PHP with zlib support
*
* @param string $body
* @return string
*/
public static function decodeDeflate($body)
{
if (! function_exists('gzuncompress')) {
require_once 'Zend/Http/Exception.php';
throw new Zend_Http_Exception('Unable to decode deflated response ' .
'body: perhaps the zlib extension is not loaded?');
}

//return gzuncompress($body);
// ↑をコメントにしてここから下の部分を書き加える
$result = gzinflate($body);
if($result){
return $result;
}else{
return gzuncompress($body);
}
}

これでOK

read more

PHP ファイルアップロード

php.ini 内で以下の値を大きめに設定

memory_limit 32M
post_max_size 8M
upload_max_filesize 5M

こんな風に設定されているところを変える。
記述がない場合はphpinfo();で確認する。

read more

PHP コマンド実行時のエラー

$com = "コマンド";
$output=array();
$ret=null;
exec ( $com, $output, $ret );

$ret に 127 が入って実行できない場合

$com = "コマンド >> test.log 2>&1";

こんな風にしてエラーログを出力するようにして再実行。

read more

Amazon 携帯用リンク

http://www.amazon.co.jp/gp/aw/rd.html?ie=UTF8&dl=1&uid=NULLGWDOCOMO&lc=msn&at=【アソシエイトタグ】&a=【ASIN】&url=%2Fgp%2Faw%2Fd.html

read more

PHP 5.3.2 インストール

# tar xvzf php-5.3.2.tgz
# cd php-5.3.2
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-zlib --with-gd --with-gettext --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-iconv=/usr/local --disable-pdo --with-openssl --with-curl
# make
# make install

PDOもインストール
アーカイブ展開ディレクトリ内にあるソースをコンパイル

# cd php-5.3.2/ext/pdo
# phpize
# ./configure
# make
# make install

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files: /usr/local/include/php/
Installing PDO headers: /usr/local/include/php/ext/pdo/

# cd php-5.3.2/ext/pdo_mysql
# phpize
MySQLインストールディレクトリを指定してコンパイル
# ./configure --with-pdo-mysql=/usr/local/mysql/
# make
# make install

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/

php.ini に追加
extension_dir=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/
extension=pdo.so
extension=pdo_mysql.so

確認
# php -m
[PHP Modules]
Core
ctype
curl
date
dom
ereg
fileinfo
filter
gd
gettext
hash
iconv
json
libxml
mbstring
mysql
openssl
pcre
PDO
pdo_mysql
Phar
posix
Reflection
session
SimpleXML
SPL
SQLite
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

read more

PHPで楽天ジャンル一覧を取得する

楽天ジャンル取得APIを使ってPHPで楽天のジャンル一覧を取得してみます。

require_once "XML/Unserializer.php";


getData(0);

// ジャンルデータ取得&解析
function getData( $id ){

$url = 'http://api.rakuten.co.jp/rws/2.0/rest?developerId=[楽天API dev id]&operation=GenreSearch&version=2007-04-11&genreId='.$id;

$options = array( 'complexType' => 'array' );
$xmldoc = join("",file($url));
$Unserializer =& new XML_Unserializer($options);
$Unserializer->setOption('parseAttributes', true);
$status = $Unserializer->unserialize($xmldoc);

$data = $Unserializer->getUnserializedData();

if(is_array($data['Body']['genreSearch:GenreSearch']['child'] )){
foreach($data['Body']['genreSearch:GenreSearch']['child'] as $k=>$v){
//print_r($v);
switch ($v['genreLevel']) {
case 1:
break;
case 2:
echo "  └";
break;
case 3:
echo "   └";
break;
case 4:
echo "    └";
break;
case 5:
echo "     └";
break;
default:
break;
}
//echo mb_convert_encoding($v['genreName'] , 'SJIS', auto) ."(" . $v['genreId'] .")\n";
echo $v['genreName'] ."(" . $v['genreId'] .")\n";
// ジャンルIDを引数として自分自身を呼び出す
if($v['genreId']){
getData($v['genreId']);
}
}
}
}


こんな風に階層で表示されればOK

CD・DVD・楽器(101240)
  └DVD(101354)
   └洋画(101355)
    └ファミリー(101364)
    └サスペンス・ミステリー(101365)
    └ラブストーリー(101366)
    └ヒューマン(101368)
    └SF(101369)
    └戦争(101359)
    └アクション(101361)
    └西部劇(101362)
    └コメディー(101363)
    └ホラー(101360)
    └名画・クラシック(101358)
    └ヨーロッパ(101357)
    └青春(507984)
    └スポーツ(507985)
    └ファンタジー(507986)
    └ギャング・マフィア(507987)
    └法廷ドラマ(507988)
    └ミュージカル(507989)
    └史劇(507990)
    └ヒーロー(507991)
    └動物(507992)
    └ドキュメンタリー(507993)
    └バラエティー(507994)
    └その他(101951)
   └アジア(400007)
    └ファミリー(400008)
    └サスペンス・ミステリー(400009)
    └ラブストーリー(400010)
    └ヒューマン(400011)

read more

imagick インストール


wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar xvzf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make install
yum install php-devel
yum install php-pear

wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download
tar xvzf re2c-0.13.5.tar.gz
cd re2c-0.13.5
./configure
make
make install

yum -y install ImageMagick-devel

pecl install imagick

php.ini へ追加
extension=imagick.so

read more

auではFORMの際にSJISで送られてくる

http://www.tatamilab.jp/rnd/archives/000382.html
http://www.au.kddi.com/ezfactory/tec/spec/4_2.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1321605808

auのフォームはSJISで送られてくる
UTF-8対応と公表しているドコモはもちろんSoftBankも、ページの表示がUTF-8の場合はそのフォームから送られてくるクエリーもUTF-8でしたが、auはなんとページの表示がUTF-8だろうと、そのフォームに入力した文字列はSJISで送られてくることがわかりました。新旧8機種試して全てそうだったのでauはそういう仕様なのかなと思います。

===========================================

Synfomyのような文字コードがUTF-8で内部で何度も文字コード変換を行っているフレームワークを使って携帯向けサイトを作成する場合は要注意

read more

pear install メモ

[root@localhost html]# pear install Services_JSON
downloading Services_JSON-1.0.2.tgz ...
Starting to download Services_JSON-1.0.2.tgz (8,582 bytes)
.....done: 8,582 bytes
install ok: channel://pear.php.net/Services_JSON-1.0.2
[root@localhost html]# pear install XML_Serializer-beta
downloading XML_Serializer-0.20.0.tgz ...
Starting to download XML_Serializer-0.20.0.tgz (40,245 bytes)
...........done: 40,245 bytes
downloading XML_Parser-1.3.2.tgz ...
Starting to download XML_Parser-1.3.2.tgz (16,260 bytes)
...done: 16,260 bytes
install ok: channel://pear.php.net/XML_Parser-1.3.2
install ok: channel://pear.php.net/XML_Serializer-0.20.0
[root@localhost html]# pear install -a Services_Amazon-beta
WARNING: "pear/HTTP_Request" is deprecated in favor of "pear/HTTP_Request2"
WARNING: "pear/Net_URL" is deprecated in favor of "pear/Net_URL2"
WARNING: "pear/HTTP_Request" is deprecated in favor of "pear/HTTP_Request2"
downloading Services_Amazon-0.8.0.tgz ...
Starting to download Services_Amazon-0.8.0.tgz (20,992 bytes)
........done: 20,992 bytes
downloading HTTP_Request-1.4.4.tgz ...
Starting to download HTTP_Request-1.4.4.tgz (17,109 bytes)
...done: 17,109 bytes
downloading Cache-1.5.5.tgz ...
Starting to download Cache-1.5.5.tgz (31,296 bytes)
...done: 31,296 bytes
downloading Net_URL-1.0.15.tgz ...
Starting to download Net_URL-1.0.15.tgz (6,303 bytes)
...done: 6,303 bytes
downloading Net_Socket-1.0.9.tgz ...
Starting to download Net_Socket-1.0.9.tgz (5,173 bytes)
...done: 5,173 bytes
install ok: channel://pear.php.net/Cache-1.5.5
install ok: channel://pear.php.net/Net_URL-1.0.15
install ok: channel://pear.php.net/Net_Socket-1.0.9
install ok: channel://pear.php.net/HTTP_Request-1.4.4
install ok: channel://pear.php.net/Services_Amazon-0.8.0

read more

Ethna session_id の長さ設定

lib/Ethna/class/Ethna_Util.php

lib\Ethna\class\Ethna_Util.php(554): * @param int $length ハッシュ値の長さ(~64)
lib\Ethna\class\Ethna_Util.php(557): function getRandom($length = 64)
lib\Ethna\class\Ethna_Util.php(600): if ($length < 64) {

この値を変えて設定できるみたいです

session.hash_bits_per_character ではできなかった


ここ!
lib/Ethna/class/Ethna_Session.php
/**
* セッションを開始する
*
* @access public
* @param int $lifetime セッション有効期間(秒単位, 0ならセッションクッキー)
* @return bool true:正常終了 false:エラー
*/
function start($lifetime = 0, $anonymous = false)
{
if ($this->session_start) {
// we need this?
$_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['__anonymous__'] = $anonymous;
return true;
}

if (is_null($lifetime)) {
ini_set('session.use_cookies', 0);
} else {
ini_set('session.use_cookies', 1);
}

session_set_cookie_params($lifetime);
session_id(Ethna_Util::getRandom());
session_start();
$_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['__anonymous__'] = $anonymous;
$this->session_start = true;

return true;
}

lib/Ethna/class/Ethna_Util.php のgetRandom()メソッドでセッションIDを指定しているため、
このメソッドのランダム文字列生成の長さを変更することでセッションIDの長さを決められる

read more

PHP session,name session.value

PHPSESSID=ncghbpslquskns2oh8tjteth87

こんなのをPHPコードの中で出したい場合

echo SID;

read more

PHP セッションの共有

Ethnaで作成したアプリケーションと他のWEBアプリケーションでセッションを共有させたい場合

php.iniの設定
「session.save_path」 の値にEthna側のセッション保存先を合わせる

app/APP_ID_Contlroller.php
var $directory = array(
'tmp' => 'xxx',

lib/Ethna/class/Ethna_Session.php
$this->session_name = "PHPSESSID"; // php.iniに合わせる

read more

PHP 配列の文字コードを一括で変換

配列$data の文字コードをEUC-JPに変換
mb_convert_variables("EUC-JP", "auto", $data);

print_r($data); で確認

read more

Ethna バージョンを指定してのインストール

[root@localhost]# pear install http://pear.ethna.jp/pear/Ethna-2.3.2.tgz
downloading Ethna-2.3.2.tgz ...
Starting to download Ethna-2.3.2.tgz (170,014 bytes)
.....................................done: 170,014 bytes
install ok: channel://pear.ethna.jp/Ethna-2.3.2


# pear install http://pear.ethna.jp/pear/Ethna-x.x.x.tgz

x.x.x がバージョンになるようです。

read more

Ethna インストール

新バージョンが使えるようになったようです

[root@localhost ~]# pear install -a ethna/ethna
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
downloading Ethna-2.5.0.tgz ...
Starting to download Ethna-2.5.0.tgz (241,455 bytes)
..................................................done: 241,455 bytes
downloading Smarty-2.6.26.tgz ...
Starting to download Smarty-2.6.26.tgz (69,294 bytes)
...done: 69,294 bytes
downloading simpletest-1.0.1.tgz ...
Starting to download simpletest-1.0.1.tgz (273,378 bytes)
...done: 273,378 bytes
install ok: channel://pear.ethna.jp/Ethna-2.5.0
install ok: channel://pear.ethna.jp/Smarty-2.6.26
install ok: channel://pear.ethna.jp/simpletest-1.0.1

「-a」オプションで必要なライブラリも一緒にインストール

read more

PHP メール受信後の添付ファイル処理

$params = array();
$params['include_bodies'] = true; //ボディを解析する
$params['decode_bodies'] = true; //ボディをコード変換する
$params['decode_headers'] = true; //ヘッダをコード変換する

$source = stream_get_contents(STDIN);
$decoder =& new Mail_mimeDecode($source);
$structure = $decoder->decode($params);


$params['decode_bodies'] を忘れると添付ファイルが正しく保存されません。
要注意。

read more

php 5.3.o Warning: strtotime() 解決法

Warning: strtotime() [function.strtotime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in ・・・

こんなエラーが出た場合の解決法

php.ini に以下の記述を追加する
date.timezone = Asia/Tokyo

php.ini はphp.ini-development をコピーして作成


その他の変更点
[mbstring]
; language for internal character representation.
; http://php.net/mbstring.language
mbstring.language = Japanese

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
mbstring.internal_encoding = EUC-JP

; http input encoding.
; http://php.net/mbstring.http-input
mbstring.http_input = auto

; http output encoding. mb_output_handler must be
; registered as output buffer to function
; http://php.net/mbstring.http-output
;mbstring.http_output = SJIS

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = Off

; automatic encoding detection order.
; auto means
; http://php.net/mbstring.detect-order
mbstring.detect_order = auto

; substitute_character used when character cannot be converted
; one from another
; http://php.net/mbstring.substitute-character
mbstring.substitute_character = none;

read more

Fatal error: Class ‘DOMDocument’ not found

Fatal error: Class ‘DOMDocument’ not found

DOMがPHPに組み込まれていない → php を –with-dom のオプションを付けてコンパイルする


php-xmlにphp-domも組み込まれているそうなので

# yum install php-xml

でもいいようです

read more

parse_w3cdtfのエラー解消

MagpieRS/rss_utils.inc 内の
parse_w3cdtfメソッドでこんなエラーが出る場合

PHP Warning: gmmktime() expects parameter 3 to be long, string given in /home/alice/sample/php/rss/rss_utils.inc on line 35

28行目を書き換えます
$pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";

$pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";

これで解決

read more

Amazon APIエラー時

Services_Amazon でこんな風にエラーが出てしまう場合

PEAR_Error Object
(
[error_message_prefix] =>
[mode] => 1
[level] => 1024
[code] =>
[message] => Amazon returned invalid HTTP response code 400
[userinfo] =>
[backtrace] => Array
(
[0] => Array
(
[file] => /usr/local/lib/php/PEAR.php
[line] => 566
[function] => PEAR_Error
[class] => PEAR_Error
[type] => ->
[args] => Array
(
[0] => Amazon returned invalid HTTP response code 400
[1] =>
[2] => 1
[3] => 1024
[4] =>
)

)

[1] => Array
(
[file] => /usr/local/lib/php/Services/Amazon.php
[line] => 1249
[function] => raiseError
[class] => PEAR
[object] => Services_Amazon Object

サーバーの時間が間違っている場合にこうなってしまうようです。
ntpdateで時間を合わせて再度

read more

php メモリ不足の場合

PHP Fatal error: Allowed memory size of xxxxxxx bytes exhausted
のエラーが出た場合

1. php.iniのmemory_limitを増やして再起動

2. スクリプトの最初に ini_set("memory_limit","256M"); と記述

read more

Amazon Product Advertising API への対応

2009/08/15 よりAmazon API の使い方が変わるようです。

今までの Amazon Associates Web Service 4.0 は Access Key ID のみで利用できたのですが、
新しいバージョンでは Secret Access Key も必要になります。

08/18 時点ではまだ旧APIが使えておりました。
変更点は以下の通り。

Amazon Product Advertising API への対応

pear install XML_Serializer-beta
pear install -a Services_Amazon-beta


// 以下は 2009年8月15日 以降利用できなくなります
require_once 'Services/AmazonECS4.php';
$amazon = new Services_AmazonECS4(ACCESS_KEY_ID);
$amazon->ItemSearch(...);

// Product Advertising API に対応した Services_Amazon クラスを利用します
require_once 'Services/Amazon.php';
$amazon = new Services_Amazon(ACCESS_KEY_ID, SECRET_ACCESS_KEY);
$amazon->ItemSearch(...); // ← 今まで通りのインタフェースが使えます

// アソシエイトタグは第3引数に指定します
$amazon = new Services_Amazon(ACCESS_KEY_ID, SECRET_ACCESS_KEY, 'youramazon-22');

SECRET_ACCESS_KEYは
http://aws.amazon.com/ で確認

read more

php_mecab インストール

wget http://page2.xrea.jp/pub/php_mecab-0.2.0.tgz
tar xvzf php_mecab-0.2.0.tgz
cd php_mecab-0.2.0
phpize
./configure --with-php-config=/usr/local/bin/php-config --with-mecab=/usr/bin/mecab-config
make
make install

最後にこんなのが出る
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20060613/

php.iniの最後に追加
extension_dir="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=mecab.so
mecab.default_dicdir="/usr/lib/mecab/dic/ipadic"

テスト
$str = "麻生内閣は退陣せよ";
$t = new MeCab_Tagger();
$r = explode("\n", $t->parse($str));

print_r($r); で確認

read more

はてなRSS 取得時

はてなキーワードのRSSを取得する際にXML_RSSやsimplexml_load_fileでは403となり取得できなくなっています。
そのためアクセス元を偽装して取得します。

require_once 'Zend/Http/Client.php';
require_once 'XML/Unserializer.php';

$url = "http://d.hatena.ne.jp/keywordlist?mode=rss&cname=idol&of=・・・・";

// IE としてアクセス
$client = new Zend_Http_Client($url);
$client->setConfig(array(
'maxredirects' => 5,
'useragent' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'timeout' => 10,
));
$response = $client->request();
if (!$response->isSuccessful()) continue;
// RSSを取得
$content = $response->getBody();

// RSSを配列に変換
$Unserializer =& new XML_Unserializer();
$Unserializer->setOption('parseAttributes', TRUE);
$status = $Unserializer->unserialize($content);
if (!$status) continue;
$res_array = $Unserializer->getUnserializedData();
// itemリストを取得
$items = $res_array['item'];

read more

PHP 画像 サイズ取得

list($width, $height, $type, $attr) = getimagesize("img/flag.jpg");

幅、高さ、画像タイプ、HTMLに貼り付けられるheight=xxx width=xxx

read more

Smarty 税込み金額を表示する

消費税
{$price*0.05|floor}

税込
{$price*1.05|floor}

read more

Softbank 音声ファイル 視聴用コード

clearstatcache();
$local_file_name = '視聴用.3gpへのパス';
header('HTTP/1.1 200 OK');
header('Content-Type: audio/mp4');
header('Cache-Control: no-store');
$size = filesize($local_file_name);
header("Content-Length: $size");
$buf = file_get_contents($local_file_name);
ob_end_clean();
echo $buf;

保存も転送もできない
エラーが出たらファイルサイズを確認

read more

PHP mail MTA 指定

PHPのmail関数でメールが送信できない、ログ上は送信できても届かない場合は
サーバーのMTAの指定が間違っている場合があります。
以下のようにして正しく設定します

# alternatives --config mta

2 プログラムがあり 'mta' を提供します。

選択 コマンド
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail
2 /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

read more

php PATH_SEPARATOR を使用してinclude_pathを追加

カレントディレクトリの「lib」をinclude_pathに追加したい場合

if (!defined('PATH_SEPARATOR')) {
if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') {
define('PATH_SEPARATOR', ':');
} else {
define('PATH_SEPARATOR', ';');
}
}

set_include_path(get_include_path() . PATH_SEPARATOR . './lib');

read more

PDO_MYSQLインストール

# pecl install pdo_mysql でうまくいかない場合のメモ。

php, mysqlをソースからインストールしている場合によく起こります。

symbol lookup error: /usr/local/lib/php/20060613/pdo_mysql.so: undefined symbol: php_pdo_declare_long_constant.

こんなエラーの回避。
まずPHPの再インストール。'--disable-pdo' のオプションをつけてコンパイル。
デフォルトでPDOが有効になっているためうまく入らないようです。
php.iniは昔のままでOKです。

PHPのコンパイルが終わったらPDO, PDO_MYSQLをソースからインストール。
wget http://pecl.php.net/get/PDO-1.0.3.tgz
tar xvzf PDO-1.0.3.tgz
cd PDO-1.0.3
phpize
./configure
make
make install

wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar xvzf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
phpize
./configure --with-pdo-mysql=/usr/local/mysql // mysqlをインストールしたディレクトリ
make
make install

php.iniに
extension=pdo.so
extension=pdo_mysql.so を追加。
php -v でエラーがなければOK。

phpinfo(); で PDO, pdo_mysql の項目があることを確認する。

read more

PHP auto_prepend_file、auto_append_file

PHP実行の際に前後で特定のプログラムを実行してデバッグを行う場合に便利

# .htaccess内に以下のような記述を加えます。
php_value auto_prepend_file /path/to/xxxxx.php
php_value auto_append_file /path/tp/xxxxx.php

var_dump ($_SESSION);
などをページの前後で見たい時に便利

read more

PHP 半角 全角 変換

$str = mb_convert_kana(変換元の変数,オプション,文字エンコーディング);

/* すべて半角に変換 */
$str= mb_convert_kana($str,"rnask","Shift_JIS");
/* すべて全角に変換 */
$str = mb_convert_kana($str,"RNASKV","EUC-JP");

r : 「全角」英字を「半角(ハンカク)」に変換
R : 「半角(ハンカク)」英字を「全角」に変換
n : 「全角」数字を「半角(ハンカク)」に変換
N : 「半角(ハンカク)」数字を「全角」に変換
a : 「全角」英数字を「半角(ハンカク)」に変換
A : 「半角(ハンカク)」英数字を「全角」に変換
s : 「全角」スペースを「半角(ハンカク)」に変換
S : 「半角(ハンカク)」スペースを「全角」に変換
k : 「全角片仮名」を「半角(ハンカク)片仮名」に変換
K : 「半角(ハンカク)片仮名」を「全角片仮名」に変換
h : 「全角ひら仮名」を「半角(ハンカク)片仮名」に変換
H : 「半角(ハンカク)片仮名」を「全角ひら仮名」に変換
c : 「全角かた仮名」を「全角ひら仮名」に変換
C : 「全角ひら仮名」を「全角かた仮名」に変換
V : 濁点付きの文字を一文字に変換。"K","H"と共に使用します。

read more

windows PHP MySQL設定

windowsでphpがmysqlを認識しない場合

php.ini 内のextension_dir が空のことがあります

extension_dir = "C:/php5/ext"

こんな風に書き換えてみる

read more

PHP ダウンロードさせる際のヘッダ追加

こんな風にするといい
$filepath はフルパスで
header( "Date: ".date("D, j M Y G:i:s \\G\\M\\T") );
header( "Last-Modified: ".date("D, j M Y G:i:s \\G\\M\\T",filemtime( $filepath ) ) );

read more

PHPでファイルの絶対パス、ディレクトリ名、拡張子取得

絶対パスを取得
realpath('xxx.php')

ディレクトリ名取得、ファイル名取得、拡張子取得は
pathinfoを書くと配列で取得できる。

$data = pathinfo('test.php');

$data['dirname']; //ディレクトリ名

$data['basename']; //ファイル名

$data['extension']; //拡張子

read more

Smarty|replace関数

Smartyのテンプレート内で文字列のreplaceを行います

<{$var|replace:"検索文字":"置換文字"}>

read more

codeigniter クライアント接続文字エンコードを設定できませんでした

heteml でこんなエラーが出た

char_set が効いてないっぽい
hetemlはMySQL - 4.0.25-standard

system/database/DB_driver.php の 174-186をコメントアウト

/*
if (! $this->db_set_charset($this->char_set, $this->dbcollat))
{
log_message('error', 'Unable to set database connection charset: '.$this->char_set);

if ($this->db_debug)
{
$this->display_error('db_unable_to_set_charset', $this->char_set);
}

return FALSE;
}
*/


これでMySQLが使えるようになった

read more

PHP 短縮構文を使う場合の設定

php.ini
short_open_tag = On

read more

PHP  文字列内に漢字を検出

$string : 文字列

$check = "/[一-龠ヲ-゚]+/u";
$check = mb_convert_encoding($check1, "UTF-8", "auto");

preg_match_all($check , $string, $matches);

read more

PHP Imagick インストール

# pecl install Imagick

最後にこんなのが出るからphp.iniに記述する
You should add "extension=imagick.so" to php.ini


Imagickを使ったサイズ変更の例

$im = new Imagick($pathToJpg);
if($im->getImageHeight()>600){
 $im->resizeImage(600, 600 * $im->getImageHeight()/$im->getImageWidth(), imagick::FILTER_MITCHELL, 1, false);
}
header('Content-type: image/jpeg');
echo $im;

read more

phpPgAdmin 設置

最新版でもデフォルトのままではPostgreSQLに接続できないという不具合があります
以下の二点をお確かめください

phpPgAdmin/conf/config.inc.php 修正
【修正前】
$conf['extra_login_security'] = true;

【修正後】
$conf['extra_login_security'] = false;

phpPgAdmin/libraries/adodb/drivers/adodb-postgres64.inc.phpを編集。
 668行目と669行目をコメントアウト

【修正前】
 if (isset($host[2])) $str .= " sslmode=".adodb_addslashes($host[2]);
 else if (!empty($this->sslmode)) $str .= " sslmode=".$this->sslmode;

【修正後】
 //if (isset($host[2])) $str .= " sslmode=".adodb_addslashes($host[2]);
 //else if (!empty($this->sslmode)) $str .= " sslmode=".$this->sslmode;


read more

Smarty SJISで使う場合

Smarty本家クラス extends 時にデリミタをデフォルトのものと変えておく。
SJISだと判別できない。

こんな感じ

$this->Smarty();
$mydir = dirname(__FILE__);
$this->template_dir = "$mydir/../templates/";
$this->compile_dir = "$mydir/templates_c/";
$this->config_dir = "$mydir/configs/";
$this->cache_dir = "$mydir/cache/";

$this->left_delimiter = '<{';
$this->right_delimiter = '}>';

read more

php-5.2.x コンパイルエラー

make 時のエラー

ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/usr/local/src/php-5.2.3/ext/iconv/iconv.c:2426:
undefined reference to `libiconv_open'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] エラー 1

libiconv をインストールした後に phpのコンパイルオプションに
 --with-iconv=/usr/local

それでもだめなら
/etc/ld.so.conf に /usr/local/lib を追加して ldconfig 後に再コンパイル

read more

CentOS php 5 インストールメモ

yumでインストールするとmecab + Senna でカスタムインストールしたMySQLとうまく連携できなかったためソースからインストール

yum install libjpeg-devel
yum install libpng-devel
yum install gd-devel
yum install freetype-devel

cd php-5.2.6
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-zlib --with-gd --with-gettext --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib

make
make install

read more

CentOS 4.x系からのPHP5へのアップデート

# yum install php php-ldap php-mysql php-pear php-mbstring

Dependencies Resolved

======================================================
Package Arch Version Repository Size
======================================================
Installing:
php i386 4.3.9-3.22.12 update 1.3 M
php-ldap i386 4.3.9-3.22.12 update 36 k
php-mbstring i386 4.3.9-3.22.12 update 922 k
php-mysql i386 4.3.9-3.22.12 update 37 k
php-pear i386 4.3.9-3.22.12 update 481 k
Installing for dependencies:
apr i386 0.9.4-24.9 base 93 k
apr-util i386 0.9.4-22.el4 base 51 k
httpd i386 2.0.52-41.ent.centos4 base 902 k
httpd-suexec i386 2.0.52-41.ent.centos4 base 30 k
mysql i386 4.1.22-2.el4 base 3.1 M
perl-DBI i386 1.40-9 base 466 k

Transaction Summary
=============================================
Install 11 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 7.4 M

CentOS 4.xではPHP4が標準
これをPHP5に変更するためには・・・

vi /etc/yum.repos.d/CentOS-Base.repo

【変更】
#additional packages that extend functionality of existing packages
[centosplus]
enabled=0

enabled=1

#contrib - packages by Centos Users
[contrib] 
enabled=0

enabled=1

【追記】
[dag] 
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1

# yum update php


Running Transaction
Installing: php-common ####################### [ 1/14]
Installing: php-cli ####################### [ 2/14]
Updating : php ####################### [ 3/14]
Updating : php-pear ####################### [ 4/14]
Installing: php-pdo ####################### [ 5/14]
Installing: mysql-libs ####################### [ 6/14]
Updating : php-mbstring ####################### [ 7/14]
Updating : php-mysql ####################### [ 8/14]
Updating : php-ldap ####################### [ 9/14]
Cleanup : php ####################### [10/14]
Cleanup : php-mbstring ####################### [11/14]
Cleanup : php-mysql ####################### [12/14]
Cleanup : php-ldap ####################### [13/14]
Cleanup : php-pear ####################### [14/14]

Dependency Installed: mysql-libs.i386 0:5.0.68-1.el4_6 php-cli.i386 0:5.1.6-3.el4s1.10 php-common.i386 0:5.1.6-3.el4s1.10 php-pdo.i386 0:5.1.6-3.el4s1.10
Updated: php.i386 0:5.1.6-3.el4s1.10
Dependency Updated: php-ldap.i386 0:5.1.6-3.el4s1.10 php-mbstring.i386 0:5.1.6-3.el4s1.10 php-mysql.i386 0:5.1.6-3.el4s1.10 php-pear.noarch 1:1.4.11-1.el4s1.1
Complete!

read more

配列内の値を重複チェック

■説明

array array_count_values ( array input)

array_count_values()は、 配列inputの値をキーとし、

inputにおけるその値の出現回数を値とした 配列を返します。

■例

   $array = array (1, "hello", 1, "world", "hello");

   print_r(array_count_values ($array));

上のプログラムは以下のような結果を出力します。

    Array

    (

       [1] => 2

       [hello] => 2

       [world] => 1

    )

http://www.php.net/manual/ja/function.array-count-values.php

read more

PHP 郵便番号から住所情報を検索するメソッド

http://zip.cgis.biz/ ここで公開されている郵便番号→住所変換のAPIを利用
  /*
  * 郵便番号をAPIに送信して住所情報をもらう
  * @param string $zip
  * @return $address
  * 以下の電文を解析する
  *  <?xml version="1.0" encoding="utf-8" ?>
  * - <ZIP_result>
  *   <result name="ZipSearchXML" />
  *   <result version="1.01" />
  *   <result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1030000" />
  *   <result request_zip_num="1030000" />
  *   <result request_zip_version="none" />
  *   <result result_code="1" />
  *   <result result_zip_num="1030000" />
  *   <result result_zip_version="0" />
  *   <result result_values_count="1" />
  * - <ADDRESS_value>
  *   <value state_kana="トウキョウト" />
  *   <value city_kana="チュウオウク" />
  *   <value address_kana="イカニケイサイガナイバアイ" />
  *   <value company_kana="none" />
  *   <value state="東京都" />
  *   <value city="中央区" />
  *   <value address="以下に掲載がない場合" />
  *   <value company="none" />
  *     </ADDRESS_value>
  *   </ZIP_result>
  */
  function getAddressByZip($zip)
  {
    if(!$zip) return "";
    $zip = str_replace("-","",$zip);
    require_once "XML/Unserializer.php";
    // APIに郵便番号を問い合わせる
    $url = "http://zip.cgis.biz/xml/zip.php?zn={$zip}";
    
    // XMLを解析する
    $options = array('complexType' => 'array');
    $xmldoc = join("",file($url));
    $Unserializer =& new XML_Unserializer($options);
    $Unserializer->setOption('parseAttributes', true);
    $status = $Unserializer->unserialize($xmldoc);
    $data = $Unserializer->getUnserializedData();
    // 結果に住所情報がない場合はエラー
    if(!is_array($data['ADDRESS_value'])) return "";
    // 結果の3階層目を解析して[state=>"東京都"]の形式で配列にして返却する
    $return_array = array();
    foreach($data['ADDRESS_value'] as $k=>$v){
      foreach($v as $k2=>$v2){
        foreach($v2 as $k3=>$v3){
          $return_array[$k3] = mb_convert_encoding($v3,'EUC-JP','UTF-8');
        }
      }
    }
    return $return_array;
   }

read more

Ethna AppObject レコードの $k => $v を取得

$o =& new AppObject($this->backend, key , value);

print_r($o->getNameObject()); で確認してみる

read more

PHP 配列の重複を除く

Value の重複を除く

array_unique(array);

read more

MeCab PHP extension module

http://page2.xrea.jp/#php_mecab
ここから php_mecab-0.2.0.tgz をダウンロードする

tar xvzf php_mecab-0.2.0.tgz
cd php_mecab-0.2.0
./configure --with-php-config=/usr/local/bin/php-config --with-mecab=/usr/bin/mecab-config
make
make install

find / -name mecab.so で探してみる

見つかったところでphp.iniに追加
extension_dir="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=mecab.so
mecab.default_dicdir="/usr/lib/mecab/dic/ipadic"

こんなphpファイルを作ってコマンドで実行
$options = array('-d', '/var/lib/mecab/dic/ipadic');
$t = new MeCab_Tagger($options);
$str = '福田内閣は退陣せよ';
print $t->parse($str);
?>

#php /home/admin/mec.php

福 荐筝・・*,*,*,*,*
田内 ・荅・堺・荅腟膵*,*,*,*
閣 よ・・・筝・・*,*,*,*,*
和 ・荅・堺・荅腟膵*,*,*,*
狄悗擦 蓙・・・筝・・*,*,*,*,*
EOS

こんなのが出てきたらOK


Warning: Module 'mecab' already loaded in Unknown on line 0

Warning: MeCab_Tagger::__construct(): '/var/lib/mecab/dic/ipadic' does not exist or is not readable in /home/admin/mec.php on line 4

Warning: MeCab_Tagger::parse(): first argment seems invalid in /home/admin/mec.php on line 6

こんなエラーが出た場合はmecabの辞書ディレクトリのシンボリックリンクを作成して回避する

# ln -snf /usr/lib/mecab/dic/ipadic/ /var/lib/mecab/dic/ipadic

read more

PEAR MAILのエラー iconv_mime_encode():

PHP Notice:
iconv_mime_encode(): Detected an illegal character in input string in
path-to/ib/Mail_Mime/mime.php on line 885 PHP Fatal error:
Cannot use object of type PEAR_Error as array in
path-to/lib/Mail.php on line 106

fromアドレスがおかしい場合が考えられます

read more

eAccelerator インストール

PHP高速化モジュールのひとつ。

# wget http://bart.eaccelerator.net/source/0.9.5.2/eaccelerator-0.9.5.2.zip
# unzip eaccelerator-0.9.5.2.zip
# cd eaccelerator-0.9.5.2
# phpize
# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/bin/php-config
# make
# make install

/usr/local/lib/php/extensions/no-debug-non-zts-20060613/に「eaccelerator.so」ができる

php.ini に以下の記述を追加する

[eaccelerator]
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size = "32"
eaccelerator.cache_dir = "/home/admin/php/cache/eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.check_mtime = "1"
eaccelerator.debug = "0"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.keys = "shm_and_disk"
eaccelerator.sessions = "shm_and_disk"
eaccelerator.content = "shm_and_disk"

Apacheを再起動してエラーなく起動できればOK
phpinfo();内にeAcceleratorの情報があればOK

read more

携帯端末情報取得メソッド

$Date = date('Y-m-d H:i:s');
$r = get_term_info();

echo "Date:$Date";
echo "キャリア:$r[0]";
echo "機種:$r[1]";
echo "端末番号:$r[2]";
echo "UID:$r[3]";

if($r[0] == 'DoCoMo') echo "GUID:$r[5]";

  // 機種名・固体識別番号取得
  function get_term_info() {
   $cary = '';
   $model = '';
   $devid = '';
   $ser = '';
   $icc = '';
   $docomo_guid = '';
   $user_agent = explode("/",$_SERVER['HTTP_USER_AGENT']);
  
  
  //docomo
  if ($user_agent[0] == 'DoCoMo') {
    # DoCoMo
    if (preg_match('/^1\..$/', $user_agent[1])) {
    # ブラウザバージョン 1.0
    $model = $user_agent[2];
    $devid = '';
    $ser = preg_replace('/^ser(.+)/','\\1',$user_agent[4]);
    $icc = '';
  } elseif (preg_match('/^2\..\s(.+?)\(c.*?;ser(.+?)[\s;]icc(.+?)\)/', $user_agent[1])) {
    # ブラウザバージョン 2.0(FOMA)
    $model = preg_replace('/^2\..\s(.+?)\(c.*?;ser(.+?)[\s;]icc(.+?)\)/','\\1',$user_agent[1]);
    $ser = preg_replace('/^2\..\s(.+?)\(c.*?;ser(.+?)[\s;]icc(.+?)\)/','\\2',$user_agent[1]);
    $icc = preg_replace('/^2\..\s(.+?)\(c.*?;ser(.+?)[\s;]icc(.+?)\)/','\\3',$user_agent[1]);
  }
    $docomo_guid = $_SERVER['HTTP_X_DCMGUID'];
    $cary = 'DoCoMo';
  }
  
  //au
  elseif (preg_match("/KDDI/",$user_agent[0]) or ($user_agent[0] == 'UP.Browser')) {
    # au(旧機種)
    $model = $user_agent[0];//KDDI-SN37 UP.Browser
    //$model = $user_agent[1];//6.2.0.11.1.2(GUI) MMP
    //$model = $user_agent[2];//2.0
    //$model = $_SERVER['HTTP_USER_AGENT'];
  if ($user_agent[0] == 'UP.Browser') {
    $devid = preg_replace('/(.+?)-(.+)/','\\2',$user_agent[1]);
  } elseif (preg_match("/KDDI/",$user_agent[1])) {
    $devid = preg_replace('/^KDDI-(.+?)\sUP(.+)/','\\1',$user_agent[0]);
  }
    $ser = preg_replace('/^(.+?)_t.+/','\\1',$_SERVER['HTTP_X_UP_SUBNO']);
    $icc = $_SERVER['HTTP_X_UP_SUBNO'];
    $cary = 'au';
  }
  
  //sb
  elseif (preg_match("/(J-PHONE)|(Vodafone)|(MOT)|(SoftBank)/",$user_agent[0])) {
    # Vodafone,SoftBank
    $model = preg_replace('/^(.+?)[\s_]*/','\\1',$_SERVER['HTTP_X_JPHONE_MSNAME']);
    if ($model == '') {
      if (preg_match("/SoftBank/",$user_agent[0])) {
        $model = $user_agent[2];
      } else {
        $model = preg_replace('/^(.+?)\s*/','\\1',$user_agent[2]);
      }
    }
    if (preg_match("/J-PHONE/",$user_agent[0])) {
      # 'J-PHONE'ユーザーエージェント
      $ser = preg_replace('/^SN(.+?)\s.+$/','\\1',$user_agent[3]);
    } elseif (preg_match("/Vodafone/",$user_agent[0]) or preg_match("/SoftBank/",$user_agent[0])) {
      # 'Vodafone','SoftBank'ユーザーエージェント
      $ser = preg_replace('/^SN(.+?)\s.+$/','\\1',$user_agent[4]);
    } elseif (preg_match("/MOT/",$user_agent[0])) {
      $ser = '';
    }
    $devid = '';
    $icc = $_SERVER['HTTP_X_JPHONE_UID'];
    $cary = 'SoftBank';
  }
  
  //
  //
  //other
  else {
    $cary = 'PC';
    $model = $user_agent[0].' '.$user_agent[1];
    $devid = '';
    $ser = '';
    $icc = '';
  }
  
  return array($cary,$model,$ser,$icc,$devid,$docomo_guid);
  
  }

read more

Cent OS 5 PHP5.2.5インストール前作業

yum install libxml2-devel
yum install libpng-devel
yum install libjpeg-devel


./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-zlib --with-gd --with-gettext --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-pdo-mysql =/usr/local/mysql

read more

MagpieRSS: RSS for PHP を使用したDMM RSS解析

http://magpierss.sourceforge.net/ で公開されているRSS parser を使ってDMMのRSSを解析しています

require_once('magpie/rss_fetch.inc');
define('MAGPIE_OUTPUT_ENCODING','UTF-8');
define('MAGPIE_CACHE_ON', TRUE);
define('MAGPIE_CACHE_DIR', './cache');   //キャッシュが使えます
define('MAGPIE_CACHE_AGE', 60*60);
define('MAGPIE_FETCH_TIME_OUT', 10);


$url = 'http://www.dmm.com/digital/idol/-/list/=/article=keyword/id=66313,2001/sort=date/rss=create/_jloff=1/';

$rss = fetch_rss($url);
mb_convert_variables("EUC-JP","auto",$rss);
$movieList = $rss->items;

foreach($movieList as $movie){
   // 処理
}

print_r($rss->items); でどんなデータが出てるか確認してみてください。

read more

pear HTML_TagCould インストール

pear install http://catbot.net/src/HTML_TagCloud-0.0.4.tgz

read more

symfony PEAR でインストール

pear channel-discover pear.symfony-project.com
pear install symfony/symfony

read more

PHP 現在日時

echo date('Y-m-d H:i:s');

read more

PHP FeedCreator/feedcreatorによるRSS作成

http://www.bitfolge.de/rsscreator-en.html
様々なフォーマットに対応しているPHPのRSS作成ライブラリ。

これを使ってUTF-8のRSSを作成してみる。
RSS1.0, 0.92 ではデフォルトでISO--が指定されてうまくいかないのでATOMでやってみる。

コードはUTF-8で書く。
include("FeedCreator/feedcreator.class.php");
$rss = new UniversalFeedCreator();
$rss->encoding = 'UTF-8';
$rss->useCached();
$rss->title = "タイトル";
$rss->description = "概要";
$rss->link = "url";
$rss->syndicationURL = "url".$PHP_SELF;

while( DBから取得してきたものをまわす ){

 $item = new FeedItem();
 $item->title = "";
 $item->link = "";
 $item->description = "";
 $item->date = "";
 $item->source = ""
 $item->author = "";

 $rss->addItem($item);

}
//出力
$rss->saveFeed("ATOM", "../index.rdf");

read more

PHP でのディレクトリ指定後のファイル一覧取得

 if ($handle = opendir($dir)) {
   while (false !== ($file = readdir($handle))) {
     echo $file;
   }
   closedir( $handle );
 }

こんな風にするとエラーが出ない

read more

DMMのアフィリエイトID書き換え

PHPの正規表現とリプレイスでやればこんな感じかな?

function replace_link($str) {
 $pattern = '/(<a href=")[^>]+(>[^<]+<\/a>)/';
 preg_match_all($pattern,$str,$matches) ;

 for($i = 0 ;$i < count($matches[0]) ;$i++ ) {
  preg_match_all($pattern,$matches[0][$i],$matches_link) ;
  $link = str_replace($matches_link[1][0],"",$matches[0][$i]);
  $link = str_replace($matches_link[2][0],"",$link);
  $link_array = explode('/',$link);
  $new_link = "";
  for($h=0;$h     $new_link .= $link_array[$h].'/';
  }
  $new_link .= '自分のアフィリエイトID" target="_blank"';
  $replace_link = "$1$new_link$2";
  $matches_r[] = preg_replace($pattern,$replace_link,$matches[0][$i]) ;
 }
 return str_replace($matches[0],$matches_r,$str) ;
}

read more

PHP標準入力からのメール受信

//受信したメールを取得する
$source = file_get_contents("php://stdin");
$decoder = new Mail_mimeDecode($source);
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;

$mailStructure = $decoder->decode($params);

//件名・本文を取り出す
$title = $mailStructure->headers["subject"];
$title = mb_convert_encoding($title,"EUC-JP","JIS");

$body = mb_convert_encoding($mailStructure->body,"EUC-JP","JIS");

mb_convert_encodingでなぜか auto が利かなかった

read more

PHP 配列操作

配列のValueでソートするとき
 asort( $array );

配列を結合する キーを維持する場合
$array = $a + $b;

read more

PHP での画像ダウンロード

$imgURL = "画像URL";

$outputJpgURL = "保存するファイル名";

$img = file_get_contents($imgURL);

$outputResourse = fopen($outputJpgURL,"w");
flock($outputResourse,LOCK_EX);
fwrite($outputResourse,$img);

read more

PHP PEAR Services_Amazonのインストール

# pear upgrade XML_Parser Net_Socket
# pear install XML_Util XML_Serializer-beta
# pear install Net_URL
# pear install HTTP_Request HTTP_Client
# pear install Services_Amazon-0.2.0

read more

php.ini 設定 最終版

php インストール後に php.ini-recommended を php.ini にコピーして以下の部分を編集する

[mbstring]
; language for internal character representation.
mbstring.language = Japanese

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
mbstring.internal_encoding = EUC-JP

; http input encoding.
mbstring.http_input = auto

; http output encoding. mb_output_handler must be
; registered as output buffer to function
;mbstring.http_output = SJIS

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
mbstring.encoding_translation = Off

; automatic encoding detection order.
; auto means
mbstring.detect_order = auto

; substitute_character used when character cannot be converted
; one from another
mbstring.substitute_character = none;

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
;mbstring.func_overload = 0

; enable strict encoding detection.
;mbstring.strict_encoding = Off

read more

PHP  リンクチェック

HTTP::headでレスポンスヘッダのステータスを参照します。

require_once "PEAR.php";
require_once "HTTP.php";

$res = HTTP::head( URL );

$res[response_code] == 200 ならOK


print_r($res) はこんな風になります。
Array
(
[response_code] => 200
[response] => HTTP/1.0 200 OK
[Age] => 475
[Date] => Sun, 23 Sep 2007 08:09:31 GMT
[Content-Length] => 5734
[Content-Type] => image/jpeg
[Server] => Apache
[Last-Modified] => Mon, 04 Dec 2006 06:26:44 GMT
[ETag] => "2ee2d88-2b45-4573bfa4"
)

read more

PHP RSS 解析

はてなキーワードRSS解析の場合
$url = "http://d.hatena.ne.jp/keywordlist?mode=rss&cname=idol";

XML_RSSでシンプルに行う場合

$rss =& new XML_RSS($url);
$rss->parse();

   foreach ($rss->getItems() as $item) {
        print_r($item);
   }


はてなでは標準以外のはてな特有のタグを持ため
xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#"

ここまで解析する場合はsimplexml_load_fileで行ったほうがいいようです

$xml = simplexml_load_file($url);

   foreach ($xml->item as $item) {

     print_r($item);

     $dublin = $item->children("http://purl.org/dc/elements/1.1/");
     print_r($dublin);

     $hatena = $item->children("http://www.hatena.ne.jp/info/xmlns#");
     print_r($hatena);

   }

read more

PHP XML作成 出力

Yahoo ウェブ検索APIのレスポンスのフォーマットでxmlを作る場合

$doc = domxml_new_xmldoc("1.0");
$root = $doc->add_root("ResultSet");
$root->set_attribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
$root->set_attribute("xmlns" , "urn:yahoo:jp:srch");
$root->set_attribute("xsi:schemaLocation" , "urn:yahoo:jp:srch http://api.search.yahoo.co.jp/WebSearchService/V1/WebSearchResponse.xsd");
$root->set_attribute("totalResultsAvailable", $val);
$root->set_attribute("totalResultsReturned" , $val);
$root->set_attribute("firstResultPosition" , $val);

for($i=0;$i   $rows = $root->new_child("Result", "");
  $rows->new_child("Title", $val);
  $rows->new_child("Summary", $val);
  $rows->new_child("Url", $val);
}

注)
PHP Warning: new_child(): unterminated entity reference ・・・

こんなのが出てしまう場合は $val がエンコード・エスケープされていないと思われます

read more

php.ini mb_string 設定

最近ではこのように設定しています

[mbstring]
; language for internal character representation.
mbstring.language = Japanese

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
mbstring.internal_encoding = EUC-JP

; http input encoding.
mbstring.http_input = auto

; http output encoding. mb_output_handler must be
; registered as output buffer to function
;mbstring.http_output = SJIS

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
mbstring.encoding_translation = Off

; automatic encoding detection order.
; auto means
mbstring.detect_order = auto

; substitute_character used when character cannot be converted
; one from another
mbstring.substitute_character = none;

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
;mbstring.func_overload = 0

; enable strict encoding detection.
;mbstring.strict_encoding = Off

read more

PHP HTMLをそのまま出力する場合

print strip_tags( ); でいいようです

Smartyの中からPHPへ変数を渡す場合は
{foreach from=$action.data|smarty:nodefaults item=data}
   {php}print strip_tags($this->_tpl_vars['data']['thumbnail_url']);{/php}
{/foreach}

read more

PHP エラーメッセージ出力をやめる

Notice: Only variable references should be returned by reference in MDB/Common.php on line 415

こんなエラーメッセージを消したい場合、error_reporting(E_ALL);をコメントにする。
もしくはレベルを変えておく。

*Maple,Ethnaの場合

read more

Smarty から PHPへの変数受け渡し

前回の続き
$this->_tpl_vars[Smartyでの変数名] でPHPのほうへ渡せるようです

こんな風に
{foreach from=$action.tags|smarty:nodefaults item=tag}
    {php}print urlencode($this->_tpl_vars['tag']);{/php}
{/foreach}

read more

PHP配列メモ

$tags = "bikini wet girl model swimsuit camera photoshoot outdoors Array Swimsuit Japanese";

これを半角スペースで区切って配列にする場合は
$as = split(" ",$tags);
foreach ($as as $a){
     $this->tags[] = $a;
}

Smartyの受け側では
{foreach from=$action.tags|smarty:nodefaults item=tag}
    {$tag}
{/foreach}

read more

Smarty htmlタグがそのまま表示される場合の対策

{$var|smarty:nodefaults}

こんな風にすれば回避できるようです

read more

Smarty 配列のデバッグ

あんまり慣れてないのか未だにうまくいかないこともある
Mapleで使ってたんだけど

{foreach from=$action.dtoList|smarty:nodefaults item=data}
    {$data.id}
{/foreach}

|smarty:nodefaults がないとうまく出ない場合も・・・

こんなメソッドでデバッグ

{action->getDtoList|var_dump}

{action->getDtoList assign=list}
  {$list|var_dump}
{$action.dtoList|var_dump}

{$action.data|@debug_print_var}

read more

PHP Eclipse 設定

EclipseでPHPでの開発を行うためのプラグインのインストール方法です。
  *画像はクリックすると大きく表示します。

eclipseの「ヘルプ」→「ソフトウェア更新」→「検索およびインストール」 で設定窓を表示します。

「新規リモートサイト」を作成します。

チェックを入れて終了 あとは画面の指示に従ってインストールします。

read more

symfony インストール windows

PHPフレームワークsymfonyのインストールです

pear upgrade PEAR
pear channel-discover pear.symfony-project.com

pear install symfony/symfony-beta
downloading symfony-1.0.0.tgz ...
Starting to download symfony-1.0.0.tgz (1,910,892 bytes)
......................................................................
......................................................................
......................................................................
......................................................................
.........................................done: 1,910,892 bytes
install ok: channel://pear.symfony-project.com/symfony-1.0.0

symfony -V で
symfony version 1.0.0 と表示されればインストール成功

read more

mb_language設定

PHP Fatal error: Call to undefined function mb_language() in xxxx

こんなエラーがでたら
php.ini の extension=php_mbstring.dll を有効にします

php_mbstring.dll 内に mb_language の設定も含まれているそうです

read more

SAJAX

AJAXをシンプルに使うライブラリがリリースされています。
05年末ごろにJavaのクラス内部のメソッドをJavaScriptで呼び出せるAPIがリリースされています。
PHPに限って言えばそんなことができるようです。
Sajax.phpを呼び出した後に関数を定義してやればJavascriptでコールできるようです。

詳しくはサンプルを参照
http://www.modernmethod.com/sajax/

read more

AMP on a USB 設定 追記

httpd.conf に追加

LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/pdrive/www">
AllowOverride All
Order allow,deny
Allow from all
</Directory>

AddDefaultCharset ISO-8859-1 をコメントにする

php.ini

記述追加&変更
include_path=".;/pdrive/php-5.0.3/PEAR;/pdrive/php-5.0.3/PEAR/pear"
extension_dir="/pdrive/php-5.0.3/ext"

コメントを外す
;extension=php_mbstring.dll

記述変更
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
;mbstring.func_overload = 0

read more

AMP on a USB 設定

USBメモリ内に Apache + PHP + MySQL の開発環境を設定することができます。
これで外出先でのデモや開発が容易に行えます。

本家サイトはこちら。
http://www.firepages.com.au/php_usb.htm
   ちなみにこのサイトは数年前にApache + PHP + MySQL を一括でインストールするツールを配布していたサイトでした。 トレードマークのマイケルジャクソンに見覚えがありました。

php_usb というZIPファイルをダウンロードして解凍後、USBメモリにコピーします。
本家サイトどおりにやりました。
ディレクトリ構成はこうなります。

$usb:/
-------------start.bat
-------------pdrive/
------------------------php.ini
------------------------start.php
------------------------apache-2.0.50/
------------------------php-5.0.3/
------------------------mysql/
------------------------www/ *ドキュメントルート
------------------------sess/ *セッションデーターのための空ディレクトリ

私はApache, NySQLはWindowsにインストールしているものをそのままコピーしています。
Apache
C:\Program Files\Apache Group\Apache2以下を USB:\pdrive\apache-2.0.50以下にコピーして
conf ファイルのみ配布されているものに置き換えます。

MySQL
C:\Program Files\MySQL\MySQL Server 5.0以下を USB:\pdrive\mysql以下にコピーしました。

PHP
PHP本家サイトよりphp-5.0.3-Win32.zip をダウンロードして解凍後、USB:\pdrive\php-5.0.3にコピーしました。

これで準備はほぼ完了です。
しかしこのままでは動かなかったのでconfファイルの書き換えが必要でした。
こんな風にしてチェックしてみるといいでしょう。

USB:\pdrive\apache-2.0.50\conf\httpd.conf の56行目
「LoadModule ssl_module modules/mod_ssl.so」をコメントにします。
これはもともとインストールしていたApacheが apache_2.0.51-win32-x86-no_ssl.exe でSSL対応でなかったためと思われます。

またUSB:\pdrive\php.ini も修正していたほうがよさそうです。
「session.save_path = "\\pdrive\\sess"」をコメントに
 *phpMyAdminを使ったときにセッションをこのディレクトリに見に行って失敗していました。
   セッション保存領域は明示的にしないほうがよさそうです。

これが終わったら start.bat をダブルクリックして起動してみましょう。
http://localhost:85/ でブラウザが起動してディレクトリが見えれば成功です。

うまくいかない場合は、start.bat で呼び出されるUSB:\pdrive\start.php 内部をコメントにしたりして試してみてください。
これがUSB内のアプリケーションを制御している大本になっています。

echo "starting MySQL ....\n";
pclose(
popen(
'start pdrive\\mysql\\bin\\mysqld-nt.exe --basedir=/pdrive/mysql --datadir=/pdrive/mysql/data --port=3307 --console --standalone'
,'r' )
);
echo "starting apache....\n";
flush();
pclose(popen('start pdrive\\apache-2.0.50\\bin\\apache.exe','r'));
flush();
sleep(5);
echo 'opening localhost';
exec( 'start http://localhost:85');

read more

PHP5 で YouTube API を使った例

PHP5より実装されたDOM拡張モジュールでYouTube検索APIを使ったコードの例です。
電脳卸の例とは違ったメソッドを使っています。
YouTube API の使い方は http://www.youtube.com/dev_docs をご覧ください。

 //URL
 $request = "http://www.youtube.com/api2_rest";

 //メソッド
 $method ="youtube.videos.list_by_tag";

 $url = $request."?method=$method&dev_id=YouTubeデベロッパーID&tag=検索語(UTF-8)&page=ページ数";

 // 結果を格納する配列
 $aryList = array();
 
 try{
  // YouTubeへリクエストを投げた後、
  // 検索結果のXML文書をパース
  $doc = new domDocument();
  $doc->load($url);
  
  // ルート要素を取得
  $root=$doc->documentElement;
  $results=$root->childNodes;

  // 各Result要素を出力
  foreach($results as $result){

   $items=$result->childNodes;

   // さらに各要素を解析する
   foreach($items as $item){

    $author  = $item->getElementsByTagName('author')->item(0)->textContent;

    $id  = $item->getElementsByTagName('id')->item(0)->textContent;

    $title  = $item->getElementsByTagName('title')->item(0)->textContent;

    $length_seconds = $item->getElementsByTagName('length_seconds')->item(0)->textContent;

    $rating_avg = $item->getElementsByTagName('rating_avg')->item(0)->textContent;

    $rating_count = $item->getElementsByTagName('rating_count')->item(0)->textContent;

    $description = $item->getElementsByTagName('description')->item(0)->textContent;

    $view_count = $item->getElementsByTagName('view_count')->item(0)->textContent;

    $upload_time = $item->getElementsByTagName('upload_time')->item(0)->textContent;

    $tags  = $item->getElementsByTagName('tags')->item(0)->textContent;

    $url  = $item->getElementsByTagName('url')->item(0)->textContent;

    $thumbnail_url = $item->getElementsByTagName('thumbnail_url')->item(0)->textContent;

    $result_array = array(
     "author"     => $author,
     "id"       => $id,
     "title"      => $title,
     "length_seconds" => $length_seconds,
     "rating_avg"   => $rating_avg,
     "rating_count"  => $rating_count,
     "description"   => $description,
     "view_count"   => $view_count,
     "upload_time"   => $upload_time,
     "tags"      => $return_tag,
     "url"       => $url,
     "thumbnail_url"  => $thumbnail_url
    );

    $aryList[]=$result_array;
    
   }
  }

 }catch(DOMException$e){

  print $e->getCode()";
  print .$e->getMessage();

 }

read more

XML_Serializer で 電脳卸APIを使う

電脳卸DWSをPHPで使ってみます。
電脳卸のアカウントをお持ちでない方は↓からどうぞ。

商品無料仕入れ戦隊『電脳卸』

XML_Serializerはここからダウンロードするか pear install --onlyreqdeps XML_Serializer-beta でインストールします。

require_once "XML/Unserializer.php";

$url = "http://webservice.d-064.com/get_tag.php?"
 ."sword=" 検索文字列
 ."&email=" ログインID
 ."&hid=" 販売店ID
 ."&type=" heavy/lite/category(指定されていない場合はlite)
 ."&page=" 表示ページ(指定されていない場合は1)
 ."&sort=" 0:昇順 1:降順(指定されていない場合は0)
 ."&category_id=" カテゴリID   *これはなくてもいいようです

$options = array(  'complexType' => 'array' );

$xmldoc = join("",file($url));

$Unserializer =& new XML_Unserializer($options);
$Unserializer->setOption('parseAttributes', true);
$status = $Unserializer->unserialize($xmldoc);
$data = $Unserializer->getUnserializedData();

print_r( $data );  これで検索結果を確認できます

$data[Details] に商品情報が入っていますので
ページ単位での商品タイトルをデバッグするときは
for($i=0;$i

   echo $data[Details][$i][ProductName];
}
こんな感じでOKです。
配列をそのまま変数に入れてSmartyに落としてやるのがもっとも簡単なようです。

read more

DMM RSS解釈

PHPを覚えたてのころのDMMのサイトジャンル別RSSを読み込んで自分のアフィリエイトIDを付加してHTMLページに落とすというプログラムを組みました。

今だったら、XML/RSS.php とか SimpleXML とか Smarty とか使ってもっとシンプルに組みますけどw
Cashも使って毎度のリクエストは避けたほうがいいですねー

DMMのRSSはちょっと違うからこんな風に強引に組みました。

<?php

//ヘッダはUTF-8
header(" Content-Type: text/html; charset=UTF-8" );

//RSSのURL
$url = "http://www.dmm.co.jp/monthly/alice/-/list/=/sort=date/rss=create/_jloff=1/";

//自分のアフィリエイトID
$id = "dmmのid";

$i = 0;
$_data = null;

//改行とかそういう表示上の都合で後で使う
$flg = 0;
$content_flg = 0;

//RSSを読み込む
if( $_http = fopen( $url, "r" )){

  while( !feof( $_http ) ){
    $_data = fgets( $_http, 1024 );

    if($flg == 1 ){
      //何もしない
      if( substr_count($_data , "item") >0
        || substr_count($_data , "description") >0
        || substr_count($_data , "dc:date") >0
        || substr_count($_data , "dc:creator") >0
        || substr_count($_data , "package") >0
      ){
      
        //タイトルタグを置き換える
      }else if( substr_count($_data , "title") >0 ){
        $title = "";
        $_data = str_replace("<title>", "", $_data);
        $_data = str_replace("</title>", "", $_data);
        $title = $_data;
       
        //リンクがあれば自分のidを付加する
      }else if( substr_count($_data , "link") >0 ){
        $link = "";
        $_data = str_replace("<link>", "", $_data);
        $_data = str_replace("</link>", "", $_data);
        $link = $_data.$id;
        
      //リンク整形
      echo "<table width=800 class=\"maintable\" >";
      echo "<tr><td colspan=2 align=left valign=middle>";
      echo "<a href=\"$link\" target=\"_blank\"><br><b><font style=\"color : blue;\" style=\"font-size:16px\" >$title</font></b></a>";
      echo "</td></tr>";

      //コメントの中に画像が入っているのでこんな風に出す
      }else if( substr_count($_data , "<content:encoded>") >0 ){
        $content_flg = 1;
        $_data = str_replace("<![CDATA[", "", $_data);

        $imgst = strpos($_data , "<img",0);
        $imgend = strpos($_data , "</a>",0);
        $linkimage = substr($_data, $imgst, $imgend);
        
        //リンク元の画像がない場合はNOW PRINTING画像を出す
        if($linkimage == '') $linkimage = "<img src=\"http://yourvideo.heteml.jp/file/printing.jpg\" border=\"0\">";
        echo "<tr><td class=\"maintd\"><a href=\"$link\" target=\"_blank\">$linkimage</a>";

      //以下データ整形&リンクができればIDを付加してリンクする
      }else if( substr_count($_data , "収録時間") >0 ){
        $content_flg = 1;
        $_data = "</td><td align=left>".$_data;
        $_data = str_replace("\">", "$id\">", $_data);
        echo $_data;

      }else if( substr_count($_data , "ムービープレビュー") >0 ){
        $content_flg = 1;
        $_data = "<a href=\"$link\" target=\"_blank\"><b>もっと見る!</b></a></td></tr><tr><td colspan=2 align=center>".$_data;
        echo $_data;

      }else if( substr_count($_data , "</content:encoded>") >0 ){
        $content_flg = 1;
        $_data = str_replace("]]>", "", $_data);
        $_data = $_data."<br><br></td></tr></table><br>";
        echo $_data;

      }else{
        $_data = str_replace("\">", "$id\">", $_data);
         echo $_data;
      }
    }

    if( substr_count($_data , "/image") >0 ) $flg = 1;
    $i++;
  }

  fclose( $_http );
}
?>

read more

こんなフレームワーク見つけた


プロジェクト: Kaede
概要

KaedeはMaple(https://sourceforge.jp/projects/maple/)から派生したWebアプリケーション・フレームワークです。 DIContainerを中心とした高い柔軟性と機能性の実現を目指して開発しています。

DIを重視しているところが特徴なのかな?
PHPのフレームワークではめずらしい
早速使ってみようw

read more

PHP開発支援ツール

・KoebiStudio Expr
PHP、HTMLの開発エディタであ
WEBサイト開発を協力に支援するオール

http://koebi.net/

見た目はおしゃれでいい感じです

ただし・・・

PHP開発時にブレークポイントを指定して実行は可能か?現在、KoebiStudioにはブレークポイント(ステップ実行)や実行時の変数内容の表示など
デバッグに関する機能は実装されていません。
また、これらの機能の実装予定は未定となっています

read more

PHPDOC 生成 Win/Linux

JavaDocみたいにドキュメントを自動生成するツール
本家サイトは http://www.phpdoc.org/

インストール:pear install --alldeps phpdocumentor

タグの書き方は ここ

ドキュメント出力は -t でターゲット指定、-d で出力ディレクトリ指定
phpソースディレクトリまで移動して
phpdoc -t ./ -d ./ が楽

read more

PHPでのメール作成

文字コード変換を忘れないように

$title = mb_convert_encoding( $subject,"ISO-2022-JP","EUC-JP");

$body = mb_convert_encoding( $msg,"ISO-2022-JP","SJIS");

こんな風に記述すること

read more

PHP PDO インストール

Linuxの場合は一発でうまくいく。
Windowsの場合はエラーがでてできないっぽい。 調査中です

[root@localhost root]# pecl install pdo
downloading PDO-1.0.3.tgz ...
Starting to download PDO-1.0.3.tgz (52,613 bytes)
.............done: 52,613 bytes
12 source files, building
running: phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20050922
Zend Extension Api No: 220051025
building in /var/tmp/pear-build-root/PDO-1.0.3
running: /tmp/tmpFBlmMq/PDO-1.0.3/configure
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking whether gcc and cc understand -c and -o together... yes
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for PHP prefix... /usr/local
checking for PHP includes... -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext
checking for PHP extension directory... /usr/local/lib/php/extensions/no-debug-non-zts-20050922
checking for PHP installed headers prefix... /usr/local/include/php
checking for re2c... no
configure: WARNING: You will need re2c 0.9.11 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking whether to enable PDO support... yes, shared
checking for ld used by gcc... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking whether ln -s works... yes
checking how to recognise dependent libraries... pass_all
checking how to run the C preprocessor... gcc -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking the maximum length of command line arguments... 32768
checking command to parse /usr/bin/nm -B output from gcc object... ok
checking for objdir... .libs
checking for ar... ar
checking for ranlib... ranlib
checking for strip... strip
checking if gcc static flag works... yes
checking if gcc supports -fno-rtti -fno-exceptions... yes
checking for gcc option to produce PIC... -fPIC
checking if gcc PIC flag -fPIC works... yes
checking if gcc supports -c -o file.o... yes
checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
checking for ld used by g++... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC
checking if g++ PIC flag -fPIC works... yes
checking if g++ supports -c -o file.o... yes
checking whether the g++ linker (/usr/bin/ld) supports shared libraries... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
configure: creating ./config.status
config.status: creating config.h
running: make
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=compile gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo.c -o pdo.lo
mkdir .libs
gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo.c -fPIC -DPIC -o .libs/pdo.o
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=compile gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_dbh.c -o pdo_dbh.lo
gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_dbh.c -fPIC -DPIC -o .libs/pdo_dbh.o
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=compile gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_stmt.c -o pdo_stmt.lo
gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_stmt.c -fPIC -DPIC -o .libs/pdo_stmt.o
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=compile gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_sql_parser.c -o pdo_sql_parser.lo
gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_sql_parser.c -fPIC -DPIC -o .libs/pdo_sql_parser.o
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=compile gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_sqlstate.c -o pdo_sqlstate.lo
gcc -I. -I/tmp/tmpFBlmMq/PDO-1.0.3 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmpFBlmMq/PDO-1.0.3/pdo_sqlstate.c -fPIC -DPIC -o .libs/pdo_sqlstate.o
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=link gcc -DPHP_ATOM_INC -I/var/tmp/pear-build-root/PDO-1.0.3/include -I/var/tmp/pear-build-root/PDO-1.0.3/main -I/tmp/tmpFBlmMq/PDO-1.0.3 -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -DHAVE_CONFIG_H -g -O2 -o pdo.la -export-dynamic -avoid-version -prefer-pic -module -rpath /var/tmp/pear-build-root/PDO-1.0.3/modules pdo.lo pdo_dbh.lo pdo_stmt.lo pdo_sql_parser.lo pdo_sqlstate.lo
gcc -shared .libs/pdo.o .libs/pdo_dbh.o .libs/pdo_stmt.o .libs/pdo_sql_parser.o .libs/pdo_sqlstate.o -Wl,-soname -Wl,pdo.so -o .libs/pdo.so
creating pdo.la
(cd .libs && rm -f pdo.la && ln -s ../pdo.la pdo.la)
/bin/sh /var/tmp/pear-build-root/PDO-1.0.3/libtool --mode=install cp ./pdo.la /var/tmp/pear-build-root/PDO-1.0.3/modules
cp ./.libs/pdo.so /var/tmp/pear-build-root/PDO-1.0.3/modules/pdo.so
cp ./.libs/pdo.lai /var/tmp/pear-build-root/PDO-1.0.3/modules/pdo.la
PATH="$PATH:/sbin" ldconfig -n /var/tmp/pear-build-root/PDO-1.0.3/modules
----------------------------------------------------------------------
Libraries have been installed in:
/var/tmp/pear-build-root/PDO-1.0.3/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).

running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-PDO-1.0.3" install
Installing shared extensions: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib/php/extensions/no-debug-non-zts-20050922/
Installing header files: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/
Installing PDO headers: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/ext/pdo/
running: find "/var/tmp/pear-build-root/install-PDO-1.0.3" -ls
6782989 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3
16393 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr
49161 4 drwxr-xr-x 4 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local
147465 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib
163854 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib/php
196622 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib/php/extensions
294926 4 drwxr-xr-x 2 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib/php/extensions/no-debug-non-zts-20050922
294927 312 -rwxr-xr-x 1 root root 312033 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/lib/php/extensions/no-debug-non-zts-20050922/pdo.so
344078 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include
442377 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php
458766 4 drwxr-xr-x 3 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/ext
475150 4 drwxr-xr-x 2 root root 4096 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/ext/pdo
475153 4 -rw-r--r-- 1 root root 3016 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/ext/pdo/php_pdo.h
475151 24 -rw-r--r-- 1 root root 23679 11月 2 11:16 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/local/include/php/ext/pdo/php_pdo_driver.h

Build process completed successfully
Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/local/lib/php/extensions/no-debug-non-zts-20050922/pdo.so'
Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/local/include/php/ext/pdo/php_pdo.h'
Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/local/include/php/ext/pdo/php_pdo_driver.h'
install ok: channel://pecl.php.net/PDO-1.0.3
You should add "extension=pdo.so" to php.ini

read more

S2Container.PHP5 インストール

PHP5 はインストールされているものとします

http://s2container.php5.seasar.org/ このページから S2Container-1.1.1.gz をダウンロード

コマンドプロンプトより pear install C:\download\S2Container-1.1.1.gz
のようにアーカイブまでフルパスで指定する

install ok !

read more

PHP での 環境情報取得

indexOf を勝手に定義して使っていますw

function indexOf($haystack, $needle) { 
$pos = strpos($haystack, $needle);
if($pos=="") return -1;
else  return $pos;
} 

$ua = strtoupper($_SERVER["HTTP_USER_AGENT"]);
$os = "";

if (indexOf($ua,"3.1") >= 0) $os = "Windows 3.1";
else if (indexOf( $ua,"95") >= 0) $os = "Windows 95";
else if (indexOf( $ua,"98") >= 0) $os = "Windows 98";
else if (indexOf( $ua,"NT 5.1") >= 0) $os = "Windows Xp";
else if (indexOf( $ua,"NT 5.0") >= 0) $os = "Windows 2000";
else if (indexOf( $ua,"NT 5.0") >= 0) $os = "Windows NT";
else if (indexOf( $ua,"MAC") >= 0) $os = "Macintosh";
else if (indexOf( $ua,"X11") >= 0) $os = "UNIX";
else
{
$os = "不明";
}


$browser = "";

if (indexOf($ua,"SAFARI") >= 0) $browser = "Safari";
else if (indexOf($ua,"OPERA") >= 0) $browser = "Opera";
else if (indexOf($ua,"NETSCAPE") >= 0) $browser = "Netscape";
else if (indexOf($ua,"MSIE") >= 0) $browser = "IE";
else if (indexOf($ua,"FIREFOX") >= 0) $browser = "FireFox";

read more

PHP で XVIII. CURL, Client URL Library 関数 を使う Windows

Windows XP + PHP5

php.ini 内の「extension=php_curl.dll」のコメントを外す
アーカイブ内のlibeay32.dll および ssleay32.dll を C:\WINDOWS\system32 フォルダにコピーする

read more

Pear DB MySQL 文字コードセット

$db = DB::connect($dsn);
if (DB::isError($db)) { die($db->getMessage()); }

この後に
「$db->query('SET NAMES ujis');」 でujis設定します

?charset=ujis では不十分でした
MySQL 5 にアップグレードするときは要注意

read more

symfony インストール

PHPフレームワーク Symfony インストール

pear でインストールします

pear channel-discover pear.phing.info
pear install phing/phing

pear channel-discover pear.symfony-project.com
pear install symfony/symfony

read more

Windows PHPでSQLiteを利用する場合

php.ini に記述追加

extension=php_pdo.dll
extension=php_sqlite.dll

「extension=php_pdo.dll」がデフォルトの記述にない場合があるので要注意

read more

PEAR DB 接続先定義

MySQLのときもPostgreSQLのときも接続先は直書きではなく変数で定義して行ったほうがいいようです

$MYSQL_HOST = 'localhost';
$MYSQL_USER = 'root';
$MYSQL_PASSWORD = 'pass';
$MYSQL_DATABASE = 'dbname';
$MYSQL_PREFIX = '';
$dbType = "mysql";

$dsn = "$dbType://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST/$MYSQL_DATABASE";


// データベースへ接続
$con = DB::connect($dsn);

read more

PHPでのRSS解析

pear XML を使えば非常に簡単です

*朝日新聞のRSSを取得する場合

  require_once("XML/RSS.php");

  // RSSファイルへのURIをコンストラクタの引数に渡す
  $rss =& new XML_RSS("http://www3.asahi.com/rss/index.rdf");

  // RSSファイルをパースする
  $rss->parse();

  // getItemsメソッドを使用して全item要素を取得
  foreach ($rss->getItems() as $item) {
    $title = mb_convert_encoding($item['title'], 'UTF-8', 'auto');
    $link = $item['link'];
    $description = mb_convert_encoding($item['description'], 'UTF-8', 'auto');
  }

read more

ZenCart インストール

PHPでできたオープンソースのショッピングサイト構築ツールZenCartをインストールしてみました
公式ページより最新版アーカイブをダウンロードしてサーバーにアップロード後、
XOOPSのインストールのようにインストール画面に沿って進めます。

*ちなみにWORDファイルをHTMLで保存したものなので見にくいです

ここ

read more

PEAR HTML_Ajax インストール

HTML_Ajax がまだ安定意版ではないようなのでバージョンを指定してインストール

pear install HTML_Ajax-0.4.1

read more

HTTP_Download のインストール

pear upgrade HTTP
pear install Net_URL
pear install Net_Socket
pear install HTTP_Request
pear install HTTP_Client
pear install HTTP_Header
pear install Archive_Zip-0.1.1
pear install System_Command
pear install MIME_Type
pear install HTTP_Download

順番どおりやらないとおこられるようです

read more

Ethna  インストール

PHPフレームワークEthnaにはPEAR:DB Smarty が必要です。

# pear list で確認
入ってなかったらインストール
# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.1 stable
Console_Getopt 1.2 stable
HTML_Template_IT 1.1 stable
Net_UserAgent_Detect 2.0.1 stable
PEAR 1.4.9 stable
XML_Parser 1.2.7 stable
XML_RPC 1.2.2 stable
XML_Serializer 0.18.0 beta
XML_Util 1.1.1 stable

# pear install DB
downloading DB-1.7.6.tar ...
Starting to download DB-1.7.6.tar (-1 bytes)
................................................................................
..................................................................done: 735,232
bytes
install ok: channel://pear.php.net/DB-1.7.6

Smartyは本家 http://smarty.php.net/ から最新の安定板をダウンロードします
# tar xvzf Smarty-2.6.14.tar.gz
展開後、libディレクトリをSmartyの名前にしてinclude_pathにコピー
# cp -R /home/alice/Smarty-2.6.14/libs /usr/local/lib/php/Smarty

Ethna は pear コマンドでインストールします
# pear channel-discover pear.ethna.jp
Adding Channel "pear.ethna.jp" succeeded
Discovery of channel "pear.ethna.jp" succeeded

# pear install ethna/ethna-beta
downloading Ethna-2.2.2006060715.tar ...
Starting to download Ethna-2.2.2006060715.tar (573,440 bytes)
................................................................................
...................................done: 573,440 bytes
install ok: channel://pear.ethna.jp/Ethna-2.2.2006060715

Chnanel Server を経由してインストールしているため、バージョンアップの際にもコマンド一発でアップグレードできます
# pear upgrade ethna/ethna

*Windows, Linuxともに同じようにインストールできました
  windowsの場合はPathに「C:\php\PEAR」を追加

あとはこんな風に追加モジュールをインストール
pear install http://pear.project-p.jp/get/Ethna_Haste-0.9.0.tgz

read more

PHP POSTで受け取った文字列の文字コード変更

フォームから受け取るデータはhtmlと同じSJISになります。
受け取った後に文字コードを変換する作業が必要となります。
SJISからUTF-8に変換する例

foreach ($_POST as $key=>$item) {
if (get_magic_quotes_gpc()) {
$item = stripslashes($item);
}
$item = mb_convert_kana($item, 'KV', 'SJIS');
$_POST[$key] = mb_convert_encoding($item, 'UTF-8', 'SJIS');
 }

Youtube API を使ってリクエストを投げる際などに必要
Googleは単なる文字列の文字コード変更でOK

read more

PHP PEAR :: Package :: XML_Serializer

このパッケージを使うと、配列やオブジェクトのデータをXML形式に変換できます。
その逆にXMLを配列などに変換することも可能です。

[root@localhost root]# pear install XML_Unserializer
No releases available for package "pear.php.net/XML_Unserializer"
Cannot initialize 'XML_Unserializer', invalid or missing package file
Package "XML_Unserializer" is not valid
install failed
[root@localhost root]# pear install XML
No releases available for package "pear.php.net/XML"
Cannot initialize 'XML', invalid or missing package file
Package "XML" is not valid
install failed
[root@localhost root]# pear install --onlyreqdeps XML_Serializer-beta
downloading XML_Serializer-0.18.0.tar ...
Starting to download XML_Serializer-0.18.0.tar (-1 bytes)
.................................done: 154,112 bytes
downloading XML_Util-1.1.1.tar ...
Starting to download XML_Util-1.1.1.tar (-1 bytes)
...done: 48,128 bytes
downloading XML_Parser-1.2.7.tar ...
Starting to download XML_Parser-1.2.7.tar (-1 bytes)
...done: 80,384 bytes
install ok: channel://pear.php.net/XML_Parser-1.2.7
install ok: channel://pear.php.net/XML_Util-1.1.1
install ok: channel://pear.php.net/XML_Serializer-0.18.0

read more

PHP5 インストール windows

WindowsにPHP5をインストールする方法
Apache 2.0.x はインストールされているものとします。

http://jp.php.net/get/php-5.1.4-Win32.zip/from/a/mirror
ここからWindows用バイナリをダウンロード php-5.1.4-Win32.zip

解答後、Cドライブ直下にフォルダ名をphpに変更してコピー

C:\phpフォルダの中を開いてphp5ts.dll をコピーして C\:windows もしくは C\:windows\system32にコピー

C:\php\php.ini-dist を C:\php\php.ini にコピーして編集する
変更箇所
include_path = ".;c:/php/includes;c:/php/pear"
extension_dir = c:\php\ext
extension=php_mbstring.dll のコメントは外しておく
*その他、php_mysql.dll など使用するdllファイルの先頭のコメントを外す

変更箇所
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = Shift_JIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

apache2の設定ファイル httpd.cond を編集
記述追加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# For PHP 5 do something like this
LoadModule php5_module "c:/php/php5apache2.dll"
# configure the path to php.ini
PHPIniDir "C:/php"

Windowsの環境変数 Path に追加 ;C:\php;
Dosプロンプトから php -v コマンドでインストールするPHPのバージョンが表示されればOK

PEARをインストール
Dosプロンプトのまま 
cd C:\php\PEAR
php go-pear.phar
・・・・PEARのインストールが始まります 質問には基本的に全部EnterでOK

インストールが終われば普通にpear コマンドが使えます  例)pear install DB など

Apacheを再起動する
phpinfo();が表示できればOK

*Windowsの場合、IEではinfo.phpが表示されない場合もありますので
 そのときは他ブラウザでもお確かめください。
 

read more

PHP 5 インストール Linux

PHP 5の基本的なインストールです

Red Hat 9 ではコンパイル時にlibxml2のバージョンが古いというエラーがでたのでアップグレード
ftp://xmlsoft.org/libxml2/ で最新版を入手可能する

[root@localhost src]# chmod +x *.rpm
[root@localhost src]# rpm -Uvh libxml2-*
警告: libxml2-2.6.11-1.i386.rpm: V3 DSA signature: NOKEY, key ID de95bc1f
Preparing... ########################################### [100%]
1:libxml2 ########################################### [ 33%]
2:libxml2-devel ########################################### [ 67%]
3:libxml2-python ########################################### [100%]

tar xvzf php-5.1.4.tar.gz
cd php-5.1.4
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-magic-quotes --with-xml --enable-mbregex --enable-mbstring --enable-zend-multibyte --with-mysql=/usr/local/mysql --with-pgsql=/usr/local/pgsql7.4.8 --enable-pear --with-zlib --with-gd --with-gettext --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib
make
make install

httpd.conf 記述確認
AddType application/x-httpd-php .php
LoadModule php5_module modules/libphp5.so
  *おそらく自動的に追加されるはず

iniファイル作成
cp php.ini-dist /usr/local/lib/php.ini

変更箇所
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = Shift_JIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

Apacheを再起動する
info.phpを作成してアクセスできればOK

PHP 5からPearが最初から組み込まれてるのがいいですね~

read more

PHP 月末日取得

取得したい月の翌月の0日 で取得できる

前月の月末日取得の場合

$now_date = date("Ymd", time());
$date = substr($now_date,0,6);

$lastday = mktime(0,0,0,substr($date, 4, 2),0,substr($date, 0, 4));

echo date('y-m-d', $lastday);

read more

PHP getdate()関数

getdate :日付に関する情報を連想配列

seconds ・・・ 秒
minutes ・・・ 分
hours ・・・ 時
mday ・・・ 日
wday ・・・ 数字の曜日、0:日曜日 1:月曜日 など
mon ・・・ 月
year ・・・ 年
yday ・・・ 1月1日からの日にち
weekday ・・・ テキストの曜日、"Sunday" など
month ・・・ テキストの月、"January" など
0 ・・・ 1970年1月1日からの秒数


$d = getdate();
print $d["year"] . "年" . $d["mon"] . "月" . $d["mday"] . "日" . "<br>\n";
foreach ($d as $key => $value) {
print "key => $key : value => $value<br>\n";
}

2006年6月27日

key => seconds : value => 10
key => minutes : value => 12
key => hours : value => 17
key => mday : value => 27
key => wday : value => 2
key => mon : value => 6
key => year : value => 2006
key => yday : value => 177
key => weekday : value => Tuesday
key => month : value => June
key => 0 : value => 1151395930

Array (
[seconds] => 10
[minutes] => 12
[hours] => 17
[mday] => 27
[wday] => 2
[mon] => 6
[year] => 2006
[yday] => 177
[weekday] => Tuesday
[month] => June
[0] => 1151395930
)

read more

PHPでの日付取得

mktime関数を使った例

・本日日付
$date_today = mktime (0, 0, 0, date("m"), date("d"), date("y"));
echo date('y-m-d', $date_today);

06-06-27 という風に日付が取得できます

・昨日日付
$date_yesterday = $date_today - 86400;
echo date('y-m-d', $date_yesterday);

60x60x24 = 86400 で日数を調整します

・n日後
$date = $date_today + 86400 * n;

・n日前
$date = $date_today - 86400 * n;

read more

Amazon 検索用モジュール

作ってみました!

ここをクリック!

Amazon, Yahoo, Google ではAPIが公開されてるから組み合わせ次第で面白いものが作れるかもしれませんな

read more

WEB+DB PRESS vol.33




WEB+DB PRESS Vol.33

エンジニアの価値が決まる「構造化プログラミング」についての特集号です!
それとは別にライブドアのシステム構築の詳細な解説記事もあります。
実際に稼動している大規模システムの構築・運営ノウハウが公開されるなんてまずないですよ!

これを機にぜひ読んでみましょう。

WEB+DB PRESS Vol.33

read more

Mac OSX でのPHP設定

OSXにはApacheとPHPはデフォでインストールされているそうです

コマンドパス:/usr/sbin/apachectl
設定ファイル:/ete/httpd/httpd.conf

LoadModule php4_module
AddModule mod_php4.c
この行のコメントをはずして有効にする

sudo /usr/sbin/apachectl start

Configure Command
'/SourceCache/apache_mod_php/apache_mod_php-17/php/configure' '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--with-apxs' '--with-ldap=/usr' '--with-kerberos=/usr' '--enable-cli' '--with-zlib-dir=/usr' '--enable-trans-sid' '--with-xml' '--enable-exif' '--enable-ftp' '--enable-mbstring' '--enable-mbregex' '--enable-dbx' '--enable-sockets' '--with-iodbc=/usr' '--with-curl=/usr' '--with-config-file-path=/etc' '--sysconfdir=/private/etc'

コンパイルオプションが渋いですね~

read more

PHP checkbox FORM

checkbox の value が分かっていない場合の受け渡し
こんな風にすれば簡単ですね

<form action="check.php">
<input type="checkbox" name="fC[]" value="hoge"> hoge <br>
<input type="checkbox" name="fC[]" value="foo"> foo <br>
<input type="checkbox" name="fC[]" value="bar"> bar <br>
<input type="submit" value="OK">
</form>

check.php
<?php

// 配列 $fC に値が入っています。
// 添え字は 0 から連続で。
// 例えば、hoge と bar をチェックした場合は
// $fC[0] => "hoge" 、 $fC[1] => "bar" となります。

for( $i=0; $i<count($_POST['fC']); $i++ ) {
   print $i ." ::: " . $_POST['fC'][$i]. "<br>\n";
}
?>

read more

Pear DB 更新

//PEARのDBクラス定義を読み込む
require_once('DB.php');

//config ファイルを読み込む
require_once('../config.php');

//接続
$con = DB::connect($dsn);

// 接続に失敗したらエラー表示して終了
if (DB::isError($db)) exit($db->getMessage());

//オートコミットセット
$con->autoCommit();

//sql文作成
$preSql = "INSERT INTO テーブル名 ( カラム名, カラム名 ) VALUES ( ?, ? )";

//プリコンパイル済みステートメント作成
$stmt = $con->prepare($preSql);

//バリュー設定
$data = array( 値, 値 );

//実行
$res = $con->execute($stmt,$data);

//コミット
$con->commit();

//これは本当に必要なのか?
$con->freePrepared($stmt);

//切断
$con->disConnect();

read more

Nucleus ログイン機能を他画面で使う

Nucleus のユーザー機能を自作アプリケーションで使う場合のメモ

NUCLEUS_HOME/nucleus/libs/globalfunctions.phpがすべての動きを制御してる(はず)
この中の action パラメーターのvalueで画面の動きが振り分けられる

index.php は

// This file will generate and return the main page of the site
$CONF = array();
$CONF['Self'] = 'index.php';
include('./config.php');
selector();

これだけ
include('./config.php'); このコードでglobalfunctions.php他、lib以下のクラスを呼び出しているので
ログイン用PHPはconfig.php をコールしつつ
action でlogin を指定して ログインIDとパスワードを渡してやればOK
このあたりはHTMLのソースを見るしかない
基本的にパラメーターさえ分かれば画面の制御は勝手PHP側で可能

ちなみに自作したFORM先のログインPHPは

$CONF = array();
$CONF['Self'] = 'このPHPのファイル名';;
include('./config.php');
header("location: ログイン後の飛び先");
exit;

ログインした場合は echo $member->isLoggedIn(); で1が返る

read more

PHP 4.x インストール

基本的なインストールメモ

http://www.php.net/get/php-4.3.11.tar.bz2/from/a/mirror からバイナリをダウンロード

tar -jxvf php-4.3.11.tar.bz2
cd php-4.3.11

PostgreSQL, MySQL に接続できるようにインストールディレクトリを指定しておく
./configure -with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-mbregex --with-mysql=/usr/local/mysql --with-pgsql=/usr/local/pgsql
make
make install

httpd.conf 記述追加

DirectoryIndexにindex.php を追加
AddType application/x-httpd-php .php を追加
LoadModule php4_module modules/libphp4.so を追加

iniファイル作成
cp php.ini-dist /usr/local/lib/php.ini

変更箇所
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = Shift_JIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

Apacheを再起動する

info.phpを作成してアクセスできればOK
phpinfo();
?>

read more

phpMyAdmin インストール

MySQLの管理ツール phpMyAdmin のインストールです

wget http://jaist.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-2.8.0.4.tar.gz
tar xvzf phpMyAdmin-2.8.0.4.tar.gz
cd phpMyAdmin-2.8.0.4
cp libraries/config.default.php config.inc.php

config.inc.php を作成して下記3点の修正でOK
vi config.inc.php
$cfg['Servers'][$i]['host'] ='localhost' // MySQL hostname or IP address
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = 'password'; // MySQL password (only needed

ブラウザからアクセスできるようにすればすぐに使えます
$cfg['Servers'][$i]['auth_type'] = 'config';  のままBasic認証をかけて使っています

read more

phpPgAdminインストール

PostgreSQLの管理をブラウザから行えるというツールです。PHPでできています。
http://phppgadmin.sourceforge.net/ ここから最新版をダウンロードします

展開後、phpPgAdmin-4.0.1conf/config.inc.php 編集
phpMyAdmin と違ってID,PASSを設定ファイルに書く必要はありません。
編集すべき点はわずか
$conf['servers'][0]['host'] = 'DBサーバーのIPアドレス';
$conf['extra_login_security'] = true;
 ID,PASSにroot,administrator,postgresなどありきたりなものを使っている場合は false にする

基本的にここだけでOKです サーバーにアップロード

例のごとくBasic認証をかけます
Alias /pgadmin/ "/usr/local/phpPgAdmin/"

Options -Indexes FollowSymLinks MultiViews Includes ExecCGI
AcceptPathInfo On
AllowOverride All
Allow from all


これで http://ホスト/pgadmin/ でアクセスできるようになります。

その後、htpasswd -c /usr/local/apache2/conf/.htpasswd ユーザー名
パスワード入力  でパスワードファイル作成
               *ユーザー名、パスワードは任意
/usr/local/phpPgAdmin/に .htaccess ファイル作成

touch .htaccess
vi .htaccess
【記述内容】
AuthType Basic
AuthUserFile /usr/local/apache2/conf/.htpasswd
AuthGroupFile /dev/null
AuthName "Enter password"
Require valid-user

chmod 666 /usr/local/apache2/conf/.htpasswd
/usr/local/apache2/bin/apachectl restart

これで認証がついたphpPgAdminが使えるはずです

read more

php.ini 設定

変更箇所
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = Shift_JIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

mbstringはこのようにしておくのがいいようです
IEでは正常でも他ブラウザで文字化けしてることあり
JavaみたいにStringオブジェクト単位で文字コードを設定して・・・というのはちょっと、、、

/usr/local/lib/php.ini として配置します

read more

nucleusインストール

PHP, MySQLでできたnucleusというブログ
動きは軽快
ブログだけでなく、CMSとしても十分に使えます

これをロリポップサーバーへインストール

http://japan.nucleuscms.org/download.php
ここから最新版をダウンロードします
Nucleus CMS v3.23 の日本語版   nucleus3.23_ja_euc.zip

端末上で解凍後、アップロードします
NUCLEUS_HOME/config.phpのパーミッションを666へ
install.php, install.sql のパーミッションを755にします

そして install.php へブラウザからアクセス。

MySQLの設定を入力するだけでOK
ディレクトリのパスなんかは自動で認識されてます。
インストールボタンを押したら勝手にインストールが始まります。

終わったら install.php, install.sql を削除。
ブラウザから管理画面もしくはブログ画面へアクセス。

エラーがでるときは config.php のパーミッションを444にして再アクセス。

これでOK
ちなみに私のURLは http://drunk.chips.jp/nucleus/

*ソース内部を見るとSQLインジェクションを喰らってしまいそうなところが何箇所かあるんですが大丈夫でしょうか・・・

read more

PHPでのファイルアップロード

アップロード画面HTML
ファイル名 pict でアップ
<html>
<body>
<form action="up.php" method="post" enctype="multipart/form-data" >
<input type="file" name="pict">
<input type="SUBMIT" VALUE=" OK ">
</form>
</body>
</html>

アップ用PHP  
<?php

if (is_uploaded_file($_FILES['pic_t1']['tmp_name'])){

copy($_FILES['pict']['tmp_name'], "aaa.jpg"); //サーバーに「aaa.jpg」の名前でコピーする
chmod('aaa.jpg',0777);

echo "<br>";
echo $_FILES['pic_t1']['name']; //クライアントマシンの元のファイル名
echo "<br>";
echo $_FILES['pic_t1']['type']; //アップロードされたファイルファイルのMIME型
echo "<br>";
echo $_FILES['pic_t1']['size']; //アップロードされたファイルのバイトサイズ
echo "<br>";
echo $_FILES['pic_t1']['tmp_name']; //サーバーにアップ後のテンポラリファイルの名前
echo "<br>";
echo $_FILES['pic_t1']['error']; //エラー

}
?>

read more

Basic 認証

phpMyAdmin インストール
http://www.phpmyadmin.net/home_page/downloads.php
ここから最新版をダウンロードして
phpMyAdmin-2.8.0.4/libraries/config.default.php を
phpMyAdmin-2.8.0.4/config.inc.php にコピーして内部の変数を環境に合わせればOK

しかし phpMyAdmin-2.8.0.4 を Apache の DoccumentRoot以下にそのまま置くのはまずいでしょう

ですから/usr/local/にアップロード後、Aliasを作成後、Basic認証をかけておきました

httpd.conf に記述
Alias /phpmy/ "/usr/local/phpMyAdmin/"

これで http://ホスト/phpmy/ でアクセスできるようになります。

その後、htpasswd -c /usr/local/apache2/conf/.htpasswd ユーザー名
パスワード入力  でパスワードファイル作成
               *ユーザー名、パスワードは任意
/usr/local/phpMyAdmin/に .htaccess ファイル作成

touch .htaccess
vi .htaccess
【記述内容】
AuthType Basic
AuthUserFile /usr/local/apache2/conf/.htpasswd
AuthGroupFile /dev/null
AuthName "Enter password"
Require valid-user

chmod 666 /usr/local/apache2/conf/.htpasswd
/usr/local/apache2/bin/apachectl restart

これで認証がついたphpMyAdminが使えるはずです

read more

Pear DB のエラー

PHP 4.3.10 MySQL - 3.23.58 でPear DB のアップデートをしたらなぜかMySQL DBに接続できなくなった

Fatal error: Call to undefined function: fetchrow() in ・・・

こんな風に

仕方がないから pear DB uninstall で削除後、再度インストール

./configure -with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-mbregex --with-mysql=/usr/local/mysql --with-pgsql=/usr/local/pgsql7.4.6
make
make install


You may want to add: /usr/local/lib/php to your php.ini include_path
[PEAR] DB - installed: 1.6.2
[PEAR] HTTP - already installed: 1.4.0
[PEAR] Mail - already installed: 1.1.3
[PEAR] Net_SMTP - already installed: 1.2.6
[PEAR] Net_Socket - already installed: 1.0.1
[PEAR] XML_Parser - already installed: 1.0.1
[PEAR] XML_RPC - already installed: 1.1.0


よしよし、うまくいった
でもこんなのでいいのかな?

read more

MapServerインストール手順

MapServerは、世界で最も使用されているマルチプラットホームのオープンソースWebGISです。
オリジナルは、1990年代中頃に米国ミネソタ大学とミネソタ天然資源局およびNASAとの共同プロジェクトであるForNetプロジェクト(森林資源管理)で開発され、現在はNASAがスポンサーであるTerraSIPプロジェクトから資金を得てミネソタ大学を中心に世界中の開発者(約20人)で開発が続けられおります。
MapServerはCGIベースのシステムであり、商用パッケージに比べて高機能なシステムではありませんが、通常の地図Webアプリケーションを開発するのに十分な機能をサポートしています。
例えば、ミネソタ天然資源局のHPや、カナダ政府の地図サイト(The Atlas of Canada)では、MapServerを使ってリクレーション、天然資源(森林、鉱物)、環境、社会、経済、歴史等の多彩な地図情報を公開しており、高トラフィックのアクセスに対しても高い信頼性が認められております。
その他、欧米を中心として世界の自治体、政府機関や民間での数多くの利用実績があります。

MapServerの公式HP http://MapServer.gis.umn.edu/

ミネソタ天然資源局のHP http://www.dnr.state.mn.us/maps/index.html

カナダ政府の地図サイト  http://atlas.gc.ca/site/english/index.html

read more

Recent entry

Search

Tag Cloud

Page Top