Home > PHP Archive

PHP Archive

昔のコード

昔のコードってなんでこんなに意味不明なのか。昔って言っても半年ほど前なだけだけど。CakePHPで作った自動ログイン処理が意味不明すぎて理解するのに小一時間以上かかった。
この処理についてブログに書いてなかったけど、実装があまりに泥臭かったからかなぁ?でもまあ、うまく動いてるっぽいのでそのうち整理して書いてもいいな。もっと利口なやつが世の中にはあるはずと思うんだけど、パッと探しても怪しいものしかない気がした。

PHPのフレームワーク
ではまだCakePHPが優勢っぽいしな。
Quictyは「簡単、簡単!」って謳っている割にはインストールがめんどくさすぎる。

以上

CakePHPではまったこと21(DB初期化のテンプレート)

ひさびさにCakePHPをいじると、やっぱり疲れる。
簡単なところではsaveですでにはまる。
ループの中にsaveを入れると、最後のsaveしか実行されない。前にそんなことを書いた気がするけど書いてなかった。そういう時はcreateしとけば良いっぽいけど、なんか違う気もする。


foreach ($names as $name) {
	$data = array('User' => array());
	$data['User']['name'] = $name;
	
	$this->User->save($data);
	$this->User->create();
}

まあ、今回は新しくDBを作成(初期化)するときのテンプレートをメモっておく。

・MySQL(4.x?)の場合


DROP TABLE IF EXISTS users;
CREATE TABLE users (
	id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name CHAR(100) NOT NULL UNIQUE,
	password CHAR(100) NOT NULL,
	nickname CHAR(32),
	profile BLOB,
	confirm INTEGER DEFAULT 0,
	created CHAR(40) DEFAULT NULL,
	modified CHAR(40) DEFAULT NULL
);

テーブルがある場合は最初に削除してる。
idは自動でインクリメントされるように「AUTO_INCREMENT PRIMARY KEY」を指定、createdとmodifiedはCHAR(40)くらいにしとく。

・SQLite(2)の場合


DROP TABLE users;
CREATE TABLE users (
	id INTEGER PRIMARY KEY,
	name CHAR(100) NOT NULL UNIQUE,
	password CHAR(100) NOT NULL,
	nickname CHAR(32) NOT NULL,
	profile BLOB,
	confirm INTEGER DEFAULT 0,
	created DEFAULT NULL,
	modified DEFAULT NULL
);

DROP文にIFが使えない。これを実行したときにusersテーブルがないとエラーが出るけど、まあ気にしない。
idは自動でインクリメントされるように「INTEGER PRIMARY KEY」を指定、createdとmodifiedにCHARとか指定するとうまくいかなかったような・・・。まあ、SQLiteなんで型は適当でいいはず。

以上

PHPトリビアルメモ3(文字列配列)

  • 2008-02-21 (木)
  • PHP

php5(?)では文字列で配列のようにアクセスできるらしい。


$alpha = "abcde";
echo $alpha[1];    // b

だからと言って、


foreach ($alpha as $a) {
   echo $a;
}

みたいなことは無理っぽい。
で、日本語はどうかという。


$hiragana = "あいうえお";
echo $hiragana[1];

ソースをUTF-8にしてもだめだった。

以上

PHPのつまらないこと

phpにはarray_intersect()があるが、なぜかarray_union()がない。
いろいろ見てるとarray_diff()とかarray_merge()とか変なのあるのにarray_union()がない。なんで?
しかし、これらをつかって・・・・・っ!!


function array_union($a, $b) {
    $diff = array_diff($a, $b);
    return array_merge($diff, $b);
}

でいいんじゃね?と思ってたら、ちょっと検索したら


function array_union($a, $b) {
   $union = array_merge($a, $b); // duplicates may still exist
   $union = array_unique($union);
 
   return $union;
}

てあった。確かに!

以上

CakePHPではまったこと20(サニタイズ)

おでこのめがねさえあれば毒餃子問題なんてすぐに解決するだろうに、NH○はいったい何をやっとるのか。

サニタイズっていうとデータをきれいにすることですか。
例えばJavascriptを書き込んだらそれがそのまま動いてしまうような掲示板は恐ろしいです。
そういうわけでタグをはずしたりしないとだめなんです。
でCakePHPにもそういうことをしてくれるSanitizeコンポーネントがあります。
use(‘sanitize’)を呼んどいて、あとはSanitize::clean($data)などのスタティックなメソッドを使えばいいです。
そしたらデータをきれいにしてくれる。
でも、自宅ではうまくいったんですが、サーバにアップロードしてみると文字化けした。ううーむ、よくわからん。

というわけで、WEBぷろぐらま~ システム開発エトセトラさんが紹介されている方法をほぼそのままで利用しています。
これは便利。感謝。

以上

CakePHPではまったこと19(デバッグアウト)

だいぶ軽い話。
データベースへの問い合わせログとかのデバッグ情報がajaxとかだと邪魔、っていう話を前にも書いた。
そんときはcore.phpの値を変えるか出力してるところをコメントアウトしてたけど、邪魔なときだけ消すにはコントローラで


Configure::write("debug", 0);

って書いておけばOK。つまり、


function hoge() {
    ・・・
    ・・・
    $this->set("foo", "bar");
    Configure::write("debug", 0);
}

以上

Yahoo!の形態素解析APIをPHPから使う

そんな話はそこら中にあるでしょうが、まあ念のため。
結果をいただくだけなら大したことないけど、結果の使い方を忘れちゃうので。
ひょっとしたら変なこと、やばいことをしている可能性もありますが。

まずは結果をいただくところ。


