ようこそ!逆襲のニートブログへ

ブログ内検索

最近の記事

はてなブックマーク数

この日記のはてなブックマーク数

カテゴリー

月別アーカイブ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

phpで指定した文字が出現する数をカウントするには? = substr_count関数を使用

PHPで文字の出現回数を数える方法について調べたら、専用の関数が用意されていました。

phpで指定した文字が出現する数をカウントするには?

$text = "あいうえおかきくけこあいうえお";
この$textから「あい」という文字が何個あるかカウントし、結果として2と表示されるようにしたいのですが。

ベストアンサーに選ばれた回答
関数は、substr_count($text, 'あい')
echo substr_count($text, 'あい');
※実際に実験済みです。日本語でも問題ありません。



なるほど、substr_countという関数を使えば、特定の文字列の個数を数えられるのか。
これは便利だ!

PHPマニュアル / substr_count ― 副文字列の出現回数を数える

int substr_count ( string $haystack , string $needle [, int $offset [, int $length ]] )
substr_count() は、文字列 haystack の中での副文字列 needle の出現回数を返します。 needle は英大小文字を区別することに注意してください。
注意: この関数は重なり合う副文字列をカウントしません。



AmazonのBrowseNodeIdの階層の深さを数えるときに使ってみました。

<?php
$path = '/561958/562006/564526/580360/580370/';
$sp = '/';
$cnt = substr_count($path, $sp) - 1;
?>



うまくいきました!(^^)v

XREAでPukiwiki Plus!のエラー表示

XREAPukiwiki Plus!を使っていたら、いつの頃からかPHPのエラー表示が出るようになった。

Warning: putenv() [function.putenv]: Safe Mode warning: Cannot set environment variable 'LC_ALL' - it's not in the allowed list in /virtual/xxx/public_html/wiki/lib/init.php on line 64



解決方法が紹介されていた。
質問箱/275 - Pukiwiki Plus!

Warning: putenv() の対応は、rev1655 で、init.php をコミットしました。



[pukiwiki-plus-i18n] Diff of /trunk/lib/init.php
LineRemovedAdded
76putenv('LC_ALL=' . PO_LANG);if (! ini_get('safe_mode')) putenv('LC_ALL=' . PO_LANG);


lib/init.phpの、この行のコードを修正したら、エラー表示が出なくなった。
エラーが発生した原因は、PHPがセーフモードになっていたことだった。
XREAのPHPは、サーバによってバージョンや設定が違うのだろうが、セーフモード(実行できる関数などが制限される)で動作している。

PukiWiki入門 まとめサイトをつくろう!PukiWiki入門 まとめサイトをつくろう!
(2006/04/13)
増井 雄一郎天野 龍司

商品詳細を見る

CodeIgniter徹底入門

CodeIgniter徹底入門CodeIgniter徹底入門
(2008/06/10)
河合 勝彦鈴木 憲治

商品詳細を見る


CodeIgniterは、ちょっと使ってみたことがあり、使い方が非常にわかりやすいと思いました。
この解説本が出たとき、本屋で立ち読みしてみて、買うかどうか迷って、結局その日は買いませんでした。

CodeIgniterのメーリングリストで、質問によく答えている上級者ユーザーの方でも、この解説本を買って、じっくりと使い方を研究されているようであることを知り、自分も資料として持っていて損はないなと思いました。
CodeIgniterは、オンラインのマニュアルが充実しており、本がなくても良いと思ったけど、じっくりと使い方を学んでみたいと思って解説本を買いました。

フレームワークは使いこなせると、開発の時間が短縮できて重宝します。
CodeIgniterを使いこなして、自分の思い通りにWEBサイトを作れるようになれば、十分に元は取れるな!(^^;

CodeIgniterは外国産のためか、日本の携帯サイト事情があまり考慮されていないように思われます。
携帯サイトを作るときのTipsは、ちょっと情報が少ないかな?

あと、フレームワークとは直接関係ないけど、この本で紹介されていたEclipse+PDT+xdebugの使い方は参考になりました!(^^)v

PHPでファイルをZIP圧縮して、まとめてダウンロードさせる方法

複数のファイルをダウンロードするとき、まとめて1度にダウンロードさせたい。
そこで、複数のファイルをZIP圧縮で1つにする方法を調べてみた。
ZIP圧縮について、まとめてあるサイトがあったのでメモ。

PHP で zip 圧縮
http://winofsql.jp/VA003334/phpVarious060803234456.htm

phpMyAdmin のライブラリを使用してファイルに出力する
phpMyAdmin のライブラリを使用してダウンロードさせる
PEAR の File_Archive を使用してファイルに出力する
PEAR の File_Archive を使用してダウンロードさせる
PEAR の File_Archive を使用してソースコード上のデータをダウンロードさせる
PEAR の File_Archive を使用して個別ファイルを解凍する



いろいろな方法がありますね。
これは便利だ!!!

PHPの絵本 PHPの絵本
(株)アンク (2007/02/28)
翔泳社
この商品の詳細を見る

SQLインジェクション対策

SQLインジェクションについて、朝っぱらから調べた。

ユーザーの入力値をSQL文の一部に入れる場合、SQL文が意図せぬ形にならないように、ユーザーの入力値を加工する必要がある。
=ユーザーの入力値を未加工のまま使うのはダメ。

PHP マニュアル > mysql_real_escape_string
サンプルコードにあったユーザー定義関数 function quote_smart($value) を使えばいいだろう。

【MySQLウォッチ】第27回 MySQL 5.0 および 4.1 にSQLインジェクションのセキュリティ・ホール
PHPのmysql_real_escape_string()関数は、MySQLのmysql_real_escape_string()関数をコール(呼び出し)しているが、元々のMySQLのmysql_real_escape_string()関数自体にバグがあり、SQLインジェクション対応が不十分だったようだ。

■PHP 利用時に Shift_JIS で addslashes() によるエスケープ処理に SQL インジェクション可能な穴

結論から言うと、Shift_JISを素直に使っている限り、addslashes()は駄目(Chris Shiflett氏)、mysql_real_escape_string() は駄目(Ilia Alshanetsky氏)、一部のPrepared Statements すらも駄目(id:jrofbyrsさん)、ということらしいです。


安全な対処方法としては Shift_JIS などの文字の最後のバイトに \ が含まれる可能性のある文字コードを使用しないことです。



1.addslashes()→不十分
2.mysql_real_escape_string()→不十分
3.Prepared Statements→不十分
4.SJISを使わない→OK
ということのようだ。

最近は、EUC-JPよりUTF8を使う機会が多いような気がする。
・UTF8はエンコードの仕組の都合で、EUC-JPよりデータ量が割り増しになるんだったよな?
・携帯用のページは、UTF8→SJISに変換すればOKかな?

addslashes() による SQL 文字列のエスケープ回避問題
↑Shift_JISの場合のSQLインジェクションについて解説してある。

yohgaki's blog addslashesによるエスケープ処理は止めましょう
↑PostgreSQLの場合の話が出ていた。

あと、ご指摘通り、pg_prepare() と pg_execute() によるプリペアードクエリでは問題ありませんでした(文字コードが SJIS の場合でも SQL インジェクションを起こせない)。

PHP 側でこれらの関数が導入されたのは PHP 5.1.0 以降のようですので、それより前のバージョンでは文字コードに SJIS を使用しないようにするしかないように思います。



PREPAREしとけ、ということかな?


IPA セキュア・プログラミング講座 SQL組み立て時の引数チェック
DBIクイックリファレンス Perl-DBI講座
↑プレースホルダ、バインドメカニズムの復習をしておこう。

SELECT f2 FROM table WHERE f1 = ?

上記で使用したクエスチョン( ? )マークをプレースホルダと呼びます。
プレースホルダは、そのままでは値を持っていないので、後で実際の値を結びつけます。
参照される値をバインド値、実際の値との結びつけをバインドと呼びます。



時代は O/R マッピングなのだけどプレースホルダを復習
ユーザーの入力値を加工するのは機械にやらせればいい、ということで、SQL文を安全にするためのDBラッパーが用意されているようだ。
最初からそれを使えば面倒くさくなさそうだ。
(中身がブラックボックスで見えないのが気に入らないなら、コードを読むしかない。)

「サニタイズ言うな」の高木さんのブログにも、エスケープの話がある。
教えて!goo > HTMLに出力するときには、htmlspecialcharsします。
【“SQLインジェクション対策”の続きを読む】

OpenPNE新機能 PNEアウト(外部認証)

OpenPNE開発者の日記に、新しい機能のプランが紹介されていました。

PNEアウト(外部認証)

SNS以外のWebアプリからユーザー認証情報を取得して、ログインチェックを行なう機能のようです。

1) 外部のデータベース
2) XOOPS
3) osCommerce
4) LDAP
上記サービスのアカウントでOpenPNEにログインできる


OpenPNE2.X系でWeb2.0(外部WEBサービスとつなぐ)をドンドンやっていこうと思っている