/**
 * Yahoo!形態素解析を行う。
 * @param $appid string アプリケーションID
 * @param $text string 解析対象テキスト
 * @param $results string 結果の種類 "ma" or "uniq" or "ma,uniq"
 * @return SimpleXML 結果
 */
function yahoo($appid, $text, $results = "uniq") {
	$data = array("appid" => $appid, "sentence" => $text, "results" => $results);
	
	$response = http_post("http://api.jlp.yahoo.co.jp/MAService/V1/parse", $data);
	if ($response === false) {
		return false;
	} else {
		return simplexml_load_string($response);
	}
}

/**
 * http postを行う。
 * @param $url string URL
 * @param $data array postするデータ。連想配列で渡す。?a=1&b=愛 なら array('a'=>1, 'b'=>'愛')
 * @param $optional_header array 追加で渡したいリクエストヘッダ
 * @return string 結果
 */
function http_post($url, $data, $optional_header = null) {
	$data = http_build_query($data, "", "&");
	
	//header
	$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		"Content-Length: ".strlen($data)
	);
	if (null !== $optional_header) {
		array_push($header, $optional_header);
	}
	$context = array(
		"http" => array(
			"method"  => "POST",
			"header"  => implode("\r\n", $header),
			"content" => $data
		)
	);
	
	return file_get_contents($url, false, stream_context_create($context));
}

yahoo()にappid(Yahoo!デベロッパーなんたらでもらえる)=$appidと解析対象のデータ=$textを渡せばSimpleXMLで結果を返します。$resultsは”uniq”か”ma”を渡すことができて、”uniq”だと形態素がディスティンクトされて(同じものはマージされて)帰ってきます。”ma”ならそんなことせずに返します。まあ、実は両方渡せたり(”ma,uniq”)、ほかにもいろいろパラメータあったりしますがそんなのはめんどくさいので無視です。できるだけ簡単に使いたいんです。
http_post()は特にyahooに特化しているわけではないです。単にpostする関数です。どっかから拾ってきてぱくってきた気がします。

で、結果を使うとき。


$xml = yahoo("xxxxxx", "特にyahooに特化しているわけではないです。単にpostする関数です。どっかから拾ってきてぱくってきた気がします。", "ma");
foreach ($xml->ma_result->word_list->word as $word) {  // "uniq"にしたときは$xml->uniq_result
        // ma_resultの下にあるword_listのさらに下にwordがいっぱいぶら下がってます。
	$words[] = (string)$word->surface;  // 形態素はsurfaceです。「特化」とか「いる」とか「関数」とかそんなん。
	if ($word->pos == "名詞") {
                // 品詞はposに入っています。
                // 形容詞,形容動詞,感動詞,副詞,連体詞,接続詞,接頭辞,接尾辞,名詞,動詞,助詞,助動詞,特殊
                // があります。
		$meishi[] = (string)$word->surface;
	}
}

投げっぱなしですが・・・・

以上

疲れてピヨッた

目から血が出てデビルマンな今日この頃、piyo apiでもう一個なんかを作った。
Piyoで相性診断
これからは愛だぜ愛。愛がすべてさ。どうしようもないアプリな気がするが、気のせいだ。

以上

CakePHPではまったこと18(1.2のCookieコンポーネント)

Cookieコンポーネントめ。すごい便利なんですけどね。Sessionコンポーネントと似た感じで使えるし。


if (!$this->Cookie->read('TEST')) {
   $this->Cookie->write('TEST', 'TEST');
}

checkはないみたいなんですけどね。
で、writeの4番目の引数がexpireなんです。3番目は暗号化するかしないか。(デフォルトはtrue:暗号化する)
なもんで


define('COOKIE_EXPIRE', 60*60*24*5);   // 5日有効

$this->Cookie->write('TEST', 'TEST', true, time() + COOKIE_EXPIRE);

みたいにしてたんですわ。
でもぜんぜんクッキーが保存されない。しばらく悩んだ挙句、FirefoxでCookie見ればいいことに気づいた私。見てみたらクッキーあるけど有効期間がセッション中だけになっとる。
なんでこんなことになるんだーと思ってソース見たら、expireの引数に中でtime()足しとった!
うへぇ、と言うことで


$this->Cookie->write('TEST', 'TEST', true, COOKIE_EXPIRE);

で思惑通りになりましたとさ。
あと、標準のままだとクッキーの名前が”CakeCookie[TEST]”になっちゃうので、cake » libs » controller » componentsにあるcookie.phpの


var $name = 'CakeCookie';

を適当に変更しました。
ちなみにSessionで使われるクッキーもほっとくと”CakePHP”になっちゃうけど、これはapp » configのcore.phpに設定項目があります。

あと、CakePHPで作ったといえばこれ↓。
みんなが小説家になるようです。(α版)
なんという宣伝か。

以上

みんなが小説家になるようです。

すごい今さら感があるのですが、
みんなが小説家になるようです。(α版)
を作ってみました。
まあいわゆる↓のサイトにインスパイアされたとでも言うんでしょうが、すげえ遅まき。
「やる夫が小説家になるようです」(http://urasoku.blog106.fc2.com/blog-entry-244.html)

○特徴
1.「カードを使ったお話作り」を自動生成してくれる。
2.カードの意味がすぐ分かる。
3.各項目とかあらすじを保存できる。
4.あらすじのテンプレート(種)を自動生成してくれる。
5.類語辞典がついてる。
以下未実装だが実装予定
6.人名事典がついてる。
7.面白あらすじ投票ランキング(未実装)

とまあこんな感じ。
まだまだα版感たっぷりですが、・・・・
みんなで小説書こうぜ!

以上

Home > PHP Archive

Search
Feeds
Meta
 合計:018989
 今日:0128 昨日:0157

Return to page top