おおー、これは便利そうだ!
OpenPNE側もAPIを用意しており、外部WEBサービスに対してSNS内のデータを引き渡せるから、シームレスな相互乗り入れができるかな?

PHPでデザインパターンを学ぶ

Javaを勉強して、オブジェクト指向プログラミングを学んでから、デザインパターンも理解しなければいけないと思ってた。
Javaでデザインパターンを解説している本で良さそうなのがあったが、ちょっと読んだだけで、十分勉強していなかった。

PHPプログラミングの解説サイトである「Do you PHP ?」を見て、PHPでもデザインパターンの勉強ができそうだから、そのうちやろうと思っていた。

1年以上も放ったらかしにしてたけど、PHPでデザインパターンを解説した本が出た!

PHPによるデザインパターン入門 PHPによるデザインパターン入門
下岡 秀幸、道端 良 他 (2006/11)
秀和システム
この商品の詳細を見る


著者の下岡さんは、「Do you PHP ?」サイトの作者さんでもあった。
なるほど、それでこの本を出版と。

ちょっと立ち読みしてみたが、サンプルコードも載っていて分かりやすいそうだったので、この本なら最後まで読んで理解できそうだ。

デザインパターンの知識をガンガン活用したい!
よし!2007年の目標はオブジェクト指向プログラミングの完全マスター&徹底活用だ!!!

増補改訂版Java言語で学ぶデザインパターン入門 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩 (2004/06/19)
ソフトバンククリエイティブ
この商品の詳細を見る


増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
結城 浩 (2006/03/21)
ソフトバンククリエイティブ
この商品の詳細を見る

【“PHPでデザインパターンを学ぶ”の続きを読む】

symfony入門(1)

symfony入門(1):symfonyで始めるPHPフレームワーク

CodeZineにsymfonyの解説記事があった。メモメモ

本連載では、PHP上で動作するアプリケーションフレームワークsymfony」で、アプリケーション開発を行う方法を紹介します。
導入の今回は、まずsymfonyの特徴と環境設定手順、「Hello, World」アプリケーションの作成までを紹介します。
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としているので、symfonyに興味のある方はこれを機にぜひ導入してみてください。



PHPを使ったWebアプリケーション開発の手法の一つとして、知っておいて損はないだろう。

よし、勉強してみよ☆\(^o^)/

PHPフレームワーク symfony 1.0 beta 1 発表!

PHPフレームワークsymfonyが、バージョン1.0のベータ版になりました。

Announcing symfony 1.0 beta 1

It's been a long time since the latest beta release (0.7.1915), and even a longer time since the last stable release (0.6.3). Today, we are happy to announce the release of symfony 1.0 Beta 1, and this is a major step towards the version 1.0, which should come shortly.



最後の安定しているリリース(0.6.3)以来、そして最新のベータ版(0.7.1915)以来の長期、長い時間でした。
今日、私たちは、symfony 1.0ベータ1のリリースを発表することができてうれしいです。
そして、これはバージョン1.0への第一歩であり、それはもうじき完成します。

XREA に OpenPNE を設置する

レンタルWebサーバの「XREA」に、オープンソースのSNS「OpenPNE」をインストールしてみます。

設置の注意点をまとめてみました。

1. OpenPNE2.0をダウンロードする。
http://docs.openpne.jp/?%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9

(最新のOpenPNE2.2系ではなく、とりあえずバグフィックスの落ち着いていそうな2.0系を使ってみる。)

2. OpenPNE セットアップガイドに従い、セットアップする。
http://tejimaya.org/openpne/docs/2_0/OpenPNE_Setup.html

3. 画像が表示されないという、XREA固有のエラーが出た。


ココからが本メモのメインの内容

OpenPNEをカスタマイズして、画像が表示されない状況を改善する。

Googleで「XREA OpenPNE 画像 エラー」を検索。

OpenPNEをオープンに使うサイト
http://openx.xrea.jp/

↓↓↓これが参考になるだろうか?↓↓↓

画像が表示されない不具合
http://openx.xrea.jp/modules/newbb/viewtopic.php?topic_id=9&forum=2

投稿日時: 2006-3-14 10:10 管理人

投稿: 15 Re: 画像が表示されない不具合
OpenPNE1.8.3(または1.9.2)をXREAサーバにインストールしたときにこの不具合が発生しているようです。

OpenPNE1.8.3では、img.phpで取得する画像を全てキャッシュ経由で表示するように変更しているみたいです。
XREAではセーフモードが有効になっているため、キャッシュファイルが生成されず、そのため画像が表示されなくなっているようですね。

Imgクラスのoutput_img()で、キャッシュがない場合の処理を追加すれば画像は表示されます。

該当箇所 /webapp/lib/img/img.class.phpの166行目

function output_img()を以下で置き換えます。(※修正は自己責任で行ってください。)



function output_img()
{
//キャッシュがある場合
if ($this->config_cache_source_enabled && $this->cache_exists) {
$this->send_content_type();
if ($mtime = filemtime($this->cache_fullpath)) {
// Etag
require_once (DOCUMENT_ROOT.'/webapp/lib/Etag.class.php');
$etag = new Etag($this->cache_filename.$mtime, $mtime);
if ($etag->etagCheck()) {
exit;
}
}

@readfile($this->cache_fullpath);
return true;
}

//キャッシュがない場合
if ($this->src) {
//TODO ディレクトリから取ってくる場合
}
elseif ($this->dbsrc) { //DBからとってくる場合
//リサイズせずに、かつ、形式変換しない場合、
//出力にGD系の関数を使用しない(画質が劣化するので)
if ($this->rawImageData && !$this->gdimg_output) {
$this->send_content_type();
echo $this->rawImageData;
return true;
}
elseif ($this->gdimg_output) {
//リサイズ or 形式変換する場合は、GD系の関数で出力
$this->send_content_type();
switch ($this->outputFormat) {
case "jpeg":
case "jpg":
default:
imagejpeg($this->gdimg_output);
break;
case "gif":
imagegif($this->gdimg_output);
break;
case "png":
imagepng($this->gdimg_output);
break;
}

return true;
}
}

return true;
}



ふむふむ、なるほど。
・画像のキャッシュファイルがある場合
・画像のキャッシュファイルがない場合
の判定処理を入れると。

OpenPNE2.0の場合はどうなるだろうか?

↓↓↓

Imgクラスは、
/OpenPNE/webapp/lib/OpenPNE/Img.php
にありました。

169行目に、該当のメソッドがあります。


/**
* 画像を出力
*
* @access public
*/
function output_img()



・画像のキャッシュファイルがない場合は、データベースから画像データを取り出して、出力するようにすべし!
・キャッシュファイルを作らない分だけ処理が遅くなり、サーバに負荷がかかるが、しょうがない。><
・データベースから画像データを取り出す処理は、generate_img()メソッドの処理を真似すればOK。

以上の改変内容をまとめると、output_img()メソッドの内容は以下のようになります。
これでXREAでも、OpenPNE2.0で画像が表示されますね!

function output_img()
{
if ($this->check_cache()) {
//キャッシュがある場合
$this->send_content_type();

if ($mtime = filemtime($this->cache_fullpath)) {
// Etag
require_once 'Etag.php';
$etag = new Etag($this->cache_filename.$mtime, $mtime);
if ($etag->etagCheck()) {
exit;
}
}
@readfile($this->cache_fullpath);
}
else {
//キャッシュがない場合 → DBから取ってくる
$this->raw_img = $this->get_raw_img();
$w = $this->requests['w'];
$h = $this->requests['h'];

// サイズ指定がなく、かつ、形式変換しない場合(GDに変換する必要なし)
if (!$w && !$h && ($this->source_format == $this->output_format)) {
$this->send_content_type();
echo $this->raw_img;
return true;
}
// create a GD image from raw_img
if (!$source_gdimg = imagecreatefromstring($this->raw_img)) {
return false;
}

if ($this->requests['f'] == 'jpg') {
// JPEGの場合、携帯対応
imageinterlace($source_gdimg, 0);
}

//リサイズ
$output_img = $this->resize_img($source_gdimg, $w, $h);

//リサイズした画像をGD系の関数で出力
$this->send_content_type();
switch ($this->output_format) {
case 'jpeg':
case 'jpg':
default:
imagejpeg($output_img, '', $this->jpeg_quality);
break;
case 'gif':
imagegif($output_img);
break;
case 'png':
imagepng($output_img);
break;
}

return true;
}
}



↑ブログにソースコードを貼り付けると、表示したときインデント(字下げ)が反映されてないですね。

ちょっと見づらいかな?

とりあえず、画像が表示されるようになったから良しとするか。
根本的には、Imgクラス自体を作り直す必要があるのかな?

50×50ピクセルとか、小さい画像をリサイズして、表示させる機能がうまく働いていない。

めんどくさいなー、もう。。。
後で修正しよっか。ふぅ~。

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。